Accepting request 173533 from Base:System

- Fix handle-etc-HOSTNAME.patch to properly set hostname at startup
  when using /etc/HOSTNAME. (forwarded request 173532 from fcrozat)

OBS-URL: https://build.opensuse.org/request/show/173533
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/systemd?expand=0&rev=136
This commit is contained in:
Stephan Kulow 2013-04-26 17:21:58 +00:00 committed by Git OBS Bridge
parent a699b1ca34
commit a0eb8a1c64
14 changed files with 175 additions and 644 deletions

View File

@ -1,129 +0,0 @@
From: Robert Milasan <rmilasan@suse.com>
Date: Thu, 11 Apr 2013 15:39:39 +0200
Subject: Reinstate TIMEOUT handling
Without treating events with timeouts specially some drivers would
cause a 30 seconds stall on boot: .
I also received reports of some drivers not working at all, even
after the timeout.
We will remove this patch when more drivers have been fixed in
the kernel (3.4?).
This reverts 43d5c5f03645c4b842659f9b5bd0ae465e885e92 and
57c6f8ae5f52a6e8ffc66a54966346f733dded39.
---
src/libudev/libudev-device.c | 19 +++++++++++++++++++
src/libudev/libudev-private.h | 1 +
src/udev/udevd.c | 13 ++++++++++---
3 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/src/libudev/libudev-device.c b/src/libudev/libudev-device.c
index 6bb2e41..4fdd242 100644
--- a/src/libudev/libudev-device.c
+++ b/src/libudev/libudev-device.c
@@ -78,6 +78,7 @@ struct udev_device {
struct udev_list tags_list;
unsigned long long int seqnum;
usec_t usec_initialized;
+ int timeout;
int devlink_priority;
int refcount;
dev_t devnum;
@@ -172,6 +173,21 @@ static int udev_device_set_devnum(struct udev_device *udev_device, dev_t devnum)
return 0;
}
+int udev_device_get_timeout(struct udev_device *udev_device)
+{
+ return udev_device->timeout;
+}
+
+static int udev_device_set_timeout(struct udev_device *udev_device, int timeout)
+{
+ char num[32];
+
+ udev_device->timeout = timeout;
+ snprintf(num, sizeof(num), "%u", timeout);
+ udev_device_add_property(udev_device, "TIMEOUT", num);
+ return 0;
+}
+
const char *udev_device_get_devpath_old(struct udev_device *udev_device)
{
return udev_device->devpath_old;
@@ -462,6 +478,8 @@ void udev_device_add_property_from_string_parse(struct udev_device *udev_device,
udev_device_set_devpath_old(udev_device, &property[12]);
} else if (startswith(property, "SEQNUM=")) {
udev_device_set_seqnum(udev_device, strtoull(&property[7], NULL, 10));
+ } else if (startswith(property, "TIMEOUT=")) {
+ udev_device_set_timeout(udev_device, strtoull(&property[8], NULL, 10));
} else if (startswith(property, "IFINDEX=")) {
udev_device_set_ifindex(udev_device, strtoull(&property[8], NULL, 10));
} else if (startswith(property, "DEVMODE=")) {
@@ -653,6 +671,7 @@ struct udev_device *udev_device_new(struct udev *udev)
udev_list_init(udev, &udev_device->sysattr_value_list, true);
udev_list_init(udev, &udev_device->sysattr_list, false);
udev_list_init(udev, &udev_device->tags_list, true);
+ udev_device->timeout = -1;
udev_device->watch_handle = -1;
/* copy global properties */
udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev))
diff --git a/src/libudev/libudev-private.h b/src/libudev/libudev-private.h
index 54c51ac..d2124ea 100644
--- a/src/libudev/libudev-private.h
+++ b/src/libudev/libudev-private.h
@@ -77,6 +77,7 @@ const char *udev_device_get_id_filename(struct udev_device *udev_device);
void udev_device_set_is_initialized(struct udev_device *udev_device);
int udev_device_add_tag(struct udev_device *udev_device, const char *tag);
void udev_device_cleanup_tags_list(struct udev_device *udev_device);
+int udev_device_get_timeout(struct udev_device *udev_device);
usec_t udev_device_get_usec_initialized(struct udev_device *udev_device);
void udev_device_set_usec_initialized(struct udev_device *udev_device, usec_t usec_initialized);
int udev_device_get_devlink_priority(struct udev_device *udev_device);
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index 7d13b4f..9be1931 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -391,7 +391,7 @@ out:
}
}
-static void event_run(struct event *event)
+static void event_run(struct event *event, bool force)
{
struct udev_list_node *loop;
@@ -417,7 +417,7 @@ static void event_run(struct event *event)
return;
}
- if (children >= children_max) {
+ if (!force && children >= children_max) {
if (children_max > 1)
log_debug("maximum number (%i) of children reached\n", children);
return;
@@ -455,6 +455,13 @@ static int event_queue_insert(struct udev_device *dev)
event->state = EVENT_QUEUED;
udev_list_node_append(&event->node, &event_list);
+
+ /* run all events with a timeout set immediately */
+ if (udev_device_get_timeout(dev) > 0) {
+ event_run(event, true);
+ return 0;
+ }
+
return 0;
}
@@ -566,7 +573,7 @@ static void event_queue_start(struct udev *udev)
if (is_devpath_busy(event))
continue;
- event_run(event);
+ event_run(event, false);
}
}

View File

