summaryrefslogtreecommitdiffstats
path: root/openembedded
diff options
context:
space:
mode:
authorRichard Purdie <richard@openedhand.com>2006-02-03 09:02:41 +0000
committerRichard Purdie <richard@openedhand.com>2006-02-03 09:02:41 +0000
commit4a64818533733e194138a45656aaf14d5a123e98 (patch)
tree79925075659d01f3b148e4267138ee6e8de91789 /openembedded
parentbc4e7ed8993d3f598e5c03b78838bbc6199413ba (diff)
downloadpoky-4a64818533733e194138a45656aaf14d5a123e98.tar.gz
Update to udev 084 from OE. This adds a coldplug script to emulate the calls necessary to load devices already inserted into the system at boot. It also adds a network interface control script.
git-svn-id: https://svn.o-hand.com/repos/poky@247 311d38ba-8fff-0310-9ca6-ca027cbcb966
Diffstat (limited to 'openembedded')
-rwxr-xr-xopenembedded/packages/udev/files/init16
-rw-r--r--openembedded/packages/udev/files/local.rules2
-rw-r--r--openembedded/packages/udev/files/network.sh26
-rw-r--r--openembedded/packages/udev/udev-084/flags.patch52
-rw-r--r--openembedded/packages/udev/udev-084/init227
-rw-r--r--openembedded/packages/udev/udev-084/noasmlinkage.patch38
-rw-r--r--openembedded/packages/udev/udev-084/udevsynthesize.patch776
-rw-r--r--openembedded/packages/udev/udev-084/udevsynthesize.sh51
-rw-r--r--openembedded/packages/udev/udev.inc4
-rw-r--r--openembedded/packages/udev/udev_071.bb2
-rw-r--r--openembedded/packages/udev/udev_084.bb46
11 files changed, 1235 insertions, 5 deletions
diff --git a/openembedded/packages/udev/files/init b/openembedded/packages/udev/files/init
index 6ad6fd5811..1022b40c89 100755
--- a/openembedded/packages/udev/files/init
+++ b/openembedded/packages/udev/files/init
@@ -52,9 +52,19 @@ mount_tmpfs() {
52 52
53 mkdir -p /dev/.static/dev 53 mkdir -p /dev/.static/dev
54 chmod 700 /dev/.static/ 54 chmod 700 /dev/.static/
55 # Make sure it's busybox mount we're using. util-linux mount doesn't handle 55 # The mount options in busybox are non-standard...
56 # -o move. 56 if test -x /bin/mount.util-linux
57 busybox mount -n -o move /etc/udev /dev/.static/dev 57 then
58 /bin/mount.util-linux --move /etc/udev /dev/.static/dev
59 elif test -x /bin/busybox
60 then
61 busybox mount -n -o move /etc/udev /dev/.static/dev
62 else
63 echo "udev requires an identifiable mount command, not started."
64 umount /etc/udev
65 umount /dev
66 exit 1
67 fi
58} 68}
59 69
60# I hate this hack. -- Md 70# I hate this hack. -- Md
diff --git a/openembedded/packages/udev/files/local.rules b/openembedded/packages/udev/files/local.rules
index 95b3e10830..4bcaaa8aba 100644
--- a/openembedded/packages/udev/files/local.rules
+++ b/openembedded/packages/udev/files/local.rules
@@ -1,3 +1,5 @@
1SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh" 1SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh"
2SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh" 2SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh"
3 3
4SUBSYSTEM=="net", ACTION=="add" RUN+="/etc/udev/scripts/network.sh"
5SUBSYSTEM=="net", ACTION=="remove" RUN+="/etc/udev/scripts/network.sh"
diff --git a/openembedded/packages/udev/files/network.sh b/openembedded/packages/udev/files/network.sh
new file mode 100644
index 0000000000..2cfbfa91b3
--- /dev/null
+++ b/openembedded/packages/udev/files/network.sh
@@ -0,0 +1,26 @@
1#!/bin/sh
2
3# Do not run when pcmcia-cs is installed
4test -x /sbin/cardctl && exit 0
5
6# We get two "add" events for hostap cards due to wifi0
7echo "$INTERFACE" | grep -q wifi && exit 0
8
9#
10# Code taken from pcmcia-cs:/etc/pcmcia/network
11#
12
13# if this interface has an entry in /etc/network/interfaces, let ifupdown
14# handle it
15if grep -q "iface \+$INTERFACE" /etc/network/interfaces; then
16 case $ACTION in
17 add)
18 ifup $INTERFACE
19 ;;
20 remove)
21 ifdown $INTERFACE
22 ;;
23 esac
24
25 exit 0
26fi
diff --git a/openembedded/packages/udev/udev-084/flags.patch b/openembedded/packages/udev/udev-084/flags.patch
new file mode 100644
index 0000000000..f144a5f622
--- /dev/null
+++ b/openembedded/packages/udev/udev-084/flags.patch
@@ -0,0 +1,52 @@
1--- udev-081/Makefile.orig 2006-01-29 12:36:33.000000000 +0100
2+++ udev-081/Makefile 2006-01-29 12:36:58.000000000 +0100
3@@ -123,29 +123,29 @@
4 STRIP = $(CROSS)strip
5 STRIPCMD = $(STRIP) -s
6
7-CFLAGS = -g -Wall -pipe -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64
8+override CFLAGS = -g -Wall -pipe -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64
9 WARNINGS = -Wstrict-prototypes -Wsign-compare -Wshadow \
10 -Wchar-subscripts -Wmissing-declarations -Wnested-externs \
11 -Wpointer-arith -Wcast-align -Wsign-compare -Wmissing-prototypes
12-CFLAGS += $(WARNINGS)
13+override CFLAGS += $(WARNINGS)
14
15 LDFLAGS = -Wl,-warn-common
16
17 OPTFLAGS = -Os
18-CFLAGS += $(OPTFLAGS)
19+override CFLAGS += $(OPTFLAGS)
20
21 ifeq ($(strip $(USE_LOG)),true)
22- CFLAGS += -DUSE_LOG
23+ override CFLAGS += -DUSE_LOG
24 endif
25
26 # if DEBUG is enabled, then we do not strip
27 ifeq ($(strip $(DEBUG)),true)
28- CFLAGS += -DDEBUG
29+ override CFLAGS += -DDEBUG
30 STRIPCMD =
31 endif
32
33 ifeq ($(strip $(USE_GCOV)),true)
34- CFLAGS += -fprofile-arcs -ftest-coverage
35+ override CFLAGS += -fprofile-arcs -ftest-coverage
36 LDFLAGS += -fprofile-arcs
37 endif
38
39@@ -160,11 +160,11 @@
40 ifeq ($(strip $(USE_SELINUX)),true)
41 UDEV_OBJS += udev_selinux.o
42 LIB_OBJS += -lselinux -lsepol
43- CFLAGS += -DUSE_SELINUX
44+ override CFLAGS += -DUSE_SELINUX
45 endif
46
47 ifeq ($(strip $(USE_STATIC)),true)
48- CFLAGS += -DUSE_STATIC
49+ override CFLAGS += -DUSE_STATIC
50 LDFLAGS += -static
51 endif
52
diff --git a/openembedded/packages/udev/udev-084/init b/openembedded/packages/udev/udev-084/init
new file mode 100644
index 0000000000..d3983df6bc
--- /dev/null
+++ b/openembedded/packages/udev/udev-084/init
@@ -0,0 +1,227 @@
1#!/bin/sh -e
2### BEGIN INIT INFO
3# Provides: udev
4# Required-Start: mountvirtfs
5# Required-Stop:
6# Default-Start: S
7# Default-Stop:
8# Short-Description: Start udevd, populate /dev and load drivers.
9### END INIT INFO
10
11# we need to unmount /dev/pts/ and remount it later over the tmpfs
12unmount_devpts() {
13 if mountpoint -q /dev/pts/; then
14 umount -l /dev/pts/
15 fi
16
17 if mountpoint -q /dev/shm/; then
18 umount -l /dev/shm/
19 fi
20}
21
22# mount a tmpfs over /dev, if somebody did not already do it
23mount_tmpfs() {
24 if grep -E -q "^[^[:space:]]+ /dev tmpfs" /proc/mounts; then
25 return
26 fi
27
28 # /dev/.static/dev/ is used by MAKEDEV to access the real /dev/ directory.
29 # /etc/udev/ is recycled as a temporary mount point because it's the only
30 # directory which is guaranteed to be available.
31 mount -n -o bind /dev /etc/udev
32
33 if ! mount -n -o size=$tmpfs_size,mode=0755 -t tmpfs tmpfs /dev; then
34 umount /etc/udev
35 echo "udev requires tmpfs support, not started."
36 exit 1
37 fi
38
39 mkdir -p /dev/.static/dev
40 chmod 700 /dev/.static/
41 # The mount options in busybox are non-standard...
42 if test -x /bin/mount.util-linux
43 then
44 /bin/mount.util-linux --move /etc/udev /dev/.static/dev
45 elif test -x /bin/busybox
46 then
47 busybox mount -n -o move /etc/udev /dev/.static/dev
48 else
49 echo "udev requires an identifiable mount command, not started."
50 umount /etc/udev
51 umount /dev
52 exit 1
53 fi
54}
55
56# I hate this hack. -- Md
57make_extra_nodes() {
58 if [ "$(echo /lib/udev/devices/*)" != "/lib/udev/devices/*" ]; then
59 cp --preserve=all --recursive --update /lib/udev/devices/* /dev/
60 fi
61
62 [ -e /etc/udev/links.conf ] || return 0
63 grep '^[^#]' /etc/udev/links.conf | \
64 while read type name arg1; do
65 [ "$type" -a "$name" -a ! -e "/dev/$name" -a ! -L "/dev/$name" ] ||continue
66 case "$type" in
67 L) ln -s $arg1 /dev/$name ;;
68 D) mkdir -p /dev/$name ;;
69 M) mknod -m 600 /dev/$name $arg1 ;;
70 *) echo "links.conf: unparseable line ($type $name $arg1)" ;;
71 esac
72 done
73}
74
75supported_kernel() {
76 case "$(uname -r)" in
77 2.[012345].*|2.6.[0-9]|2.6.[0-9][!0-9]*) return 1 ;;
78 2.6.1[01]|2.6.1[01][!0-9]*) return 1 ;;
79 esac
80 return 0
81}
82
83set_hotplug_handler() {
84 case "$(uname -r)" in
85 2.6.1[0-4]|2.6.1[0-4][!0-9]*) HANDLER='/sbin/udevsend' ;;
86 esac
87 echo $HANDLER > /proc/sys/kernel/hotplug
88}
89
90# shell version of /usr/bin/tty
91my_tty() {
92 [ -x /bin/readlink ] || return 0
93 [ -e /proc/self/fd/0 ] || return 0
94 readlink --silent /proc/self/fd/0 || true
95}
96
97warn_if_interactive() {
98 if [ "$RUNLEVEL" = "S" -a "$PREVLEVEL" = "N" ]; then
99 return
100 fi
101
102 TTY=$(my_tty)
103 if [ -z "$TTY" -o "$TTY" = "/dev/console" ]; then
104 return
105 fi
106
107 printf "\n\n\nIt has been detected that the command\n\n\t$0 $*\n\n"
108 printf "has been run from an interactive shell.\n"
109 printf "It will probably not do what you expect, so this script will wait\n"
110 printf "60 seconds before continuing. Press ^C to stop it.\n"
111 printf "RUNNING THIS COMMAND IS HIGHLY DISCOURAGED!\n\n\n\n"
112 sleep 60
113}
114
115##############################################################################
116
117PATH="/sbin:/bin:/usr/bin"
118
119[ -x /sbin/udevd ] || exit 0
120
121# defaults
122tmpfs_size="10M"
123udev_root="/dev"
124udevd_timeout=30
125
126. /etc/udev/udev.conf
127
128if ! supported_kernel; then
129 echo "udev requires a kernel >= 2.6.12, not started."
130 exit 1
131fi
132
133if [ ! -e /proc/filesystems ]; then
134 echo "udev requires a mounted procfs, not started."
135 exit 1
136fi
137
138if ! grep -q '[[:space:]]tmpfs$' /proc/filesystems; then
139 echo "udev requires tmpfs support, not started."
140 exit 1
141fi
142
143if [ ! -d /sys/class/ ]; then
144 echo "udev requires a mounted sysfs, not started."
145 exit 1
146fi
147
148if [ ! -e /proc/sys/kernel/hotplug ]; then
149 echo "udev requires hotplug support, not started."
150 exit 1
151fi
152
153##############################################################################
154
155# When modifying this script, do not forget that between the time that
156# the new /dev has been mounted and udevsynthesize has been run there will be
157# no /dev/null. This also means that you cannot use the "&" shell command.
158
159case "$1" in
160 start)
161 if [ -e "$udev_root/.udev/" ]; then
162 if mountpoint -q /dev/; then
163 TMPFS_MOUNTED=1
164 else
165 echo ".udev/ already exists on the static $udev_root!"
166 fi
167 else
168 warn_if_interactive
169 fi
170
171 echo "Starting the hotplug events dispatcher" "udevd"
172 udevd --daemon
173
174 set_hotplug_handler
175
176 if [ -z "$TMPFS_MOUNTED" ]; then
177 unmount_devpts
178 mount_tmpfs
179 [ -d /proc/1 ] || mount -n /proc
180 fi
181
182 # if this directory is not present /dev will not be updated by udev
183 mkdir -p /dev/.udev/ /dev/.udev/db/ /dev/.udev/queue/ /dev/.udevdb/
184 # /dev/null must be created before udevd is started
185 make_extra_nodes
186
187 echo "Synthesizing the initial hotplug events"
188 udevsynthesize
189
190 # wait for the udevd childs to finish
191 echo "Waiting for /dev to be fully populated"
192 while [ -d /dev/.udev/queue/ ]; do
193 sleep 1
194 udevd_timeout=$(($udevd_timeout - 1))
195 if [ $udevd_timeout -eq 0 ]; then
196 # ps axf
197 break
198 fi
199 done
200 if [ $udevd_timeout -eq 0 ]; then
201 echo 'timeout'
202 fi
203 ;;
204
205 stop)
206 echo "Stopping the hotplug events dispatcher" "udevd"
207 start-stop-daemon --stop --name udevd --quiet --oknodo --retry 5
208 ;;
209
210 restart|force-reload)
211 echo "Stopping the hotplug events dispatcher" "udevd"
212 if start-stop-daemon --stop --name udevd --quiet --oknodo --retry 5; then
213 exit 1
214 fi
215
216 echo "Starting the hotplug events dispatcher" "udevd"
217 udevd --daemon
218 ;;
219
220 *)
221 echo "Usage: /etc/init.d/udev {start|stop|restart|force-reload}"
222 exit 1
223 ;;
224esac
225
226exit 0
227
diff --git a/openembedded/packages/udev/udev-084/noasmlinkage.patch b/openembedded/packages/udev/udev-084/noasmlinkage.patch
new file mode 100644
index 0000000000..0d8e854c0e
--- /dev/null
+++ b/openembedded/packages/udev/udev-084/noasmlinkage.patch
@@ -0,0 +1,38 @@
1
2#
3# Patch managed by http://www.holgerschurig.de/patcher.html
4#
5
6--- udev-062/udev.c~noasmlinkage.patch
7+++ udev-062/udev.c
8@@ -54,7 +54,7 @@
9 }
10 #endif
11
12-static void asmlinkage sig_handler(int signum)
13+static void sig_handler(int signum)
14 {
15 switch (signum) {
16 case SIGALRM:
17--- udev-062/udevd.c~noasmlinkage.patch
18+++ udev-062/udevd.c
19@@ -639,7 +639,7 @@
20 return msg;
21 }
22
23-static void asmlinkage sig_handler(int signum)
24+static void sig_handler(int signum)
25 {
26 int rc;
27
28--- udev-062/udevstart.c~noasmlinkage.patch
29+++ udev-062/udevstart.c
30@@ -323,7 +323,7 @@
31 exec_list(&device_list);
32 }
33
34-static void asmlinkage sig_handler(int signum)
35+static void sig_handler(int signum)
36 {
37 switch (signum) {
38 case SIGALRM:
diff --git a/openembedded/packages/udev/udev-084/udevsynthesize.patch b/openembedded/packages/udev/udev-084/udevsynthesize.patch
new file mode 100644
index 0000000000..7811188485
--- /dev/null
+++ b/openembedded/packages/udev/udev-084/udevsynthesize.patch
@@ -0,0 +1,776 @@
1--- udev-081/udevsynthesize.c.orig 2006-01-29 12:22:45.000000000 +0100
2+++ udev-081/udevsynthesize.c 2006-01-29 12:22:40.000000000 +0100
3@@ -0,0 +1,763 @@
4+/*
5+ * udevcoldplug.c
6+ *
7+ * Copyright (C) 2005 SUSE Linux Products GmbH
8+ *
9+ * Author:
10+ * Kay Sievers <kay.sievers@vrfy.org>
11+ *
12+ * Synthesize kernel events from sysfs information and pass them
13+ * to the udevd daemon.
14+ *
15+ * This program is free software; you can redistribute it and/or modify it
16+ * under the terms of the GNU General Public License as published by the
17+ * Free Software Foundation version 2 of the License.
18+ *
19+ * This program is distributed in the hope that it will be useful, but
20+ * WITHOUT ANY WARRANTY; without even the implied warranty of
21+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22+ * General Public License for more details.
23+ *
24+ * You should have received a copy of the GNU General Public License along
25+ * with this program; if not, write to the Free Software Foundation, Inc.,
26+ * 675 Mass Ave, Cambridge, MA 02139, USA.
27+ *
28+ */
29+
30+#include <stdlib.h>
31+#include <stddef.h>
32+#include <string.h>
33+#include <stdio.h>
34+#include <unistd.h>
35+#include <errno.h>
36+#include <ctype.h>
37+#include <fcntl.h>
38+#include <dirent.h>
39+#include <signal.h>
40+#include <syslog.h>
41+#include <sys/socket.h>
42+#include <sys/un.h>
43+#include <sys/wait.h>
44+#include <sys/stat.h>
45+#include <sys/types.h>
46+
47+#include "udev_libc_wrapper.h"
48+#include "udev.h"
49+#include "udevd.h"
50+#include "udev_version.h"
51+#include "logging.h"
52+
53+#include "list.h"
54+
55+#ifndef DT_DIR
56+#define DT_DIR 4
57+#endif
58+
59+static const char *udev_log_str;
60+static int udevd_sock = -1;
61+
62+#ifdef USE_LOG
63+void log_message(int priority, const char *format, ...)
64+{
65+ va_list args;
66+
67+ if (priority > udev_log_priority)
68+ return;
69+
70+ va_start(args, format);
71+ vsyslog(priority, format, args);
72+ va_end(args);
73+}
74+#endif
75+
76+struct device {
77+ struct list_head node;
78+ struct udevd_msg msg;
79+ size_t bufpos;
80+ char *path;
81+};
82+
83+static dev_t read_devt(const char *path)
84+{
85+ char filename[PATH_SIZE];
86+ char majorminor[64];
87+ unsigned int major, minor;
88+ ssize_t count;
89+ int fd;
90+
91+ snprintf(filename, sizeof(filename), "%s/%s", path, "dev");
92+ filename[sizeof(filename)-1] = '\0';
93+
94+ fd = open(filename, O_RDONLY);
95+ if (fd < 0)
96+ return 0;
97+
98+ count = read(fd, majorminor, sizeof(majorminor));
99+ close(fd);
100+ majorminor[count] = '\0';
101+ if (sscanf(majorminor, "%u:%u", &major, &minor) != 2)
102+ return 0;
103+ dbg("found major=%d, minor=%d", major, minor);
104+
105+ return makedev(major, minor);
106+}
107+
108+static ssize_t read_file(const char *directory, const char *file, char *str, size_t len)
109+{
110+ char filename[PATH_SIZE];
111+ ssize_t count;
112+ int fd;
113+
114+ memset(filename, 0, sizeof(filename));
115+ snprintf(filename, sizeof(filename), "%s/%s", directory, file);
116+ filename[sizeof(filename)-1] = '\0';
117+
118+ fd = open(filename, O_RDONLY);
119+ if (fd < 0)
120+ return -1;
121+
122+ count = read(fd, str, len-1);
123+ close(fd);
124+
125+ if (count > (ssize_t)len)
126+ count = len;
127+ str[count-1] = '\0';
128+
129+ return count;
130+}
131+
132+static ssize_t read_link(const char *directory, const char *file, char *str, size_t size)
133+{
134+ char filename[PATH_SIZE];
135+ char target[PATH_SIZE];
136+ int len;
137+ char *back;
138+ char *strip;
139+ int level = 1;
140+
141+ snprintf(filename, sizeof(filename), "%s/%s", directory, file);
142+ filename[sizeof(filename)-1] = '\0';
143+
144+ len = readlink(filename, target, sizeof(target)-1);
145+ if (len < 0)
146+ return -1;
147+ target[len] = '\0';
148+
149+ back = target;
150+ while (strncmp(back, "../", 3) == 0) {
151+ back += 3;
152+ level++;
153+ }
154+ while(level--) {
155+ strip = strrchr(filename, '/');
156+ if (!strip)
157+ return -1;
158+ strip[0] = '\0';
159+ }
160+
161+ snprintf(str, size, "%s/%s", filename, back);
162+ str[size-1] = '\0';
163+
164+ return len;
165+}
166+
167+static char *add_env_key(struct device *device, const char *key, const char *value)
168+{
169+ size_t pos = device->bufpos;
170+ device->bufpos += sprintf(&device->msg.envbuf[device->bufpos], "%s=%s", key, value)+1;
171+ return &device->msg.envbuf[pos];
172+}
173+
174+static struct device *device_create(const char *path, const char *subsystem, dev_t devt)
175+{
176+ struct device *device;
177+ const char *devpath = &path[strlen(sysfs_path)];
178+ char target[PATH_SIZE];
179+
180+ device = malloc(sizeof(struct device));
181+ if (device == NULL) {
182+ dbg("error malloc");
183+ return NULL;
184+ }
185+ memset(device, 0x00, sizeof(struct device));
186+
187+ device->path = add_env_key(device, "DEVPATH", devpath);
188+ device->path += strlen("DEVPATH=");
189+ add_env_key(device, "SUBSYSTEM", subsystem);
190+ add_env_key(device, "ACTION", "add");
191+ add_env_key(device, "UDEV_COLDPLUG", "1");
192+
193+ if (major(devt)) {
194+ char number[32];
195+ sprintf(number, "%u", major(devt));
196+ add_env_key(device, "MAJOR", number);
197+ sprintf(number, "%u", minor(devt));
198+ add_env_key(device, "MINOR", number);
199+ }
200+
201+ if (strncmp(devpath, "/block/", strlen("/block/")) == 0 ||
202+ strncmp(devpath, "/class/", strlen("/class/")) == 0) {
203+ char physpath[PATH_SIZE];
204+
205+ if (read_link(path, "device", physpath, sizeof(physpath)) > (ssize_t)strlen(sysfs_path)) {
206+ add_env_key(device, "PHYSDEVPATH", &physpath[strlen(sysfs_path)]);
207+ if (read_link(physpath, "driver", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) {
208+ char *pos = strrchr(target, '/');
209+ if (pos)
210+ add_env_key(device, "PHYSDEVDRIVER", &pos[1]);
211+ }
212+ if (read_link(physpath, "bus", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) {
213+ char *pos = strrchr(target, '/');
214+ if (pos)
215+ add_env_key(device, "PHYSDEVBUS", &pos[1]);
216+ }
217+ }
218+ } else if (strncmp(devpath, "/devices/", strlen("/devices/")) == 0) {
219+ if (read_link(path, "driver", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) {
220+ char *pos = strrchr(target, '/');
221+ if (pos)
222+ add_env_key(device, "PHYSDEVDRIVER", &pos[1]);
223+ }
224+ if (read_link(path, "bus", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) {
225+ char *pos = strrchr(target, '/');
226+ if (pos)
227+ add_env_key(device, "PHYSDEVBUS", &pos[1]);
228+ }
229+ }
230+
231+ return device;
232+}
233+
234+static int device_list_insert(struct list_head *device_list, struct device *device)
235+{
236+ struct device *loop_device;
237+
238+ dbg("insert: '%s'", device->path);
239+
240+ /* sort files in lexical order */
241+ list_for_each_entry(loop_device, device_list, node)
242+ if (strcmp(loop_device->path, device->path) > 0)
243+ break;
244+
245+ list_add_tail(&device->node, &loop_device->node);
246+
247+ return 0;
248+}
249+
250+static int add_device_udevd(struct device *device)
251+{
252+ size_t msg_len;
253+ struct sockaddr_un saddr;
254+ socklen_t addrlen;
255+ int retval;
256+
257+ memset(&saddr, 0x00, sizeof(struct sockaddr_un));
258+ saddr.sun_family = AF_LOCAL;
259+ /* use abstract namespace for socket path */
260+ strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH);
261+ addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1;
262+
263+ strcpy(device->msg.magic, UDEV_MAGIC);
264+ device->msg.type = UDEVD_UEVENT_UDEVSEND;
265+
266+ msg_len = offsetof(struct udevd_msg, envbuf) + device->bufpos;
267+ dbg("msg_len=%i", msg_len);
268+
269+ retval = sendto(udevd_sock, &device->msg, msg_len, 0, (struct sockaddr *)&saddr, addrlen);
270+ if (retval < 0)
271+ return -1;
272+
273+ return 0;
274+}
275+
276+static void exec_list(struct list_head *device_list, const char *first[], const char *last[])
277+{
278+ struct device *loop_device;
279+ struct device *tmp_device;
280+ int i;
281+
282+ /* handle the "first" type devices first */
283+ if (first)
284+ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) {
285+ for (i = 0; first[i] != NULL; i++) {
286+ if (strncmp(loop_device->path, first[i], strlen(first[i])) == 0) {
287+ add_device_udevd(loop_device);
288+ list_del(&loop_device->node);
289+ free(loop_device);
290+ break;
291+ }
292+ }
293+ }
294+
295+ /* handle the devices we are allowed to, excluding the "last" type devices */
296+ if (last)
297+ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) {
298+ int found = 0;
299+ for (i = 0; last[i] != NULL; i++) {
300+ if (strncmp(loop_device->path, last[i], strlen(last[i])) == 0) {
301+ found = 1;
302+ break;
303+ }
304+ }
305+ if (found)
306+ continue;
307+
308+ add_device_udevd(loop_device);
309+ list_del(&loop_device->node);
310+ free(loop_device);
311+ }
312+
313+ /* handle the rest of the devices */
314+ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) {
315+ add_device_udevd(loop_device);
316+ list_del(&loop_device->node);
317+ free(loop_device);
318+ }
319+}
320+
321+static int udev_scan_class(void)
322+{
323+ char base[PATH_SIZE];
324+ DIR *dir;
325+ struct dirent *dent;
326+ LIST_HEAD(device_list);
327+
328+ /* we want /dev/null and /dev/console first */
329+ const char *first[] = {
330+ "/class/mem",
331+ "/class/tty",
332+ NULL,
333+ };
334+
335+ snprintf(base, sizeof(base), "%s/class", sysfs_path);
336+ base[sizeof(base)-1] = '\0';
337+
338+ dir = opendir(base);
339+ if (!dir)
340+ return -1;
341+
342+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
343+ char dirname[PATH_SIZE];
344+ DIR *dir2;
345+ struct dirent *dent2;
346+
347+ if (dent->d_name[0] == '.')
348+ continue;
349+
350+ snprintf(dirname, sizeof(dirname), "%s/%s", base, dent->d_name);
351+ dirname[sizeof(dirname)-1] = '\0';
352+
353+ dir2 = opendir(dirname);
354+ if (!dir2)
355+ continue;
356+ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
357+ char dirname2[PATH_SIZE];
358+ struct device *device;
359+ dev_t devt;
360+
361+ if (dent2->d_name[0] == '.')
362+ continue;
363+ if (dent2->d_type != DT_DIR)
364+ continue;
365+
366+ snprintf(dirname2, sizeof(dirname2), "%s/%s", dirname, dent2->d_name);
367+ dirname2[sizeof(dirname2)-1] = '\0';
368+ devt = read_devt(dirname2);
369+ device = device_create(dirname2, dent->d_name, devt);
370+
371+ if (strcmp(dent->d_name, "net") == 0 ||
372+ strcmp(dent->d_name, "bluetooth") == 0) {
373+ add_env_key(device, "INTERFACE", dent2->d_name);
374+ } else if (strcmp(dent->d_name, "pcmcia_socket") == 0 &&
375+ strlen(dent->d_name) > 14) {
376+ add_env_key(device, "SOCKET_NO",
377+ dent2->d_name + 14);
378+ }
379+
380+ device_list_insert(&device_list, device);
381+ }
382+ closedir(dir2);
383+ }
384+ closedir(dir);
385+ exec_list(&device_list, first, NULL);
386+
387+ return 0;
388+}
389+
390+static int udev_scan_block(void)
391+{
392+ char base[PATH_SIZE];
393+ DIR *dir;
394+ struct dirent *dent;
395+ LIST_HEAD(device_list);
396+
397+ /* dm wants to have the block devices around before it */
398+ const char *last[] = {
399+ "/block/dm",
400+ NULL,
401+ };
402+
403+ snprintf(base, sizeof(base), "%s/block", sysfs_path);
404+ base[sizeof(base)-1] = '\0';
405+
406+ dir = opendir(base);
407+ if (!dir)
408+ return -1;
409+
410+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
411+ char dirname[PATH_SIZE];
412+ struct device *device;
413+ struct dirent *dent2;
414+ DIR *dir2;
415+ dev_t devt;
416+
417+ if (dent->d_name[0] == '.')
418+ continue;
419+ if (dent->d_type != DT_DIR)
420+ continue;
421+
422+ snprintf(dirname, sizeof(dirname), "%s/%s", base, dent->d_name);
423+ dirname[sizeof(dirname)-1] = '\0';
424+ devt = read_devt(dirname);
425+ if (major(devt)) {
426+ device = device_create(dirname, "block", devt);
427+ device_list_insert(&device_list, device);
428+ }
429+
430+ /* look for partitions */
431+ dir2 = opendir(dirname);
432+ if (!dir2)
433+ continue;
434+ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) {
435+ char dirname2[PATH_SIZE];
436+
437+ if (dent2->d_name[0] == '.')
438+ continue;
439+ if (dent2->d_type != DT_DIR)
440+ continue;
441+
442+ snprintf(dirname2, sizeof(dirname2), "%s/%s", dirname, dent2->d_name);
443+ dirname2[sizeof(dirname2)-1] = '\0';
444+ devt = read_devt(dirname2);
445+ if (major(devt)) {
446+ device = device_create(dirname2, "block", devt);
447+ device_list_insert(&device_list, device);
448+ continue;
449+ }
450+ }
451+ closedir(dir2);
452+ }
453+ closedir(dir);
454+ exec_list(&device_list, NULL, last);
455+
456+ return 0;
457+}
458+
459+static int pci_handler(struct device *device)
460+{
461+ char path[PATH_SIZE];
462+ char value[PATH_SIZE];
463+ char vendor[PATH_SIZE];
464+ char product[PATH_SIZE];
465+ const char *name;
466+
467+ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path);
468+ path[sizeof(path)-1] = '\0';
469+
470+ if (read_file(path, "modalias", value, sizeof(value)) > 0)
471+ add_env_key(device, "MODALIAS", value);
472+
473+ name = strrchr(device->path, '/');
474+ if (name)
475+ add_env_key(device, "PCI_SLOT_NAME", &name[1]);
476+
477+ if (read_file(path, "class", value, sizeof(value)) > 0)
478+ add_env_key(device, "PCI_CLASS", &value[2]);
479+
480+ if (read_file(path, "vendor", vendor, sizeof(vendor)) > 0 &&
481+ read_file(path, "device", product, sizeof(product)) > 0) {
482+ snprintf(value, sizeof(value), "%s:%s", &vendor[2], &product[2]);
483+ path[sizeof(value)-1] = '\0';
484+ add_env_key(device, "PCI_ID", value);
485+ }
486+
487+ if (read_file(path, "subsystem_vendor", vendor, sizeof(vendor)) > 0 &&
488+ read_file(path, "subsystem_device", product, sizeof(product)) > 0) {
489+ snprintf(value, sizeof(value), "%s:%s", &vendor[2], &product[2]);
490+ path[sizeof(value)-1] = '\0';
491+ add_env_key(device, "PCI_SUBSYS_ID", value);
492+ }
493+
494+ return 0;
495+}
496+
497+static int usb_handler(struct device *device)
498+{
499+ char path[PATH_SIZE];
500+ char value[PATH_SIZE];
501+ char str1[PATH_SIZE];
502+ char str2[PATH_SIZE];
503+ char str3[PATH_SIZE];
504+ unsigned int int1;
505+ unsigned int int2;
506+ unsigned int int3;
507+ char *pos;
508+
509+ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path);
510+ path[sizeof(path)-1] = '\0';
511+
512+ /* device events have : in their directory name */
513+ pos = strrchr(path, '/');
514+ if (!strchr(pos, ':'))
515+ return 0; /* and do not have other variables */
516+
517+ if (read_file(path, "modalias", value, sizeof(value)) > 0)
518+ add_env_key(device, "MODALIAS", value);
519+
520+ if (read_file(path, "bInterfaceClass", str1, sizeof(str1)) > 0 &&
521+ read_file(path, "bInterfaceSubClass", str2, sizeof(str2)) > 0 &&
522+ read_file(path, "bInterfaceProtocol", str3, sizeof(str3)) > 0) {
523+ int1 = (int) strtol(str1, NULL, 16);
524+ int2 = (int) strtol(str2, NULL, 16);
525+ int3 = (int) strtol(str3, NULL, 16);
526+ snprintf(value, sizeof(value), "%u/%u/%u", int1, int2, int3);
527+ path[sizeof(value)-1] = '\0';
528+ add_env_key(device, "INTERFACE", value);
529+ }
530+
531+ /* move to the parent directory */
532+ pos[0] = '\0';
533+
534+ if (read_file(path, "idVendor", str1, sizeof(str1)) > 0 &&
535+ read_file(path, "idProduct", str2, sizeof(str2)) > 0 &&
536+ read_file(path, "bcdDevice", str3, sizeof(str3)) > 0) {
537+ int1 = (int) strtol(str1, NULL, 16);
538+ int2 = (int) strtol(str2, NULL, 16);
539+ int3 = (int) strtol(str3, NULL, 16);
540+ snprintf(value, sizeof(value), "%x/%x/%x", int1, int2, int3);
541+ path[sizeof(value)-1] = '\0';
542+ add_env_key(device, "PRODUCT", value);
543+ }
544+
545+ if (read_file(path, "bDeviceClass", str1, sizeof(str1)) > 0 &&
546+ read_file(path, "bDeviceSubClass", str2, sizeof(str2)) > 0 &&
547+ read_file(path, "bDeviceProtocol", str3, sizeof(str3)) > 0) {
548+ int1 = (int) strtol(str1, NULL, 16);
549+ int2 = (int) strtol(str2, NULL, 16);
550+ int3 = (int) strtol(str3, NULL, 16);
551+ snprintf(value, sizeof(value), "%u/%u/%u", int1, int2, int3);
552+ path[sizeof(value)-1] = '\0';
553+ add_env_key(device, "TYPE", value);
554+ }
555+
556+ if (read_file(path, "devnum", str2, sizeof(str2)) > 0) {
557+ pos = strrchr(path, 'b');
558+ int1 = (int) strtol(pos + 1, NULL, 16);
559+ int2 = (int) strtol(str2, NULL, 16);
560+ snprintf(value, sizeof(value),
561+ "/proc/bus/usb/%03d/%03d", int1, int2);
562+ path[sizeof(value)-1] = '\0';
563+ add_env_key(device, "DEVICE", value);
564+ }
565+
566+ return 0;
567+}
568+
569+static int serio_handler(struct device *device)
570+{
571+ char path[PATH_SIZE];
572+ char value[PATH_SIZE];
573+
574+ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path);
575+ path[sizeof(path)-1] = '\0';
576+
577+ if (read_file(path, "modalias", value, sizeof(value)) > 0)
578+ add_env_key(device, "MODALIAS", value);
579+
580+ if (read_file(path, "id/type", value, sizeof(value)) > 0)
581+ add_env_key(device, "SERIO_TYPE", value);
582+
583+ if (read_file(path, "id/proto", value, sizeof(value)) > 0)
584+ add_env_key(device, "SERIO_PROTO", value);
585+
586+ if (read_file(path, "id/id", value, sizeof(value)) > 0)
587+ add_env_key(device, "SERIO_ID", value);
588+
589+ if (read_file(path, "id/extra", value, sizeof(value)) > 0)
590+ add_env_key(device, "SERIO_EXTRA", value);
591+
592+ return 0;
593+}
594+
595+static int ccw_handler(struct device *device)
596+{
597+ char path[PATH_SIZE];
598+ char value[PATH_SIZE], *tmp;
599+
600+ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path);
601+ path[sizeof(path)-1] = '\0';
602+
603+ if (read_file(path, "modalias", value, sizeof(value)) > 0)
604+ add_env_key(device, "MODALIAS", value);
605+
606+ if (read_file(path, "cutype", value, sizeof(value)) > 0) {
607+ value[4] = 0;
608+ tmp = &value[5];
609+ add_env_key(device, "CU_TYPE", value);
610+ add_env_key(device, "CU_MODEL", tmp);
611+ }
612+
613+ if (read_file(path, "devtype", value, sizeof(value)) > 0) {
614+ if (value[0] == 'n') {
615+ add_env_key(device, "DEV_TYPE", "0000");
616+ add_env_key(device, "DEV_MODEL", "00");
617+ }
618+ else {
619+ value[4] = 0;
620+ tmp = &value[5];
621+ add_env_key(device, "DEV_TYPE", value);
622+ add_env_key(device, "DEV_MODEL", tmp);
623+ }
624+ }
625+
626+ return 0;
627+}
628+
629+static int modalias_handler(struct device *device)
630+{
631+ char path[PATH_SIZE];
632+ char value[PATH_SIZE];
633+
634+ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path);
635+ path[sizeof(path)-1] = '\0';
636+
637+ if (read_file(path, "modalias", value, sizeof(value)) > 0)
638+ add_env_key(device, "MODALIAS", value);
639+
640+ return 0;
641+}
642+
643+static int udev_scan_bus(const char *bus, int bus_handler(struct device *device))
644+{
645+ char base[PATH_SIZE];
646+ DIR *dir;
647+ struct dirent *dent;
648+ LIST_HEAD(device_list);
649+
650+ snprintf(base, sizeof(base), "%s/bus/%s/devices", sysfs_path, bus);
651+ base[sizeof(base)-1] = '\0';
652+
653+ dir = opendir(base);
654+ if (!dir)
655+ return -1;
656+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
657+ char devpath[PATH_SIZE];
658+ struct device *device;
659+
660+ if (dent->d_name[0] == '.')
661+ continue;
662+
663+ if (read_link(base, dent->d_name, devpath, sizeof(devpath)) < 0)
664+ continue;
665+
666+ device = device_create(devpath, bus, makedev(0, 0));
667+ if (bus_handler) {
668+ if (bus_handler(device) < 0) {
669+ dbg("'%s' bus handler skipped event", devpath);
670+ free(device);
671+ continue;
672+ }
673+ }
674+
675+ device_list_insert(&device_list, device);
676+ }
677+ closedir(dir);
678+ exec_list(&device_list, NULL, NULL);
679+
680+ return 0;
681+}
682+
683+static int udev_scan_devices(void)
684+{
685+ char base[PATH_SIZE];
686+ DIR *dir;
687+ struct dirent *dent;
688+
689+ snprintf(base, sizeof(base), "%s/bus", sysfs_path);
690+ base[sizeof(base)-1] = '\0';
691+
692+ dir = opendir(base);
693+ if (!dir)
694+ return -1;
695+
696+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
697+ if (dent->d_name[0] == '.')
698+ continue;
699+ if (dent->d_type != DT_DIR)
700+ continue;
701+
702+ /* add bus specific env values */
703+ if (strcmp(dent->d_name, "pci") == 0)
704+ udev_scan_bus("pci", pci_handler);
705+ else if (strcmp(dent->d_name, "usb") == 0)
706+ udev_scan_bus("usb", usb_handler);
707+ else if (strcmp(dent->d_name, "serio") == 0)
708+ udev_scan_bus("serio", serio_handler);
709+ else if (strcmp(dent->d_name, "ccw") == 0)
710+ udev_scan_bus("ccw", ccw_handler);
711+ else
712+ udev_scan_bus(dent->d_name, modalias_handler);
713+ }
714+ closedir(dir);
715+
716+ return 0;
717+}
718+
719+int main(int argc, char *argv[], char *envp[])
720+{
721+ LIST_HEAD(device_list);
722+ int i;
723+
724+ logging_init("udevcoldplug");
725+ udev_config_init(); sysfs_init();
726+ dbg("version %s", UDEV_VERSION);
727+
728+ udev_log_str = getenv("UDEV_LOG");
729+
730+ /* disable all logging if not explicitely requested */
731+ if (udev_log_str == NULL)
732+ udev_log_priority = 0;
733+
734+ for (i = 1 ; i < argc; i++) {
735+ char *arg = argv[i];
736+
737+ if (strcmp(arg, "help") == 0 || strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) {
738+ printf("Usage: udevcoldplug \n"
739+ " --help print this help text\n\n");
740+ exit(0);
741+ } else {
742+ fprintf(stderr, "unknown option\n\n");
743+ exit(1);
744+ }
745+ }
746+
747+ udevd_sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
748+ if (udevd_sock < 0) {
749+ err("error getting socket");
750+ return 1;
751+ }
752+
753+ /* create nodes for already available devices */
754+ udev_scan_class();
755+ udev_scan_block();
756+
757+ /* synthesize events for bus devices
758+ * may load modules or configure the device */
759+ udev_scan_devices();
760+
761+ if (udevd_sock >= 0)
762+ close(udevd_sock);
763+ logging_close();
764+
765+ return 0;
766+}
767--- udev-081/Makefile
768+++ udev-081/Makefile
769@@ -58,6 +58,7 @@ PROGRAMS = \
770 udevmonitor \
771 udevinfo \
772 udevtest \
773+ udevsynthesize \
774 udevstart
775
776 HEADERS = \
diff --git a/openembedded/packages/udev/udev-084/udevsynthesize.sh b/openembedded/packages/udev/udev-084/udevsynthesize.sh
new file mode 100644
index 0000000000..d58217c144
--- /dev/null
+++ b/openembedded/packages/udev/udev-084/udevsynthesize.sh
@@ -0,0 +1,51 @@
1#!/bin/sh -e
2
3load_input_modules() {
4 for module in mousedev evdev joydev; do
5 modprobe -q $module || true
6 done
7}
8
9if [ ! -e /sys/class/mem/null/uevent ]; then # <= 2.6.14
10 /lib/udev/udevsynthesize
11 load_input_modules
12 exit 0
13fi
14
15# replace $IFS with something which is not likely to appear in a sysfs path,
16# because some buggy drivers have spaces in their names
17oldifs="$IFS"
18IFS="|"
19
20for file in /sys/bus/*/devices/*/uevent /sys/class/*/*/uevent \
21 /sys/block/*/uevent /sys/block/*/*/uevent; do
22 case "$file" in
23 */device/uevent) ;; # skip followed device symlinks
24 */\*/*) ;;
25
26 */class/mem/*) # for /dev/null
27 first="$first${IFS}$file" ;;
28
29 */block/md[0-9]*)
30 last="$last${IFS}$file" ;;
31
32 *)
33 default="$default${IFS}$file" ;;
34 esac
35done
36
37for file in $first${IFS}$default${IFS}$last; do
38 [ "$file" ] || continue
39 echo 'add' > "$file" || true
40done
41
42IFS="$oldifs"
43
44case "$(uname -r)" in
45 2.6.1[0-5]|2.6.1[0-5][!0-9]*) # <= 2.6.15
46 load_input_modules
47 ;;
48esac
49
50exit 0
51
diff --git a/openembedded/packages/udev/udev.inc b/openembedded/packages/udev/udev.inc
index 2387d07945..a2883aef50 100644
--- a/openembedded/packages/udev/udev.inc
+++ b/openembedded/packages/udev/udev.inc
@@ -8,6 +8,7 @@ SRC_URI += " \
8 file://links.conf \ 8 file://links.conf \
9 file://permissions.rules \ 9 file://permissions.rules \
10 file://mount.sh \ 10 file://mount.sh \
11 file://network.sh \
11 file://local.rules \ 12 file://local.rules \
12 file://init" 13 file://init"
13 14
@@ -19,7 +20,7 @@ FILES_udev-utils = "${usrbindir}/udevinfo ${usrbindir}/udevtest"
19inherit update-rc.d 20inherit update-rc.d
20 21
21INITSCRIPT_NAME = "udev" 22INITSCRIPT_NAME = "udev"
22INITSCRIPT_PARAMS = "start 04 S ." 23INITSCRIPT_PARAMS = "start 04 S . start 55 0 6 ."
23 24
24export CROSS = "${TARGET_PREFIX}" 25export CROSS = "${TARGET_PREFIX}"
25export HOSTCC = "${BUILD_CC}" 26export HOSTCC = "${BUILD_CC}"
@@ -56,4 +57,5 @@ do_install () {
56 install -d ${D}${sysconfdir}/udev/scripts/ 57 install -d ${D}${sysconfdir}/udev/scripts/
57 58
58 install -m 0755 ${WORKDIR}/mount.sh ${D}${sysconfdir}/udev/scripts/mount.sh 59 install -m 0755 ${WORKDIR}/mount.sh ${D}${sysconfdir}/udev/scripts/mount.sh
60 install -m 0755 ${WORKDIR}/network.sh ${D}${sysconfdir}/udev/scripts
59} 61}
diff --git a/openembedded/packages/udev/udev_071.bb b/openembedded/packages/udev/udev_071.bb
index e5f0409b17..937462de85 100644
--- a/openembedded/packages/udev/udev_071.bb
+++ b/openembedded/packages/udev/udev_071.bb
@@ -6,7 +6,7 @@ SRC_URI = "http://kernel.org/pub/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \
6 6
7include udev.inc 7include udev.inc
8 8
9PR = "r5" 9PR = "r8"
10 10
11UDEV_EXTRAS = "extras/firmware/ extras/scsi_id/ extras/volume_id/ extras/run_directory/" 11UDEV_EXTRAS = "extras/firmware/ extras/scsi_id/ extras/volume_id/ extras/run_directory/"
12 12
diff --git a/openembedded/packages/udev/udev_084.bb b/openembedded/packages/udev/udev_084.bb
new file mode 100644
index 0000000000..d4bdb13382
--- /dev/null
+++ b/openembedded/packages/udev/udev_084.bb
@@ -0,0 +1,46 @@
1DEFAULT_PREFERENCE = "-1"
2
3DESCRIPTION = "udev is a daemon which dynamically creates and removes device nodes from \
4/dev/, handles hotplug events and loads drivers at boot time. It replaces \
5the hotplug package and requires a kernel not older than 2.6.12."
6RPROVIDES = "hotplug"
7
8SRC_URI = "http://kernel.org/pub/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \
9 file://noasmlinkage.patch;patch=1 \
10 file://flags.patch;patch=1 \
11 file://udevsynthesize.patch;patch=1 \
12 file://udevsynthesize.sh"
13
14include udev.inc
15
16INITSCRIPT_PARAMS = "start 03 S . start 55 0 6 ."
17
18PR = "r0"
19
20UDEV_EXTRAS = "extras/firmware/ extras/scsi_id/ extras/volume_id/ extras/run_directory/"
21
22do_install () {
23 install -d ${D}${usrsbindir} \
24 ${D}${sbindir}
25 oe_runmake 'DESTDIR=${D}' INSTALL=install install
26 install -d ${D}${sysconfdir}/init.d
27 install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/udev
28
29 install -d ${D}${sysconfdir}/udev/rules.d/
30
31 install -m 0644 ${WORKDIR}/local.rules ${D}${sysconfdir}/udev/rules.d/local.rules
32 install -m 0644 ${WORKDIR}/permissions.rules ${D}${sysconfdir}/udev/rules.d/permissions.rules
33 install -m 0644 ${WORKDIR}/udev.rules ${D}${sysconfdir}/udev/rules.d/udev.rules
34 if [ "${UDEV_DEVFS_RULES}" = "1" ]; then
35 install -m 0644 ${WORKDIR}/devfs-udev.rules ${D}${sysconfdir}/udev/rules.d/devfs-udev.rules
36 fi
37
38 install -d ${D}${sysconfdir}/udev/scripts/
39
40 install -m 0755 ${WORKDIR}/mount.sh ${D}${sysconfdir}/udev/scripts/mount.sh
41 install -m 0755 ${WORKDIR}/network.sh ${D}${sysconfdir}/udev/scripts
42
43 install -d ${D}${base_libdir}/udev/
44 install -m 0755 ${S}/udevsynthesize ${D}${base_libdir}/udev/udevsynthesize
45 install -m 0755 ${WORKDIR}/udevsynthesize.sh ${D}${sbindir}/udevsynthesize
46}