@ -7,11 +7,11 @@ udevd race for netlink events (bnc#774646)
src/udev/udevd.c | 2 ++ src/udev/udevd.c | 2 ++
1 file changed, 2 insertions(+) 1 file changed, 2 insertions(+)
diff --git a/src/udev/udevd.c b/src/udev/udevd.c Index: systemd-202/src/udev/udevd.c
index 9be1931..d0c4c72 100644 ===================================================================
--- a/src/udev/udevd.c --- systemd-202.orig/src/udev/udevd.c
+++ b/src/udev/udevd.c +++ systemd-202/src/udev/udevd.c
@@ -1414,6 +1414,8 @@ int main(int argc, char *argv[]) @@ -1407,6 +1407,8 @@ int main(int argc, char *argv[])
dev = udev_monitor_receive_device(monitor); dev = udev_monitor_receive_device(monitor);
if (dev != NULL) { if (dev != NULL) {
udev_device_set_usec_initialized(dev, now(CLOCK_MONOTONIC)); udev_device_set_usec_initialized(dev, now(CLOCK_MONOTONIC));

View File

@ -7,11 +7,11 @@ fix modules.devname path, it isn't in /usr.
src/udev/udevd.c | 2 +- src/udev/udevd.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-) 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/udev/udevd.c b/src/udev/udevd.c Index: systemd-202/src/udev/udevd.c
index d0c4c72..599cd3b 100644 ===================================================================
--- a/src/udev/udevd.c --- systemd-202.orig/src/udev/udevd.c
+++ b/src/udev/udevd.c +++ systemd-202/src/udev/udevd.c
@@ -831,7 +831,7 @@ static void static_dev_create_from_modules(struct udev *udev) @@ -824,7 +824,7 @@ static void static_dev_create_from_modul
return; return;
} }

View File

@ -1,22 +0,0 @@
From: Robert Milasan <rmilasan@suse.com>
Date: Tue, 7 Aug 2012 08:34:49 +0000
Subject: udev fix sg autoload regression
Fix regression in udev where sg driver is no longer loaded for disc
events. Will need a non-udev solution for 12.3 (bnc#761109).
---
rules/80-drivers.rules | 1 +
1 file changed, 1 insertion(+)
diff --git a/rules/80-drivers.rules b/rules/80-drivers.rules
index 50523e4..b863532 100644
--- a/rules/80-drivers.rules
+++ b/rules/80-drivers.rules
@@ -7,6 +7,7 @@ SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN{builtin}="kmod load tifm_sd"
SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="MS", RUN{builtin}="kmod load tifm_ms"
SUBSYSTEM=="memstick", RUN{builtin}="kmod load ms_block mspro_block"
SUBSYSTEM=="i2o", RUN{builtin}="kmod load i2o_block"
+SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST!="[module/sg]", IMPORT{builtin}="kmod load sg"
SUBSYSTEM=="module", KERNEL=="parport_pc", RUN{builtin}="kmod load ppdev"
KERNEL=="mtd*ro", ENV{MTD_FTL}=="smartmedia", RUN{builtin}="kmod load sm_ftl"

View File

@ -1,421 +0,0 @@
From: Robert Milasan <rmilasan@suse.com>
Date: Wed, 20 Mar 2013 10:14:59 +0000
Subject: re-add persistent net
udev: re-add persistent network rules (bnc#809843).
---
Makefile.am | 10 +-
.../75-persistent-net-generator.rules | 102 +++++++++++++++
src/udev/rule_generator/rule_generator.functions | 113 ++++++++++++++++
src/udev/rule_generator/write_net_rules | 145 +++++++++++++++++++++
4 files changed, 369 insertions(+), 1 deletion(-)
create mode 100644 src/udev/rule_generator/75-persistent-net-generator.rules
create mode 100644 src/udev/rule_generator/rule_generator.functions
create mode 100644 src/udev/rule_generator/write_net_rules
diff --git a/Makefile.am b/Makefile.am
index 10609f3..f5e4159 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -2287,6 +2287,14 @@ EXTRA_DIST += \
src/gudev/seed-example.js
# ------------------------------------------------------------------------------
+dist_udevhome_SCRIPTS = \
+ src/udev/rule_generator/rule_generator.functions \
+ src/udev/rule_generator/write_net_rules
+
+dist_udevrules_DATA += \
+ src/udev/rule_generator/75-persistent-net-generator.rules
+
+# ------------------------------------------------------------------------------
if ENABLE_KEYMAP
keymap_SOURCES = \
src/udev/keymap/keymap.c
@@ -2314,7 +2322,7 @@ dist_udevrules_DATA += \
src/udev/keymap/95-keymap.rules \
src/udev/keymap/95-keyboard-force-release.rules
-dist_udevhome_SCRIPTS = \
+dist_udevhome_SCRIPTS += \
src/udev/keymap/findkeyboards \
src/udev/keymap/keyboard-force-release.sh
diff --git a/src/udev/rule_generator/75-persistent-net-generator.rules b/src/udev/rule_generator/75-persistent-net-generator.rules
new file mode 100644
index 0000000..4f80573
--- /dev/null
+++ b/src/udev/rule_generator/75-persistent-net-generator.rules
@@ -0,0 +1,102 @@
+# do not edit this file, it will be overwritten on update
+
+# these rules generate rules for persistent network device naming
+#
+# variables used to communicate:
+# MATCHADDR MAC address used for the match
+# MATCHID bus_id used for the match
+# MATCHDRV driver name used for the match
+# MATCHIFTYPE interface type match
+# COMMENT comment to add to the generated rule
+# INTERFACE_NAME requested name supplied by external tool
+# INTERFACE_NEW new interface name returned by rule writer
+
+ACTION!="add", GOTO="persistent_net_generator_end"
+SUBSYSTEM!="net", GOTO="persistent_net_generator_end"
+
+# ignore the interface if a name has already been set
+NAME=="?*", GOTO="persistent_net_generator_end"
+
+# device name whitelist
+KERNEL!="eth*|ath*|wlan*[0-9]|msh*|ra*|sta*|ctc*|lcs*|hsi*", GOTO="persistent_net_generator_end"
+
+# ignore Xen virtual interfaces
+SUBSYSTEMS=="xen", GOTO="persistent_net_generator_end"
+
+# read MAC address
+ENV{MATCHADDR}="$attr{address}"
+
+# match interface type
+ENV{MATCHIFTYPE}="$attr{type}"
+
+# ignore KVM virtual interfaces
+ENV{MATCHADDR}=="52:54:00:*", GOTO="persistent_net_generator_end"
+# ignore VMWare virtual interfaces
+ENV{MATCHADDR}=="00:0c:29:*|00:50:56:*", GOTO="persistent_net_generator_end"
+# ignore Hyper-V virtual interfaces
+ENV{MATCHADDR}=="00:15:5d:*", GOTO="persistent_net_generator_end"
+
+# These vendors are known to violate the local MAC address assignment scheme
+# Interlan, DEC (UNIBUS or QBUS), Apollo, Cisco, Racal-Datacom
+ENV{MATCHADDR}=="02:07:01:*", GOTO="globally_administered_whitelist"
+# 3Com
+ENV{MATCHADDR}=="02:60:60:*", GOTO="globally_administered_whitelist"
+# 3Com IBM PC; Imagen; Valid; Cisco; Apple
+ENV{MATCHADDR}=="02:60:8c:*", GOTO="globally_administered_whitelist"
+# Intel
+ENV{MATCHADDR}=="02:a0:c9:*", GOTO="globally_administered_whitelist"
+# Olivetti
+ENV{MATCHADDR}=="02:aa:3c:*", GOTO="globally_administered_whitelist"
+# CMC Masscomp; Silicon Graphics; Prime EXL
+ENV{MATCHADDR}=="02:cf:1f:*", GOTO="globally_administered_whitelist"
+# Prominet Corporation Gigabit Ethernet Switch
+ENV{MATCHADDR}=="02:e0:3b:*", GOTO="globally_administered_whitelist"
+# BTI (Bus-Tech, Inc.) IBM Mainframes
+ENV{MATCHADDR}=="02:e6:d3:*", GOTO="globally_administered_whitelist"
+# Realtek
+ENV{MATCHADDR}=="52:54:00:*", GOTO="globally_administered_whitelist"
+# Novell 2000
+ENV{MATCHADDR}=="52:54:4c:*", GOTO="globally_administered_whitelist"
+# Realtec
+ENV{MATCHADDR}=="52:54:ab:*", GOTO="globally_administered_whitelist"
+# Kingston Technologies
+ENV{MATCHADDR}=="e2:0c:0f:*", GOTO="globally_administered_whitelist"
+# Xensource
+ENV{MATCHADDR}=="00:16:3e:*", GOTO="globally_administered_whitelist"
+
+# match interface dev_id
+ATTR{dev_id}=="?*", ENV{MATCHDEVID}="$attr{dev_id}"
+
+# do not use "locally administered" MAC address
+ENV{MATCHADDR}=="?[2367abef]:*", ENV{MATCHADDR}=""
+
+# do not use empty address
+ENV{MATCHADDR}=="00:00:00:00:00:00", ENV{MATCHADDR}=""
+
+LABEL="globally_administered_whitelist"
+
+# build comment line for generated rule:
+SUBSYSTEMS=="pci", ENV{COMMENT}="PCI device $attr{vendor}:$attr{device} ($driver)"
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="?*", ENV{COMMENT}="USB device 0x$attr{idVendor}:0x$attr{idProduct} ($driver)"
+SUBSYSTEMS=="pcmcia", ENV{COMMENT}="PCMCIA device $attr{card_id}:$attr{manf_id} ($driver)"
+SUBSYSTEMS=="ieee1394", ENV{COMMENT}="Firewire device $attr{host_id})"
+
+# ibmveth likes to use "locally administered" MAC addresses
+DRIVERS=="ibmveth", ENV{MATCHADDR}="$attr{address}", ENV{COMMENT}="ibmveth ($id)"
+
+# S/390 uses id matches only, do not use MAC address match
+SUBSYSTEMS=="ccwgroup", ENV{COMMENT}="S/390 $driver device at $id", ENV{MATCHID}="$id", ENV{MATCHDRV}="$driver", ENV{MATCHADDR}=""
+
+# see if we got enough data to create a rule
+ENV{MATCHADDR}=="", ENV{MATCHID}=="", ENV{INTERFACE_NAME}=="", GOTO="persistent_net_generator_end"
+
+# default comment
+ENV{COMMENT}=="", ENV{COMMENT}="net device ($attr{driver})"
+
+# write rule
+DRIVERS=="?*", IMPORT{program}="write_net_rules"
+
+# rename interface if needed
+ENV{INTERFACE_NEW}=="?*", NAME="$env{INTERFACE_NEW}"
+
+LABEL="persistent_net_generator_end"
diff --git a/src/udev/rule_generator/rule_generator.functions b/src/udev/rule_generator/rule_generator.functions
new file mode 100644
index 0000000..087bc34
--- /dev/null
+++ b/src/udev/rule_generator/rule_generator.functions
@@ -0,0 +1,113 @@
+# functions used by the udev rule generator
+
+# Copyright (C) 2006 Marco d'Itri <md@Linux.IT>
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+PATH='/usr/bin:/bin:/usr/sbin:/sbin'
+
+# Read a single line from file $1 in the $DEVPATH directory.
+# The function must not return an error even if the file does not exist.
+sysread() {
+ local file="$1"
+ [ -e "/sys$DEVPATH/$file" ] || return 0
+ local value
+ read value < "/sys$DEVPATH/$file" || return 0
+ echo "$value"
+}
+
+sysreadlink() {
+ local file="$1"
+ [ -e "/sys$DEVPATH/$file" ] || return 0
+ readlink -f /sys$DEVPATH/$file 2> /dev/null || true
+}
+
+# Return true if a directory is writeable.
+writeable() {
+ if ln -s test-link $1/.is-writeable 2> /dev/null; then
+ rm -f $1/.is-writeable
+ return 0
+ else
+ return 1
+ fi
+}
+
+# Create a lock file for the current rules file.
+lock_rules_file() {
+ RUNDIR="/run/udev"
+ [ -e "$RUNDIR" ] || return 0
+
+ RULES_LOCK="$RUNDIR/.lock-${RULES_FILE##*/}"
+
+ retry=30
+ while ! mkdir $RULES_LOCK 2> /dev/null; do
+ if [ $retry -eq 0 ]; then
+ echo "Cannot lock $RULES_FILE!" >&2
+ exit 2
+ fi
+ sleep 1
+ retry=$(($retry - 1))
+ done
+}
+
+unlock_rules_file() {
+ [ "$RULES_LOCK" ] || return 0
+ rmdir $RULES_LOCK || true
+}
+
+# Choose the real rules file if it is writeable or a temporary file if not.
+# Both files should be checked later when looking for existing rules.
+choose_rules_file() {
+ RUNDIR="/run/udev"
+ local tmp_rules_file="$RUNDIR/tmp-rules--${RULES_FILE##*/}"
+ [ -e "$RULES_FILE" -o -e "$tmp_rules_file" ] || PRINT_HEADER=1
+
+ if writeable ${RULES_FILE%/*}; then
+ RO_RULES_FILE='/dev/null'
+ else
+ RO_RULES_FILE=$RULES_FILE
+ RULES_FILE=$tmp_rules_file
+ fi
+}
+
+# Return the name of the first free device.
+raw_find_next_available() {
+ local links="$1"
+
+ local basename=${links%%[ 0-9]*}
+ local max=-1
+ for name in $links; do
+ local num=${name#$basename}
+ [ "$num" ] || num=0
+ [ $num -gt $max ] && max=$num
+ done
+
+ local max=$(($max + 1))
+ # "name0" actually is just "name"
+ [ $max -eq 0 ] && return
+ echo "$max"
+}
+
+# Find all rules matching a key (with action) and a pattern.
+find_all_rules() {
+ local key="$1"
+ local linkre="$2"
+ local match="$3"
+
+ local search='.*[[:space:],]'"$key"'"('"$linkre"')".*'
+ echo $(sed -n -r -e 's/^#.*//' -e "${match}s/${search}/\1/p" \
+ $RO_RULES_FILE \
+ $([ -e $RULES_FILE ] && echo $RULES_FILE) \
+ 2>/dev/null)
+}
diff --git a/src/udev/rule_generator/write_net_rules b/src/udev/rule_generator/write_net_rules
new file mode 100644
index 0000000..fad1cc5
--- /dev/null
+++ b/src/udev/rule_generator/write_net_rules
@@ -0,0 +1,145 @@
+#!/bin/sh -e
+
+# This script is run to create persistent network device naming rules
+# based on properties of the device.
+# If the interface needs to be renamed, INTERFACE_NEW=<name> will be printed
+# on stdout to allow udev to IMPORT it.
+
+# variables used to communicate:
+# MATCHADDR MAC address used for the match
+# MATCHID bus_id used for the match
+# MATCHDEVID dev_id used for the match
+# MATCHDRV driver name used for the match
+# MATCHIFTYPE interface type match
+# COMMENT comment to add to the generated rule
+# INTERFACE_NAME requested name supplied by external tool
+# INTERFACE_NEW new interface name returned by rule writer
+
+# Copyright (C) 2006 Marco d'Itri <md@Linux.IT>
+# Copyright (C) 2007 Kay Sievers <kay.sievers@vrfy.org>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# debug, if UDEV_LOG=<debug>
+if [ -n "$UDEV_LOG" ]; then
+ if [ "$UDEV_LOG" -ge 7 ]; then
+ set -x
+ fi
+fi
+
+RULES_FILE='/etc/udev/rules.d/70-persistent-net.rules'
+
+if [ -e /usr/lib/udev/rule_generator.functions ]; then
+ . /usr/lib/udev/rule_generator.functions
+else
+ . /lib/udev/rule_generator.functions
+fi
+
+interface_name_taken() {
+ local value="$(find_all_rules 'NAME=' $INTERFACE)"
+ if [ "$value" ]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+find_next_available() {
+ raw_find_next_available "$(find_all_rules 'NAME=' "$1")"
+}
+
+write_rule() {
+ local match="$1"
+ local name="$2"
+ local comment="$3"
+
+ {
+ if [ "$PRINT_HEADER" ]; then
+ PRINT_HEADER=
+ echo "# This file was automatically generated by the $0"
+ echo "# program, run by the persistent-net-generator.rules rules file."
+ echo "#"
+ echo "# You can modify it, as long as you keep each rule on a single"
+ echo "# line, and change only the value of the NAME= key."
+ fi
+
+ echo ""
+ [ "$comment" ] && echo "# $comment"
+ echo "SUBSYSTEM==\"net\", ACTION==\"add\"$match, NAME=\"$name\""
+ } >> $RULES_FILE
+}
+
+if [ -z "$INTERFACE" ]; then
+ echo "missing \$INTERFACE" >&2
+ exit 1
+fi
+
+# Prevent concurrent processes from modifying the file at the same time.
+lock_rules_file
+
+# Check if the rules file is writeable.
+choose_rules_file
+
+# the DRIVERS key is needed to not match bridges and VLAN sub-interfaces
+if [ "$MATCHADDR" ]; then
+ match="$match, DRIVERS==\"?*\", ATTR{address}==\"$MATCHADDR\""
+fi
+
+if [ "$MATCHDRV" ]; then
+ match="$match, DRIVERS==\"$MATCHDRV\""
+fi
+
+if [ "$MATCHDEVID" ]; then
+ match="$match, ATTR{dev_id}==\"$MATCHDEVID\""
+fi
+
+if [ "$MATCHID" ]; then
+ match="$match, KERNELS==\"$MATCHID\""
+fi
+
+if [ "$MATCHIFTYPE" ]; then
+ match="$match, ATTR{type}==\"$MATCHIFTYPE\""
+fi
+
+if [ -z "$match" ]; then
+ echo "missing valid match" >&2
+ unlock_rules_file
+ exit 1
+fi
+
+basename=${INTERFACE%%[0-9]*}
+match="$match, KERNEL==\"$basename*\""
+
+if [ "$INTERFACE_NAME" ]; then
+ # external tools may request a custom name
+ COMMENT="$COMMENT (custom name provided by external tool)"
+ if [ "$INTERFACE_NAME" != "$INTERFACE" ]; then
+ INTERFACE=$INTERFACE_NAME;
+ echo "INTERFACE_NEW=$INTERFACE"
+ fi
+else
+ # if a rule using the current name already exists, find a new name
+ if interface_name_taken; then
+ INTERFACE="$basename$(find_next_available "$basename[0-9]*")"
+ # prevent INTERFACE from being "eth" instead of "eth0"
+ [ "$INTERFACE" = "${INTERFACE%%[ \[\]0-9]*}" ] && INTERFACE=${INTERFACE}0
+ echo "INTERFACE_NEW=$INTERFACE"
+ fi
+fi
+
+write_rule "$match" "$INTERFACE" "$COMMENT"
+
+unlock_rules_file
+
+exit 0

View File

@ -4,8 +4,43 @@ Subject: handle /etc/HOSTNAME
(bnc#803653) (bnc#803653)
--- ---
src/core/hostname-setup.c | 22 +++++++++++++++++-----
src/hostname/hostnamed.c | 12 +++++++++++- src/hostname/hostnamed.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-) 2 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/src/core/hostname-setup.c b/src/core/hostname-setup.c
index ac508af..15d206c 100644
--- a/src/core/hostname-setup.c
+++ b/src/core/hostname-setup.c
@@ -61,12 +61,24 @@ int hostname_setup(void) {
r = read_and_strip_hostname("/etc/hostname", &b);
if (r < 0) {
- if (r == -ENOENT)
- enoent = true;
- else
+ if (r == -ENOENT) {
+ /* use SUSE fallback */
+ r = read_and_strip_hostname("/etc/HOSTNAME", &b);
+ if (r < 0) {
+ if (r == -ENOENT)
+ enoent = true;
+ else
+ log_warning("Failed to read configured hostname: %s", strerror(-r));
+ hn = NULL;
+ }
+ else
+ hn = b;
+
+ }
+ else {
log_warning("Failed to read configured hostname: %s", strerror(-r));
-
- hn = NULL;
+ hn = NULL;
+ }
} else
hn = b;
diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c
index c7f454c..cfbd706 100644 index c7f454c..cfbd706 100644

View File

@ -1,3 +1,30 @@
-------------------------------------------------------------------
Fri Apr 26 16:37:28 CEST 2013 - fcrozat@suse.com
- Fix handle-etc-HOSTNAME.patch to properly set hostname at startup
when using /etc/HOSTNAME.
-------------------------------------------------------------------
Thu Apr 25 08:19:30 UTC 2013 - rmilasan@suse.com
- Rename remaning udev patches (clean-up).
- Generate %{_libexecdir}/modules-load.d/sg.conf so we load sg module at
boot time not from udev (bnc#761109).
- Drop unused patches:
1001-Reinstate-TIMEOUT-handling.patch
1005-udev-fix-sg-autoload-regression.patch
1026-re-add-persistent-net.patch
-------------------------------------------------------------------
Tue Apr 23 14:58:47 CEST 2013 - fcrozat@suse.com
- Use drop-in file to fix bnc#804158.
-------------------------------------------------------------------
Tue Apr 23 12:44:16 UTC 2013 - coolo@suse.com
- add some more conflicts to make bootstrap work
------------------------------------------------------------------- -------------------------------------------------------------------
Mon Apr 22 09:48:22 UTC 2013 - fcrozat@suse.com Mon Apr 22 09:48:22 UTC 2013 - fcrozat@suse.com

View File

@ -81,6 +81,7 @@ BuildRequires: pkgconfig(usbutils) >= 0.82
%if 0%{?bootstrap} %if 0%{?bootstrap}
Requires: this-is-only-for-build-envs Requires: this-is-only-for-build-envs
Conflicts: systemd Conflicts: systemd
Conflicts: kiwi
%else %else
# the buildignore is important for bootstrapping # the buildignore is important for bootstrapping
#!BuildIgnore: udev #!BuildIgnore: udev
@ -169,24 +170,18 @@ Patch25: Forward-suspend-hibernate-calls-to-pm-utils.patch
Patch38: rules-add-lid-switch-of-ARM-based-Chromebook-as-a-power-sw.patch Patch38: rules-add-lid-switch-of-ARM-based-Chromebook-as-a-power-sw.patch
# udev patches # udev patches
# PATCH-FIX-OPENSUSE 1001-Reinstate-TIMEOUT-handling.patch # PATCH-FIX-OPENSUSE 1001-re-enable-by_path-links-for-ata-devices.patch
Patch1001: 1001-Reinstate-TIMEOUT-handling.patch Patch1001: 1001-re-enable-by_path-links-for-ata-devices.patch
# PATCH-FIX-OPENSUSE 1002-re-enable-by_path-links-for-ata-devices.patch # PATCH-FIX-OPENSUSE 1002-rules-create-by-id-scsi-links-for-ATA-devices.patch
Patch1002: 1002-re-enable-by_path-links-for-ata-devices.patch Patch1002: 1002-rules-create-by-id-scsi-links-for-ATA-devices.patch
# PATCH-FIX-OPENSUSE 1003-rules-create-by-id-scsi-links-for-ATA-devices.patch # PATCH-FIX-OPENSUSE 1003-udev-netlink-null-rules.patch
Patch1003: 1003-rules-create-by-id-scsi-links-for-ATA-devices.patch Patch1003: 1003-udev-netlink-null-rules.patch
# PATCH-FIX-OPENSUSE 1004-udev-netlink-null-rules.patch # PATCH-FIX-OPENSUSE 1004-fix-devname-prefix.patch fcrozat@suse.com -- fix modules.devname path, it isn't in /usr
Patch1004: 1004-udev-netlink-null-rules.patch Patch1004: 1004-fix-devname-prefix.patch
# PATCH-FIX-OPENSUSE 1005-udev-fix-sg-autoload-regression.patch # PATCH-FIX-OPENSUSE 1005-create-default-links-for-primary-cd_dvd-drive.patch
Patch1005: 1005-udev-fix-sg-autoload-regression.patch Patch1005: 1005-create-default-links-for-primary-cd_dvd-drive.patch
# PATCH-FIX-OPENSUSE 1007-fix-devname-prefix.patch fcrozat@suse.com -- fix modules.devname path, it isn't in /usr # PATCH-FIX-OPENSUSE 1006-udev-always-rename-network.patch
Patch1007: 1007-fix-devname-prefix.patch Patch1006: 1006-udev-always-rename-network.patch
# PATCH-FIX-OPENSUSE 1021-create-default-links-for-primary-cd_dvd-drive.patch
Patch1021: 1021-create-default-links-for-primary-cd_dvd-drive.patch
# PATCH-FIX-OPENSUSE 1026-re-add-persistent-net.patch
Patch1026: 1026-re-add-persistent-net.patch
# PATCH-FIX-OPENSUSE 1027-udev-always-rename-network.patch
Patch1027: 1027-udev-always-rename-network.patch
%description %description
Systemd is a system and service manager, compatible with SysV and LSB Systemd is a system and service manager, compatible with SysV and LSB
@ -205,6 +200,9 @@ Summary: Development headers for systemd
License: LGPL-2.1+ License: LGPL-2.1+
Group: Development/Libraries/C and C++ Group: Development/Libraries/C and C++
Requires: %{name} = %{version} Requires: %{name} = %{version}
%if 0%{?bootstrap}
Conflicts: systemd-devel
%endif
%description devel %description devel
Development headers and auxiliary files for developing applications for systemd. Development headers and auxiliary files for developing applications for systemd.
@ -237,7 +235,7 @@ Conflicts: ConsoleKit < 0.4.1
Requires: filesystem Requires: filesystem
%if 0%{?bootstrap} %if 0%{?bootstrap}
Provides: udev = %{version} Provides: udev = %{version}
Conflicts: libudev%{udev_major} = %{version} Conflicts: libudev%{udev_major}
Conflicts: udev Conflicts: udev
%endif %endif
@ -257,6 +255,7 @@ Group: System/Libraries
Requires: %{udevpkgname} >= %{version}-%{release} Requires: %{udevpkgname} >= %{version}-%{release}
%if 0%{?bootstrap} %if 0%{?bootstrap}
Conflicts: libudev%{udev_major} Conflicts: libudev%{udev_major}
Conflicts: kiwi
%endif %endif
%description -n lib%{udevpkgname}%{udev_major} %description -n lib%{udevpkgname}%{udev_major}
@ -365,10 +364,7 @@ cp %{SOURCE7} m4/
%patch1003 -p1 %patch1003 -p1
%patch1004 -p1 %patch1004 -p1
%patch1005 -p1 %patch1005 -p1
%patch1007 -p1 %patch1006 -p1
%patch1021 -p1
%patch1026 -p1
%patch1027 -p1
#systemd #systemd
%patch0 -p1 %patch0 -p1
@ -507,6 +503,13 @@ ln -s systemd-random-seed-load.service %{buildroot}/%{_prefix}/lib/systemd/syste
# don't mount /tmp as tmpfs for now # don't mount /tmp as tmpfs for now
rm %{buildroot}/%{_prefix}/lib/systemd/system/local-fs.target.wants/tmp.mount rm %{buildroot}/%{_prefix}/lib/systemd/system/local-fs.target.wants/tmp.mount
# create %{_libexecdir}/modules-load.d
mkdir -p %{buildroot}%{_libexecdir}/modules-load.d
cat << EOF > %{buildroot}%{_libexecdir}/modules-load.d/sg.conf
# load sg module at boot time
sg
EOF
# To avoid making life hard for Factory developers, don't package the # To avoid making life hard for Factory developers, don't package the
# kernel.core_pattern setting until systemd-coredump is a part of an actual # kernel.core_pattern setting until systemd-coredump is a part of an actual
# systemd release and it's made clear how to get the core dumps out of the # systemd release and it's made clear how to get the core dumps out of the
@ -549,10 +552,13 @@ mkdir -p %{buildroot}%{_prefix}/lib/systemd/system-sleep/
mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/default.target.wants mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/default.target.wants
mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/dbus.target.wants mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/dbus.target.wants
src="%buildroot/%_libexecdir/systemd/system/getty@.service" # create drop-in to prevent tty1 to be cleared (bnc#804158)
dst="${src/@/@tty1}" mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/getty@tty1.service.d/
cp "$src" "$dst" echo << EOF > %{buildroot}%{_prefix}/lib/systemd/system/getty@tty1.service.d/noclear.conf
perl -i -pe 's{^# the VT is cleared.*}{}i;s{(^TTYVTDisallocate=.*)}{}' "$dst" [Service]
# ensure tty1 isn't cleared (bnc#804158)
TTYVTDisallocate=no
EOF
%fdupes -s %{buildroot}%{_mandir} %fdupes -s %{buildroot}%{_mandir}
@ -716,7 +722,7 @@ fi
%endif %endif
%clean %clean
# rm -rf %{buildroot} rm -rf %{buildroot}
%files %files
%defattr(-,root,root) %defattr(-,root,root)
@ -787,6 +793,8 @@ fi
%dir %{_prefix}/lib/systemd/system-sleep/ %dir %{_prefix}/lib/systemd/system-sleep/
%dir %{_prefix}/lib/systemd/system/default.target.wants %dir %{_prefix}/lib/systemd/system/default.target.wants
%dir %{_prefix}/lib/systemd/system/dbus.target.wants %dir %{_prefix}/lib/systemd/system/dbus.target.wants
%dir %{_prefix}/lib/systemd/system/getty@tty1.service.d
%{_prefix}/lib/systemd/system/getty@tty1.service.d/noclear.conf
%if ! 0%{?bootstrap} %if ! 0%{?bootstrap}
%{_prefix}/lib/systemd/system-generators/systemd-cryptsetup-generator %{_prefix}/lib/systemd/system-generators/systemd-cryptsetup-generator
%endif %endif
@ -799,6 +807,7 @@ fi
%dir %{_libexecdir}/modules-load.d %dir %{_libexecdir}/modules-load.d
%dir %{_sysconfdir}/modules-load.d %dir %{_sysconfdir}/modules-load.d
%{_libexecdir}/modules-load.d/sg.conf
%dir %{_libexecdir}/tmpfiles.d %dir %{_libexecdir}/tmpfiles.d
%dir %{_sysconfdir}/tmpfiles.d %dir %{_sysconfdir}/tmpfiles.d
@ -942,8 +951,6 @@ fi
%{_prefix}/lib/udev/scsi_id %{_prefix}/lib/udev/scsi_id
%{_prefix}/lib/udev/v4l_id %{_prefix}/lib/udev/v4l_id
%{_prefix}/lib/udev/write_dev_root_rule %{_prefix}/lib/udev/write_dev_root_rule
%{_prefix}/lib/udev/write_net_rules
%{_prefix}/lib/udev/rule_generator.functions
%dir %{_prefix}/lib/udev/keymaps %dir %{_prefix}/lib/udev/keymaps
%{_prefix}/lib/udev/keymaps/* %{_prefix}/lib/udev/keymaps/*
%{_prefix}/lib/udev/keyboard-force-release.sh %{_prefix}/lib/udev/keyboard-force-release.sh

View File

@ -1,3 +1,30 @@
-------------------------------------------------------------------
Fri Apr 26 16:37:28 CEST 2013 - fcrozat@suse.com
- Fix handle-etc-HOSTNAME.patch to properly set hostname at startup
when using /etc/HOSTNAME.
-------------------------------------------------------------------
Thu Apr 25 08:19:30 UTC 2013 - rmilasan@suse.com
- Rename remaning udev patches (clean-up).
- Generate %{_libexecdir}/modules-load.d/sg.conf so we load sg module at
boot time not from udev (bnc#761109).
- Drop unused patches:
1001-Reinstate-TIMEOUT-handling.patch
1005-udev-fix-sg-autoload-regression.patch
1026-re-add-persistent-net.patch
-------------------------------------------------------------------
Tue Apr 23 14:58:47 CEST 2013 - fcrozat@suse.com
- Use drop-in file to fix bnc#804158.
-------------------------------------------------------------------
Tue Apr 23 12:44:16 UTC 2013 - coolo@suse.com
- add some more conflicts to make bootstrap work
------------------------------------------------------------------- -------------------------------------------------------------------
Mon Apr 22 09:48:22 UTC 2013 - fcrozat@suse.com Mon Apr 22 09:48:22 UTC 2013 - fcrozat@suse.com

View File

@ -76,6 +76,7 @@ BuildRequires: pkgconfig(usbutils) >= 0.82
%if 0%{?bootstrap} %if 0%{?bootstrap}
Requires: this-is-only-for-build-envs Requires: this-is-only-for-build-envs
Conflicts: systemd Conflicts: systemd
Conflicts: kiwi
%else %else
# the buildignore is important for bootstrapping # the buildignore is important for bootstrapping
#!BuildIgnore: udev #!BuildIgnore: udev
@ -164,24 +165,18 @@ Patch25: Forward-suspend-hibernate-calls-to-pm-utils.patch
Patch38: rules-add-lid-switch-of-ARM-based-Chromebook-as-a-power-sw.patch Patch38: rules-add-lid-switch-of-ARM-based-Chromebook-as-a-power-sw.patch
# udev patches # udev patches
# PATCH-FIX-OPENSUSE 1001-Reinstate-TIMEOUT-handling.patch # PATCH-FIX-OPENSUSE 1001-re-enable-by_path-links-for-ata-devices.patch
Patch1001: 1001-Reinstate-TIMEOUT-handling.patch Patch1001: 1001-re-enable-by_path-links-for-ata-devices.patch
# PATCH-FIX-OPENSUSE 1002-re-enable-by_path-links-for-ata-devices.patch # PATCH-FIX-OPENSUSE 1002-rules-create-by-id-scsi-links-for-ATA-devices.patch
Patch1002: 1002-re-enable-by_path-links-for-ata-devices.patch Patch1002: 1002-rules-create-by-id-scsi-links-for-ATA-devices.patch
# PATCH-FIX-OPENSUSE 1003-rules-create-by-id-scsi-links-for-ATA-devices.patch # PATCH-FIX-OPENSUSE 1003-udev-netlink-null-rules.patch
Patch1003: 1003-rules-create-by-id-scsi-links-for-ATA-devices.patch Patch1003: 1003-udev-netlink-null-rules.patch
# PATCH-FIX-OPENSUSE 1004-udev-netlink-null-rules.patch # PATCH-FIX-OPENSUSE 1004-fix-devname-prefix.patch fcrozat@suse.com -- fix modules.devname path, it isn't in /usr
Patch1004: 1004-udev-netlink-null-rules.patch Patch1004: 1004-fix-devname-prefix.patch
# PATCH-FIX-OPENSUSE 1005-udev-fix-sg-autoload-regression.patch # PATCH-FIX-OPENSUSE 1005-create-default-links-for-primary-cd_dvd-drive.patch
Patch1005: 1005-udev-fix-sg-autoload-regression.patch Patch1005: 1005-create-default-links-for-primary-cd_dvd-drive.patch
# PATCH-FIX-OPENSUSE 1007-fix-devname-prefix.patch fcrozat@suse.com -- fix modules.devname path, it isn't in /usr # PATCH-FIX-OPENSUSE 1006-udev-always-rename-network.patch
Patch1007: 1007-fix-devname-prefix.patch Patch1006: 1006-udev-always-rename-network.patch
# PATCH-FIX-OPENSUSE 1021-create-default-links-for-primary-cd_dvd-drive.patch
Patch1021: 1021-create-default-links-for-primary-cd_dvd-drive.patch
# PATCH-FIX-OPENSUSE 1026-re-add-persistent-net.patch
Patch1026: 1026-re-add-persistent-net.patch
# PATCH-FIX-OPENSUSE 1027-udev-always-rename-network.patch
Patch1027: 1027-udev-always-rename-network.patch
%description %description
Systemd is a system and service manager, compatible with SysV and LSB Systemd is a system and service manager, compatible with SysV and LSB
@ -200,6 +195,9 @@ Summary: Development headers for systemd
License: LGPL-2.1+ License: LGPL-2.1+
Group: Development/Libraries/C and C++ Group: Development/Libraries/C and C++
Requires: %{name} = %{version} Requires: %{name} = %{version}
%if 0%{?bootstrap}
Conflicts: systemd-devel
%endif
%description devel %description devel
Development headers and auxiliary files for developing applications for systemd. Development headers and auxiliary files for developing applications for systemd.
@ -232,7 +230,7 @@ Conflicts: ConsoleKit < 0.4.1
Requires: filesystem Requires: filesystem
%if 0%{?bootstrap} %if 0%{?bootstrap}
Provides: udev = %{version} Provides: udev = %{version}
Conflicts: libudev%{udev_major} = %{version} Conflicts: libudev%{udev_major}
Conflicts: udev Conflicts: udev
%endif %endif
@ -252,6 +250,7 @@ Group: System/Libraries
Requires: %{udevpkgname} >= %{version}-%{release} Requires: %{udevpkgname} >= %{version}-%{release}
%if 0%{?bootstrap} %if 0%{?bootstrap}
Conflicts: libudev%{udev_major} Conflicts: libudev%{udev_major}
Conflicts: kiwi
%endif %endif
%description -n lib%{udevpkgname}%{udev_major} %description -n lib%{udevpkgname}%{udev_major}
@ -360,10 +359,7 @@ cp %{SOURCE7} m4/
%patch1003 -p1 %patch1003 -p1
%patch1004 -p1 %patch1004 -p1
%patch1005 -p1 %patch1005 -p1
%patch1007 -p1 %patch1006 -p1
%patch1021 -p1
%patch1026 -p1
%patch1027 -p1
#systemd #systemd
%patch0 -p1 %patch0 -p1
@ -502,6 +498,13 @@ ln -s systemd-random-seed-load.service %{buildroot}/%{_prefix}/lib/systemd/syste
# don't mount /tmp as tmpfs for now # don't mount /tmp as tmpfs for now
rm %{buildroot}/%{_prefix}/lib/systemd/system/local-fs.target.wants/tmp.mount rm %{buildroot}/%{_prefix}/lib/systemd/system/local-fs.target.wants/tmp.mount
# create %{_libexecdir}/modules-load.d
mkdir -p %{buildroot}%{_libexecdir}/modules-load.d
cat << EOF > %{buildroot}%{_libexecdir}/modules-load.d/sg.conf
# load sg module at boot time
sg
EOF
# To avoid making life hard for Factory developers, don't package the # To avoid making life hard for Factory developers, don't package the
# kernel.core_pattern setting until systemd-coredump is a part of an actual # kernel.core_pattern setting until systemd-coredump is a part of an actual
# systemd release and it's made clear how to get the core dumps out of the # systemd release and it's made clear how to get the core dumps out of the
@ -544,10 +547,13 @@ mkdir -p %{buildroot}%{_prefix}/lib/systemd/system-sleep/
mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/default.target.wants mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/default.target.wants
mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/dbus.target.wants mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/dbus.target.wants
src="%buildroot/%_libexecdir/systemd/system/getty@.service" # create drop-in to prevent tty1 to be cleared (bnc#804158)
dst="${src/@/@tty1}" mkdir -p %{buildroot}%{_prefix}/lib/systemd/system/getty@tty1.service.d/
cp "$src" "$dst" echo << EOF > %{buildroot}%{_prefix}/lib/systemd/system/getty@tty1.service.d/noclear.conf
perl -i -pe 's{^# the VT is cleared.*}{}i;s{(^TTYVTDisallocate=.*)}{}' "$dst" [Service]
# ensure tty1 isn't cleared (bnc#804158)
TTYVTDisallocate=no
EOF
%fdupes -s %{buildroot}%{_mandir} %fdupes -s %{buildroot}%{_mandir}
@ -711,7 +717,7 @@ fi
%endif %endif
%clean %clean
# rm -rf %{buildroot} rm -rf %{buildroot}
%files %files
%defattr(-,root,root) %defattr(-,root,root)
@ -782,6 +788,8 @@ fi
%dir %{_prefix}/lib/systemd/system-sleep/ %dir %{_prefix}/lib/systemd/system-sleep/
%dir %{_prefix}/lib/systemd/system/default.target.wants %dir %{_prefix}/lib/systemd/system/default.target.wants
%dir %{_prefix}/lib/systemd/system/dbus.target.wants %dir %{_prefix}/lib/systemd/system/dbus.target.wants
%dir %{_prefix}/lib/systemd/system/getty@tty1.service.d
%{_prefix}/lib/systemd/system/getty@tty1.service.d/noclear.conf
%if ! 0%{?bootstrap} %if ! 0%{?bootstrap}
%{_prefix}/lib/systemd/system-generators/systemd-cryptsetup-generator %{_prefix}/lib/systemd/system-generators/systemd-cryptsetup-generator
%endif %endif
@ -794,6 +802,7 @@ fi
%dir %{_libexecdir}/modules-load.d %dir %{_libexecdir}/modules-load.d
%dir %{_sysconfdir}/modules-load.d %dir %{_sysconfdir}/modules-load.d
%{_libexecdir}/modules-load.d/sg.conf
%dir %{_libexecdir}/tmpfiles.d %dir %{_libexecdir}/tmpfiles.d
%dir %{_sysconfdir}/tmpfiles.d %dir %{_sysconfdir}/tmpfiles.d
@ -937,8 +946,6 @@ fi
%{_prefix}/lib/udev/scsi_id %{_prefix}/lib/udev/scsi_id
%{_prefix}/lib/udev/v4l_id %{_prefix}/lib/udev/v4l_id
%{_prefix}/lib/udev/write_dev_root_rule %{_prefix}/lib/udev/write_dev_root_rule
%{_prefix}/lib/udev/write_net_rules
%{_prefix}/lib/udev/rule_generator.functions
%dir %{_prefix}/lib/udev/keymaps %dir %{_prefix}/lib/udev/keymaps
%{_prefix}/lib/udev/keymaps/* %{_prefix}/lib/udev/keymaps/*
%{_prefix}/lib/udev/keyboard-force-release.sh %{_prefix}/lib/udev/keyboard-force-release.sh