From b4cb437c6595ff8ac13506e502fe04b1a60c4e04 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Tue, 9 May 2006 18:38:19 +0000 Subject: Merge packages changes from OE into poky. git-svn-id: https://svn.o-hand.com/repos/poky/trunk@386 311d38ba-8fff-0310-9ca6-ca027cbcb966 --- .../packages/udev/files/akita/mount.blacklist | 5 + .../packages/udev/files/c7x0/mount.blacklist | 5 + .../packages/udev/files/fix-alignment.patch | 24 + openembedded/packages/udev/files/local.rules | 17 + openembedded/packages/udev/files/mount.blacklist | 1 + .../packages/udev/files/noasmlinkage.patch | 38 + .../packages/udev/files/slugos/mount.blacklist | 4 + .../packages/udev/files/spitz/mount.blacklist | 6 + .../packages/udev/files/tosa/mount.blacklist | 5 + openembedded/packages/udev/files/udev.rules | 2 +- .../packages/udev/files/udev_network_queue.sh | 35 + .../packages/udev/files/udevsynthesize.patch | 776 +++++++++++++++++++++ openembedded/packages/udev/files/udevsynthesize.sh | 51 ++ openembedded/packages/udev/udev-071/flags.patch | 72 -- .../packages/udev/udev-071/noasmlinkage.patch | 38 - .../packages/udev/udev-071/tty-symlinks.patch | 13 - openembedded/packages/udev/udev-084/init | 4 +- openembedded/packages/udev/udev-084/local.rules | 28 + .../packages/udev/udev-084/noasmlinkage.patch | 38 - openembedded/packages/udev/udev-084/udev.rules | 3 +- .../packages/udev/udev-084/udevsynthesize.patch | 776 --------------------- .../packages/udev/udev-084/udevsynthesize.sh | 51 -- openembedded/packages/udev/udev.inc | 2 +- openembedded/packages/udev/udev_071.bb | 17 - openembedded/packages/udev/udev_084.bb | 24 +- 25 files changed, 1020 insertions(+), 1015 deletions(-) create mode 100644 openembedded/packages/udev/files/akita/mount.blacklist create mode 100644 openembedded/packages/udev/files/c7x0/mount.blacklist create mode 100644 openembedded/packages/udev/files/fix-alignment.patch create mode 100644 openembedded/packages/udev/files/mount.blacklist create mode 100644 openembedded/packages/udev/files/noasmlinkage.patch create mode 100644 openembedded/packages/udev/files/slugos/mount.blacklist create mode 100644 openembedded/packages/udev/files/spitz/mount.blacklist create mode 100644 openembedded/packages/udev/files/tosa/mount.blacklist create mode 100644 openembedded/packages/udev/files/udev_network_queue.sh create mode 100644 openembedded/packages/udev/files/udevsynthesize.patch create mode 100644 openembedded/packages/udev/files/udevsynthesize.sh delete mode 100644 openembedded/packages/udev/udev-071/flags.patch delete mode 100644 openembedded/packages/udev/udev-071/noasmlinkage.patch delete mode 100644 openembedded/packages/udev/udev-071/tty-symlinks.patch create mode 100644 openembedded/packages/udev/udev-084/local.rules delete mode 100644 openembedded/packages/udev/udev-084/noasmlinkage.patch delete mode 100644 openembedded/packages/udev/udev-084/udevsynthesize.patch delete mode 100644 openembedded/packages/udev/udev-084/udevsynthesize.sh delete mode 100644 openembedded/packages/udev/udev_071.bb (limited to 'openembedded/packages/udev') diff --git a/openembedded/packages/udev/files/akita/mount.blacklist b/openembedded/packages/udev/files/akita/mount.blacklist new file mode 100644 index 0000000000..f2c10ee50d --- /dev/null +++ b/openembedded/packages/udev/files/akita/mount.blacklist @@ -0,0 +1,5 @@ +# This is a grep pattern matched against the device name +# Any matched pattern will _not_ be mounted / removed by udevd + +/dev/mtdblock +/dev/loop diff --git a/openembedded/packages/udev/files/c7x0/mount.blacklist b/openembedded/packages/udev/files/c7x0/mount.blacklist new file mode 100644 index 0000000000..f2c10ee50d --- /dev/null +++ b/openembedded/packages/udev/files/c7x0/mount.blacklist @@ -0,0 +1,5 @@ +# This is a grep pattern matched against the device name +# Any matched pattern will _not_ be mounted / removed by udevd + +/dev/mtdblock +/dev/loop diff --git a/openembedded/packages/udev/files/fix-alignment.patch b/openembedded/packages/udev/files/fix-alignment.patch new file mode 100644 index 0000000000..8c7b8b5ac5 --- /dev/null +++ b/openembedded/packages/udev/files/fix-alignment.patch @@ -0,0 +1,24 @@ +diff --git a/udev_rules_parse.c b/udev_rules_parse.c +--- a/udev_rules_parse.c ++++ b/udev_rules_parse.c +@@ -241,6 +241,7 @@ static int add_to_rules(struct udev_rule + int valid; + char *linepos; + char *attr; ++ size_t padding; + int retval; + + /* get all the keys */ +@@ -506,6 +507,11 @@ static int add_to_rules(struct udev_rule + + /* grow buffer and add rule */ + rule_size = sizeof(struct udev_rule) + rule->bufsize; ++ padding = (sizeof(size_t) - rule_size % sizeof(size_t)) % sizeof(size_t); ++ dbg("add %zi padding bytes", padding); ++ rule_size += padding; ++ rule->bufsize += padding; ++ + rules->buf = realloc(rules->buf, rules->bufsize + rule_size); + if (!rules->buf) { + err("realloc failed"); + diff --git a/openembedded/packages/udev/files/local.rules b/openembedded/packages/udev/files/local.rules index 4bcaaa8aba..5f2efbeb0c 100644 --- a/openembedded/packages/udev/files/local.rules +++ b/openembedded/packages/udev/files/local.rules @@ -1,5 +1,22 @@ +# There are a number of modifiers that are allowed to be used in some +# of the different fields. They provide the following subsitutions: +# +# %n the "kernel number" of the device. +# For example, 'sda3' has a "kernel number" of '3' +# %e the smallest number for that name which does not matches an existing node +# %k the kernel name for the device +# %M the kernel major number for the device +# %m the kernel minor number for the device +# %b the bus id for the device +# %c the string returned by the PROGRAM +# %s{filename} the content of a sysfs attribute +# %% the '%' char itself +# + +# Media automounting SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh" SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh" +# Handle network interface setup SUBSYSTEM=="net", ACTION=="add" RUN+="/etc/udev/scripts/network.sh" SUBSYSTEM=="net", ACTION=="remove" RUN+="/etc/udev/scripts/network.sh" diff --git a/openembedded/packages/udev/files/mount.blacklist b/openembedded/packages/udev/files/mount.blacklist new file mode 100644 index 0000000000..7e13ea91de --- /dev/null +++ b/openembedded/packages/udev/files/mount.blacklist @@ -0,0 +1 @@ +/dev/loop diff --git a/openembedded/packages/udev/files/noasmlinkage.patch b/openembedded/packages/udev/files/noasmlinkage.patch new file mode 100644 index 0000000000..0d8e854c0e --- /dev/null +++ b/openembedded/packages/udev/files/noasmlinkage.patch @@ -0,0 +1,38 @@ + +# +# Patch managed by http://www.holgerschurig.de/patcher.html +# + +--- udev-062/udev.c~noasmlinkage.patch ++++ udev-062/udev.c +@@ -54,7 +54,7 @@ + } + #endif + +-static void asmlinkage sig_handler(int signum) ++static void sig_handler(int signum) + { + switch (signum) { + case SIGALRM: +--- udev-062/udevd.c~noasmlinkage.patch ++++ udev-062/udevd.c +@@ -639,7 +639,7 @@ + return msg; + } + +-static void asmlinkage sig_handler(int signum) ++static void sig_handler(int signum) + { + int rc; + +--- udev-062/udevstart.c~noasmlinkage.patch ++++ udev-062/udevstart.c +@@ -323,7 +323,7 @@ + exec_list(&device_list); + } + +-static void asmlinkage sig_handler(int signum) ++static void sig_handler(int signum) + { + switch (signum) { + case SIGALRM: diff --git a/openembedded/packages/udev/files/slugos/mount.blacklist b/openembedded/packages/udev/files/slugos/mount.blacklist new file mode 100644 index 0000000000..210702f837 --- /dev/null +++ b/openembedded/packages/udev/files/slugos/mount.blacklist @@ -0,0 +1,4 @@ +ram[0-9]$ +mtdblock[0-9]$ +hd[a-z]$ +sd[a-z]$ diff --git a/openembedded/packages/udev/files/spitz/mount.blacklist b/openembedded/packages/udev/files/spitz/mount.blacklist new file mode 100644 index 0000000000..84ff5fc97b --- /dev/null +++ b/openembedded/packages/udev/files/spitz/mount.blacklist @@ -0,0 +1,6 @@ +# This is a grep pattern matched against the device name +# Any matched pattern will _not_ be mounted / removed by udevd + +/dev/mtdblock +/dev/hda +/dev/loop diff --git a/openembedded/packages/udev/files/tosa/mount.blacklist b/openembedded/packages/udev/files/tosa/mount.blacklist new file mode 100644 index 0000000000..c341136eed --- /dev/null +++ b/openembedded/packages/udev/files/tosa/mount.blacklist @@ -0,0 +1,5 @@ +# This is a grep pattern matched against the device name +# Any matched pattern will _not_ be mounted / removed by udevd + +/dev/mtdblock +/dev/loop \ No newline at end of file diff --git a/openembedded/packages/udev/files/udev.rules b/openembedded/packages/udev/files/udev.rules index 044ababa7f..5c566f6cef 100644 --- a/openembedded/packages/udev/files/udev.rules +++ b/openembedded/packages/udev/files/udev.rules @@ -28,7 +28,7 @@ BUS=="usb", KERNEL=="ttyUSB*", SYSFS{product}=="Palm Handheld*", \ # usbfs-like devices SUBSYSTEM=="usb_device", \ - PROGRAM="/bin/sh -c 'X=%k X=$${X#usbdev} B=$${X%%%%.*} D=$${X#*.}; echo bus/usb/$$B/$$D'", SYMLINK+="%c" + PROGRAM="/bin/sh -c 'export X=%k; export X=$${X#usbdev}; export B=$${X%%%%.*}; export D=$${X#*.}; echo bus/usb/$$B/$$D'", SYMLINK+="%c" # serial devices KERNEL=="capi", NAME="capi20", SYMLINK+="isdn/capi20" diff --git a/openembedded/packages/udev/files/udev_network_queue.sh b/openembedded/packages/udev/files/udev_network_queue.sh new file mode 100644 index 0000000000..05e08e9d1b --- /dev/null +++ b/openembedded/packages/udev/files/udev_network_queue.sh @@ -0,0 +1,35 @@ +#! /bin/sh +# +# Copyright Matthias Hentges (c) 2006 +# License: GPL (see http://www.gnu.org/licenses/gpl.txt for a copy of the license) +# +# Filename: udev_network_queue.sh +# Date: 03-May-06 + +do_start() { + if test -e /dev/udev_network_queue + then + echo "Activating queued NICs..." + for NIC in `cat /dev/udev_network_queue` + do + export INTERFACE="$NIC" ; export ACTION=add + /etc/udev/scripts/network.sh + done + echo "" + else + echo "No NICs queued" + fi +} + +do_stop() { + /bin/true +} + +case "$1" in +start) do_start;; +stop) do_stop;; +restart) do_stop + do_start;; +*) echo "Usage: `basename $0` [ start | stop | restart ]" + exit 0;; +esac diff --git a/openembedded/packages/udev/files/udevsynthesize.patch b/openembedded/packages/udev/files/udevsynthesize.patch new file mode 100644 index 0000000000..7811188485 --- /dev/null +++ b/openembedded/packages/udev/files/udevsynthesize.patch @@ -0,0 +1,776 @@ +--- udev-081/udevsynthesize.c.orig 2006-01-29 12:22:45.000000000 +0100 ++++ udev-081/udevsynthesize.c 2006-01-29 12:22:40.000000000 +0100 +@@ -0,0 +1,763 @@ ++/* ++ * udevcoldplug.c ++ * ++ * Copyright (C) 2005 SUSE Linux Products GmbH ++ * ++ * Author: ++ * Kay Sievers ++ * ++ * Synthesize kernel events from sysfs information and pass them ++ * to the udevd daemon. ++ * ++ * 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 version 2 of the License. ++ * ++ * 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, write to the Free Software Foundation, Inc., ++ * 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "udev_libc_wrapper.h" ++#include "udev.h" ++#include "udevd.h" ++#include "udev_version.h" ++#include "logging.h" ++ ++#include "list.h" ++ ++#ifndef DT_DIR ++#define DT_DIR 4 ++#endif ++ ++static const char *udev_log_str; ++static int udevd_sock = -1; ++ ++#ifdef USE_LOG ++void log_message(int priority, const char *format, ...) ++{ ++ va_list args; ++ ++ if (priority > udev_log_priority) ++ return; ++ ++ va_start(args, format); ++ vsyslog(priority, format, args); ++ va_end(args); ++} ++#endif ++ ++struct device { ++ struct list_head node; ++ struct udevd_msg msg; ++ size_t bufpos; ++ char *path; ++}; ++ ++static dev_t read_devt(const char *path) ++{ ++ char filename[PATH_SIZE]; ++ char majorminor[64]; ++ unsigned int major, minor; ++ ssize_t count; ++ int fd; ++ ++ snprintf(filename, sizeof(filename), "%s/%s", path, "dev"); ++ filename[sizeof(filename)-1] = '\0'; ++ ++ fd = open(filename, O_RDONLY); ++ if (fd < 0) ++ return 0; ++ ++ count = read(fd, majorminor, sizeof(majorminor)); ++ close(fd); ++ majorminor[count] = '\0'; ++ if (sscanf(majorminor, "%u:%u", &major, &minor) != 2) ++ return 0; ++ dbg("found major=%d, minor=%d", major, minor); ++ ++ return makedev(major, minor); ++} ++ ++static ssize_t read_file(const char *directory, const char *file, char *str, size_t len) ++{ ++ char filename[PATH_SIZE]; ++ ssize_t count; ++ int fd; ++ ++ memset(filename, 0, sizeof(filename)); ++ snprintf(filename, sizeof(filename), "%s/%s", directory, file); ++ filename[sizeof(filename)-1] = '\0'; ++ ++ fd = open(filename, O_RDONLY); ++ if (fd < 0) ++ return -1; ++ ++ count = read(fd, str, len-1); ++ close(fd); ++ ++ if (count > (ssize_t)len) ++ count = len; ++ str[count-1] = '\0'; ++ ++ return count; ++} ++ ++static ssize_t read_link(const char *directory, const char *file, char *str, size_t size) ++{ ++ char filename[PATH_SIZE]; ++ char target[PATH_SIZE]; ++ int len; ++ char *back; ++ char *strip; ++ int level = 1; ++ ++ snprintf(filename, sizeof(filename), "%s/%s", directory, file); ++ filename[sizeof(filename)-1] = '\0'; ++ ++ len = readlink(filename, target, sizeof(target)-1); ++ if (len < 0) ++ return -1; ++ target[len] = '\0'; ++ ++ back = target; ++ while (strncmp(back, "../", 3) == 0) { ++ back += 3; ++ level++; ++ } ++ while(level--) { ++ strip = strrchr(filename, '/'); ++ if (!strip) ++ return -1; ++ strip[0] = '\0'; ++ } ++ ++ snprintf(str, size, "%s/%s", filename, back); ++ str[size-1] = '\0'; ++ ++ return len; ++} ++ ++static char *add_env_key(struct device *device, const char *key, const char *value) ++{ ++ size_t pos = device->bufpos; ++ device->bufpos += sprintf(&device->msg.envbuf[device->bufpos], "%s=%s", key, value)+1; ++ return &device->msg.envbuf[pos]; ++} ++ ++static struct device *device_create(const char *path, const char *subsystem, dev_t devt) ++{ ++ struct device *device; ++ const char *devpath = &path[strlen(sysfs_path)]; ++ char target[PATH_SIZE]; ++ ++ device = malloc(sizeof(struct device)); ++ if (device == NULL) { ++ dbg("error malloc"); ++ return NULL; ++ } ++ memset(device, 0x00, sizeof(struct device)); ++ ++ device->path = add_env_key(device, "DEVPATH", devpath); ++ device->path += strlen("DEVPATH="); ++ add_env_key(device, "SUBSYSTEM", subsystem); ++ add_env_key(device, "ACTION", "add"); ++ add_env_key(device, "UDEV_COLDPLUG", "1"); ++ ++ if (major(devt)) { ++ char number[32]; ++ sprintf(number, "%u", major(devt)); ++ add_env_key(device, "MAJOR", number); ++ sprintf(number, "%u", minor(devt)); ++ add_env_key(device, "MINOR", number); ++ } ++ ++ if (strncmp(devpath, "/block/", strlen("/block/")) == 0 || ++ strncmp(devpath, "/class/", strlen("/class/")) == 0) { ++ char physpath[PATH_SIZE]; ++ ++ if (read_link(path, "device", physpath, sizeof(physpath)) > (ssize_t)strlen(sysfs_path)) { ++ add_env_key(device, "PHYSDEVPATH", &physpath[strlen(sysfs_path)]); ++ if (read_link(physpath, "driver", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { ++ char *pos = strrchr(target, '/'); ++ if (pos) ++ add_env_key(device, "PHYSDEVDRIVER", &pos[1]); ++ } ++ if (read_link(physpath, "bus", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { ++ char *pos = strrchr(target, '/'); ++ if (pos) ++ add_env_key(device, "PHYSDEVBUS", &pos[1]); ++ } ++ } ++ } else if (strncmp(devpath, "/devices/", strlen("/devices/")) == 0) { ++ if (read_link(path, "driver", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { ++ char *pos = strrchr(target, '/'); ++ if (pos) ++ add_env_key(device, "PHYSDEVDRIVER", &pos[1]); ++ } ++ if (read_link(path, "bus", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { ++ char *pos = strrchr(target, '/'); ++ if (pos) ++ add_env_key(device, "PHYSDEVBUS", &pos[1]); ++ } ++ } ++ ++ return device; ++} ++ ++static int device_list_insert(struct list_head *device_list, struct device *device) ++{ ++ struct device *loop_device; ++ ++ dbg("insert: '%s'", device->path); ++ ++ /* sort files in lexical order */ ++ list_for_each_entry(loop_device, device_list, node) ++ if (strcmp(loop_device->path, device->path) > 0) ++ break; ++ ++ list_add_tail(&device->node, &loop_device->node); ++ ++ return 0; ++} ++ ++static int add_device_udevd(struct device *device) ++{ ++ size_t msg_len; ++ struct sockaddr_un saddr; ++ socklen_t addrlen; ++ int retval; ++ ++ memset(&saddr, 0x00, sizeof(struct sockaddr_un)); ++ saddr.sun_family = AF_LOCAL; ++ /* use abstract namespace for socket path */ ++ strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH); ++ addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1; ++ ++ strcpy(device->msg.magic, UDEV_MAGIC); ++ device->msg.type = UDEVD_UEVENT_UDEVSEND; ++ ++ msg_len = offsetof(struct udevd_msg, envbuf) + device->bufpos; ++ dbg("msg_len=%i", msg_len); ++ ++ retval = sendto(udevd_sock, &device->msg, msg_len, 0, (struct sockaddr *)&saddr, addrlen); ++ if (retval < 0) ++ return -1; ++ ++ return 0; ++} ++ ++static void exec_list(struct list_head *device_list, const char *first[], const char *last[]) ++{ ++ struct device *loop_device; ++ struct device *tmp_device; ++ int i; ++ ++ /* handle the "first" type devices first */ ++ if (first) ++ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) { ++ for (i = 0; first[i] != NULL; i++) { ++ if (strncmp(loop_device->path, first[i], strlen(first[i])) == 0) { ++ add_device_udevd(loop_device); ++ list_del(&loop_device->node); ++ free(loop_device); ++ break; ++ } ++ } ++ } ++ ++ /* handle the devices we are allowed to, excluding the "last" type devices */ ++ if (last) ++ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) { ++ int found = 0; ++ for (i = 0; last[i] != NULL; i++) { ++ if (strncmp(loop_device->path, last[i], strlen(last[i])) == 0) { ++ found = 1; ++ break; ++ } ++ } ++ if (found) ++ continue; ++ ++ add_device_udevd(loop_device); ++ list_del(&loop_device->node); ++ free(loop_device); ++ } ++ ++ /* handle the rest of the devices */ ++ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) { ++ add_device_udevd(loop_device); ++ list_del(&loop_device->node); ++ free(loop_device); ++ } ++} ++ ++static int udev_scan_class(void) ++{ ++ char base[PATH_SIZE]; ++ DIR *dir; ++ struct dirent *dent; ++ LIST_HEAD(device_list); ++ ++ /* we want /dev/null and /dev/console first */ ++ const char *first[] = { ++ "/class/mem", ++ "/class/tty", ++ NULL, ++ }; ++ ++ snprintf(base, sizeof(base), "%s/class", sysfs_path); ++ base[sizeof(base)-1] = '\0'; ++ ++ dir = opendir(base); ++ if (!dir) ++ return -1; ++ ++ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { ++ char dirname[PATH_SIZE]; ++ DIR *dir2; ++ struct dirent *dent2; ++ ++ if (dent->d_name[0] == '.') ++ continue; ++ ++ snprintf(dirname, sizeof(dirname), "%s/%s", base, dent->d_name); ++ dirname[sizeof(dirname)-1] = '\0'; ++ ++ dir2 = opendir(dirname); ++ if (!dir2) ++ continue; ++ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { ++ char dirname2[PATH_SIZE]; ++ struct device *device; ++ dev_t devt; ++ ++ if (dent2->d_name[0] == '.') ++ continue; ++ if (dent2->d_type != DT_DIR) ++ continue; ++ ++ snprintf(dirname2, sizeof(dirname2), "%s/%s", dirname, dent2->d_name); ++ dirname2[sizeof(dirname2)-1] = '\0'; ++ devt = read_devt(dirname2); ++ device = device_create(dirname2, dent->d_name, devt); ++ ++ if (strcmp(dent->d_name, "net") == 0 || ++ strcmp(dent->d_name, "bluetooth") == 0) { ++ add_env_key(device, "INTERFACE", dent2->d_name); ++ } else if (strcmp(dent->d_name, "pcmcia_socket") == 0 && ++ strlen(dent->d_name) > 14) { ++ add_env_key(device, "SOCKET_NO", ++ dent2->d_name + 14); ++ } ++ ++ device_list_insert(&device_list, device); ++ } ++ closedir(dir2); ++ } ++ closedir(dir); ++ exec_list(&device_list, first, NULL); ++ ++ return 0; ++} ++ ++static int udev_scan_block(void) ++{ ++ char base[PATH_SIZE]; ++ DIR *dir; ++ struct dirent *dent; ++ LIST_HEAD(device_list); ++ ++ /* dm wants to have the block devices around before it */ ++ const char *last[] = { ++ "/block/dm", ++ NULL, ++ }; ++ ++ snprintf(base, sizeof(base), "%s/block", sysfs_path); ++ base[sizeof(base)-1] = '\0'; ++ ++ dir = opendir(base); ++ if (!dir) ++ return -1; ++ ++ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { ++ char dirname[PATH_SIZE]; ++ struct device *device; ++ struct dirent *dent2; ++ DIR *dir2; ++ dev_t devt; ++ ++ if (dent->d_name[0] == '.') ++ continue; ++ if (dent->d_type != DT_DIR) ++ continue; ++ ++ snprintf(dirname, sizeof(dirname), "%s/%s", base, dent->d_name); ++ dirname[sizeof(dirname)-1] = '\0'; ++ devt = read_devt(dirname); ++ if (major(devt)) { ++ device = device_create(dirname, "block", devt); ++ device_list_insert(&device_list, device); ++ } ++ ++ /* look for partitions */ ++ dir2 = opendir(dirname); ++ if (!dir2) ++ continue; ++ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { ++ char dirname2[PATH_SIZE]; ++ ++ if (dent2->d_name[0] == '.') ++ continue; ++ if (dent2->d_type != DT_DIR) ++ continue; ++ ++ snprintf(dirname2, sizeof(dirname2), "%s/%s", dirname, dent2->d_name); ++ dirname2[sizeof(dirname2)-1] = '\0'; ++ devt = read_devt(dirname2); ++ if (major(devt)) { ++ device = device_create(dirname2, "block", devt); ++ device_list_insert(&device_list, device); ++ continue; ++ } ++ } ++ closedir(dir2); ++ } ++ closedir(dir); ++ exec_list(&device_list, NULL, last); ++ ++ return 0; ++} ++ ++static int pci_handler(struct device *device) ++{ ++ char path[PATH_SIZE]; ++ char value[PATH_SIZE]; ++ char vendor[PATH_SIZE]; ++ char product[PATH_SIZE]; ++ const char *name; ++ ++ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); ++ path[sizeof(path)-1] = '\0'; ++ ++ if (read_file(path, "modalias", value, sizeof(value)) > 0) ++ add_env_key(device, "MODALIAS", value); ++ ++ name = strrchr(device->path, '/'); ++ if (name) ++ add_env_key(device, "PCI_SLOT_NAME", &name[1]); ++ ++ if (read_file(path, "class", value, sizeof(value)) > 0) ++ add_env_key(device, "PCI_CLASS", &value[2]); ++ ++ if (read_file(path, "vendor", vendor, sizeof(vendor)) > 0 && ++ read_file(path, "device", product, sizeof(product)) > 0) { ++ snprintf(value, sizeof(value), "%s:%s", &vendor[2], &product[2]); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "PCI_ID", value); ++ } ++ ++ if (read_file(path, "subsystem_vendor", vendor, sizeof(vendor)) > 0 && ++ read_file(path, "subsystem_device", product, sizeof(product)) > 0) { ++ snprintf(value, sizeof(value), "%s:%s", &vendor[2], &product[2]); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "PCI_SUBSYS_ID", value); ++ } ++ ++ return 0; ++} ++ ++static int usb_handler(struct device *device) ++{ ++ char path[PATH_SIZE]; ++ char value[PATH_SIZE]; ++ char str1[PATH_SIZE]; ++ char str2[PATH_SIZE]; ++ char str3[PATH_SIZE]; ++ unsigned int int1; ++ unsigned int int2; ++ unsigned int int3; ++ char *pos; ++ ++ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); ++ path[sizeof(path)-1] = '\0'; ++ ++ /* device events have : in their directory name */ ++ pos = strrchr(path, '/'); ++ if (!strchr(pos, ':')) ++ return 0; /* and do not have other variables */ ++ ++ if (read_file(path, "modalias", value, sizeof(value)) > 0) ++ add_env_key(device, "MODALIAS", value); ++ ++ if (read_file(path, "bInterfaceClass", str1, sizeof(str1)) > 0 && ++ read_file(path, "bInterfaceSubClass", str2, sizeof(str2)) > 0 && ++ read_file(path, "bInterfaceProtocol", str3, sizeof(str3)) > 0) { ++ int1 = (int) strtol(str1, NULL, 16); ++ int2 = (int) strtol(str2, NULL, 16); ++ int3 = (int) strtol(str3, NULL, 16); ++ snprintf(value, sizeof(value), "%u/%u/%u", int1, int2, int3); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "INTERFACE", value); ++ } ++ ++ /* move to the parent directory */ ++ pos[0] = '\0'; ++ ++ if (read_file(path, "idVendor", str1, sizeof(str1)) > 0 && ++ read_file(path, "idProduct", str2, sizeof(str2)) > 0 && ++ read_file(path, "bcdDevice", str3, sizeof(str3)) > 0) { ++ int1 = (int) strtol(str1, NULL, 16); ++ int2 = (int) strtol(str2, NULL, 16); ++ int3 = (int) strtol(str3, NULL, 16); ++ snprintf(value, sizeof(value), "%x/%x/%x", int1, int2, int3); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "PRODUCT", value); ++ } ++ ++ if (read_file(path, "bDeviceClass", str1, sizeof(str1)) > 0 && ++ read_file(path, "bDeviceSubClass", str2, sizeof(str2)) > 0 && ++ read_file(path, "bDeviceProtocol", str3, sizeof(str3)) > 0) { ++ int1 = (int) strtol(str1, NULL, 16); ++ int2 = (int) strtol(str2, NULL, 16); ++ int3 = (int) strtol(str3, NULL, 16); ++ snprintf(value, sizeof(value), "%u/%u/%u", int1, int2, int3); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "TYPE", value); ++ } ++ ++ if (read_file(path, "devnum", str2, sizeof(str2)) > 0) { ++ pos = strrchr(path, 'b'); ++ int1 = (int) strtol(pos + 1, NULL, 16); ++ int2 = (int) strtol(str2, NULL, 16); ++ snprintf(value, sizeof(value), ++ "/proc/bus/usb/%03d/%03d", int1, int2); ++ path[sizeof(value)-1] = '\0'; ++ add_env_key(device, "DEVICE", value); ++ } ++ ++ return 0; ++} ++ ++static int serio_handler(struct device *device) ++{ ++ char path[PATH_SIZE]; ++ char value[PATH_SIZE]; ++ ++ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); ++ path[sizeof(path)-1] = '\0'; ++ ++ if (read_file(path, "modalias", value, sizeof(value)) > 0) ++ add_env_key(device, "MODALIAS", value); ++ ++ if (read_file(path, "id/type", value, sizeof(value)) > 0) ++ add_env_key(device, "SERIO_TYPE", value); ++ ++ if (read_file(path, "id/proto", value, sizeof(value)) > 0) ++ add_env_key(device, "SERIO_PROTO", value); ++ ++ if (read_file(path, "id/id", value, sizeof(value)) > 0) ++ add_env_key(device, "SERIO_ID", value); ++ ++ if (read_file(path, "id/extra", value, sizeof(value)) > 0) ++ add_env_key(device, "SERIO_EXTRA", value); ++ ++ return 0; ++} ++ ++static int ccw_handler(struct device *device) ++{ ++ char path[PATH_SIZE]; ++ char value[PATH_SIZE], *tmp; ++ ++ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); ++ path[sizeof(path)-1] = '\0'; ++ ++ if (read_file(path, "modalias", value, sizeof(value)) > 0) ++ add_env_key(device, "MODALIAS", value); ++ ++ if (read_file(path, "cutype", value, sizeof(value)) > 0) { ++ value[4] = 0; ++ tmp = &value[5]; ++ add_env_key(device, "CU_TYPE", value); ++ add_env_key(device, "CU_MODEL", tmp); ++ } ++ ++ if (read_file(path, "devtype", value, sizeof(value)) > 0) { ++ if (value[0] == 'n') { ++ add_env_key(device, "DEV_TYPE", "0000"); ++ add_env_key(device, "DEV_MODEL", "00"); ++ } ++ else { ++ value[4] = 0; ++ tmp = &value[5]; ++ add_env_key(device, "DEV_TYPE", value); ++ add_env_key(device, "DEV_MODEL", tmp); ++ } ++ } ++ ++ return 0; ++} ++ ++static int modalias_handler(struct device *device) ++{ ++ char path[PATH_SIZE]; ++ char value[PATH_SIZE]; ++ ++ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); ++ path[sizeof(path)-1] = '\0'; ++ ++ if (read_file(path, "modalias", value, sizeof(value)) > 0) ++ add_env_key(device, "MODALIAS", value); ++ ++ return 0; ++} ++ ++static int udev_scan_bus(const char *bus, int bus_handler(struct device *device)) ++{ ++ char base[PATH_SIZE]; ++ DIR *dir; ++ struct dirent *dent; ++ LIST_HEAD(device_list); ++ ++ snprintf(base, sizeof(base), "%s/bus/%s/devices", sysfs_path, bus); ++ base[sizeof(base)-1] = '\0'; ++ ++ dir = opendir(base); ++ if (!dir) ++ return -1; ++ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { ++ char devpath[PATH_SIZE]; ++ struct device *device; ++ ++ if (dent->d_name[0] == '.') ++ continue; ++ ++ if (read_link(base, dent->d_name, devpath, sizeof(devpath)) < 0) ++ continue; ++ ++ device = device_create(devpath, bus, makedev(0, 0)); ++ if (bus_handler) { ++ if (bus_handler(device) < 0) { ++ dbg("'%s' bus handler skipped event", devpath); ++ free(device); ++ continue; ++ } ++ } ++ ++ device_list_insert(&device_list, device); ++ } ++ closedir(dir); ++ exec_list(&device_list, NULL, NULL); ++ ++ return 0; ++} ++ ++static int udev_scan_devices(void) ++{ ++ char base[PATH_SIZE]; ++ DIR *dir; ++ struct dirent *dent; ++ ++ snprintf(base, sizeof(base), "%s/bus", sysfs_path); ++ base[sizeof(base)-1] = '\0'; ++ ++ dir = opendir(base); ++ if (!dir) ++ return -1; ++ ++ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { ++ if (dent->d_name[0] == '.') ++ continue; ++ if (dent->d_type != DT_DIR) ++ continue; ++ ++ /* add bus specific env values */ ++ if (strcmp(dent->d_name, "pci") == 0) ++ udev_scan_bus("pci", pci_handler); ++ else if (strcmp(dent->d_name, "usb") == 0) ++ udev_scan_bus("usb", usb_handler); ++ else if (strcmp(dent->d_name, "serio") == 0) ++ udev_scan_bus("serio", serio_handler); ++ else if (strcmp(dent->d_name, "ccw") == 0) ++ udev_scan_bus("ccw", ccw_handler); ++ else ++ udev_scan_bus(dent->d_name, modalias_handler); ++ } ++ closedir(dir); ++ ++ return 0; ++} ++ ++int main(int argc, char *argv[], char *envp[]) ++{ ++ LIST_HEAD(device_list); ++ int i; ++ ++ logging_init("udevcoldplug"); ++ udev_config_init(); sysfs_init(); ++ dbg("version %s", UDEV_VERSION); ++ ++ udev_log_str = getenv("UDEV_LOG"); ++ ++ /* disable all logging if not explicitely requested */ ++ if (udev_log_str == NULL) ++ udev_log_priority = 0; ++ ++ for (i = 1 ; i < argc; i++) { ++ char *arg = argv[i]; ++ ++ if (strcmp(arg, "help") == 0 || strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { ++ printf("Usage: udevcoldplug \n" ++ " --help print this help text\n\n"); ++ exit(0); ++ } else { ++ fprintf(stderr, "unknown option\n\n"); ++ exit(1); ++ } ++ } ++ ++ udevd_sock = socket(AF_LOCAL, SOCK_DGRAM, 0); ++ if (udevd_sock < 0) { ++ err("error getting socket"); ++ return 1; ++ } ++ ++ /* create nodes for already available devices */ ++ udev_scan_class(); ++ udev_scan_block(); ++ ++ /* synthesize events for bus devices ++ * may load modules or configure the device */ ++ udev_scan_devices(); ++ ++ if (udevd_sock >= 0) ++ close(udevd_sock); ++ logging_close(); ++ ++ return 0; ++} +--- udev-081/Makefile ++++ udev-081/Makefile +@@ -58,6 +58,7 @@ PROGRAMS = \ + udevmonitor \ + udevinfo \ + udevtest \ ++ udevsynthesize \ + udevstart + + HEADERS = \ diff --git a/openembedded/packages/udev/files/udevsynthesize.sh b/openembedded/packages/udev/files/udevsynthesize.sh new file mode 100644 index 0000000000..d58217c144 --- /dev/null +++ b/openembedded/packages/udev/files/udevsynthesize.sh @@ -0,0 +1,51 @@ +#!/bin/sh -e + +load_input_modules() { + for module in mousedev evdev joydev; do + modprobe -q $module || true + done +} + +if [ ! -e /sys/class/mem/null/uevent ]; then # <= 2.6.14 + /lib/udev/udevsynthesize + load_input_modules + exit 0 +fi + +# replace $IFS with something which is not likely to appear in a sysfs path, +# because some buggy drivers have spaces in their names +oldifs="$IFS" +IFS="|" + +for file in /sys/bus/*/devices/*/uevent /sys/class/*/*/uevent \ + /sys/block/*/uevent /sys/block/*/*/uevent; do + case "$file" in + */device/uevent) ;; # skip followed device symlinks + */\*/*) ;; + + */class/mem/*) # for /dev/null + first="$first${IFS}$file" ;; + + */block/md[0-9]*) + last="$last${IFS}$file" ;; + + *) + default="$default${IFS}$file" ;; + esac +done + +for file in $first${IFS}$default${IFS}$last; do + [ "$file" ] || continue + echo 'add' > "$file" || true +done + +IFS="$oldifs" + +case "$(uname -r)" in + 2.6.1[0-5]|2.6.1[0-5][!0-9]*) # <= 2.6.15 + load_input_modules + ;; +esac + +exit 0 + diff --git a/openembedded/packages/udev/udev-071/flags.patch b/openembedded/packages/udev/udev-071/flags.patch deleted file mode 100644 index cb17336212..0000000000 --- a/openembedded/packages/udev/udev-071/flags.patch +++ /dev/null @@ -1,72 +0,0 @@ -Index: udev-071/Makefile -=================================================================== ---- udev-071.orig/Makefile 2005-10-19 23:28:34.000000000 +0100 -+++ udev-071/Makefile 2005-11-01 22:04:31.000000000 +0000 -@@ -160,36 +160,36 @@ - # check if compiler option is supported - cc-supports = ${shell if $(CC) ${1} -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi;} - --CFLAGS += -Wall -fno-builtin -Wchar-subscripts -Wpointer-arith \ -+override CFLAGS += -Wall -fno-builtin -Wchar-subscripts -Wpointer-arith \ - -Wstrict-prototypes -Wsign-compare --CFLAGS += $(call cc-supports, -Wdeclaration-after-statement, ) --CFLAGS += -pipe --CFLAGS += -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -+override CFLAGS += $(call cc-supports, -Wdeclaration-after-statement, ) -+override CFLAGS += -pipe -+override CFLAGS += -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 - - # use '-Os' optimization if available, else use -O2 - OPTFLAGS := $(call cc-supports, -Os, -O2) - - # include our local copy of libsysfs --CFLAGS += -I$(PWD)/libsysfs/sysfs \ -+override CFLAGS += -I$(PWD)/libsysfs/sysfs \ - -I$(PWD)/libsysfs - - ifeq ($(strip $(USE_LOG)),true) -- CFLAGS += -DUSE_LOG -+ override CFLAGS += -DUSE_LOG - endif - - # if DEBUG is enabled, then we do not strip or optimize - ifeq ($(strip $(DEBUG)),true) -- CFLAGS += -O1 -g -DDEBUG -+ override CFLAGS += -O1 -g -DDEBUG - LDFLAGS += -Wl - STRIPCMD = /bin/true -Since_we_are_debugging - else -- CFLAGS += $(OPTFLAGS) -fomit-frame-pointer -+ override CFLAGS += $(OPTFLAGS) -fomit-frame-pointer - LDFLAGS += -s -Wl - STRIPCMD = $(STRIP) -s --remove-section=.note --remove-section=.comment - endif - - ifeq ($(strip $(USE_GCOV)),true) -- CFLAGS += -fprofile-arcs -ftest-coverage -+ override CFLAGS += -fprofile-arcs -ftest-coverage - LDFLAGS = -fprofile-arcs - endif - -@@ -200,18 +200,18 @@ - CC = $(KLCC) - LD = $(KLCC) - else -- CFLAGS += -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -+ override CFLAGS += -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations - LDFLAGS += -Wl,-warn-common - endif - - ifeq ($(strip $(USE_SELINUX)),true) - UDEV_OBJS += udev_selinux.o - LIB_OBJS += -lselinux -lsepol -- CFLAGS += -DUSE_SELINUX -+ override CFLAGS += -DUSE_SELINUX - endif - - ifeq ($(strip $(USE_STATIC)),true) -- CFLAGS += -DUSE_STATIC -+ override CFLAGS += -DUSE_STATIC - LDFLAGS += -static - endif - diff --git a/openembedded/packages/udev/udev-071/noasmlinkage.patch b/openembedded/packages/udev/udev-071/noasmlinkage.patch deleted file mode 100644 index 0d8e854c0e..0000000000 --- a/openembedded/packages/udev/udev-071/noasmlinkage.patch +++ /dev/null @@ -1,38 +0,0 @@ - -# -# Patch managed by http://www.holgerschurig.de/patcher.html -# - ---- udev-062/udev.c~noasmlinkage.patch -+++ udev-062/udev.c -@@ -54,7 +54,7 @@ - } - #endif - --static void asmlinkage sig_handler(int signum) -+static void sig_handler(int signum) - { - switch (signum) { - case SIGALRM: ---- udev-062/udevd.c~noasmlinkage.patch -+++ udev-062/udevd.c -@@ -639,7 +639,7 @@ - return msg; - } - --static void asmlinkage sig_handler(int signum) -+static void sig_handler(int signum) - { - int rc; - ---- udev-062/udevstart.c~noasmlinkage.patch -+++ udev-062/udevstart.c -@@ -323,7 +323,7 @@ - exec_list(&device_list); - } - --static void asmlinkage sig_handler(int signum) -+static void sig_handler(int signum) - { - switch (signum) { - case SIGALRM: diff --git a/openembedded/packages/udev/udev-071/tty-symlinks.patch b/openembedded/packages/udev/udev-071/tty-symlinks.patch deleted file mode 100644 index 28bdf92af8..0000000000 --- a/openembedded/packages/udev/udev-071/tty-symlinks.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- udev-068/etc/udev/udev-devfs.rules.orig 2005-08-22 20:22:18.000000000 +0200 -+++ udev-068/etc/udev/udev-devfs.rules 2005-08-22 20:22:44.000000000 +0200 -@@ -14,8 +14,8 @@ - KERNEL="fd[0-9]*", NAME="floppy/%n" - - # tty devices --KERNEL="tty[0-9]*", NAME="vc/%n" --KERNEL="ttyS[0-9]*", NAME="tts/%n" -+KERNEL="tty[0-9]*", NAME="vc/%n", SYMLINK="%k" -+KERNEL="ttyS[0-9]*", NAME="tts/%n", SYMLINK="%k" - KERNEL="ttyUSB[0-9]*", NAME="tts/USB%n" - - # vc devices diff --git a/openembedded/packages/udev/udev-084/init b/openembedded/packages/udev/udev-084/init index 3138e5554c..5a60d52a9a 100644 --- a/openembedded/packages/udev/udev-084/init +++ b/openembedded/packages/udev/udev-084/init @@ -204,12 +204,12 @@ case "$1" in stop) echo "Stopping the hotplug events dispatcher" "udevd" - start-stop-daemon --stop --name udevd --quiet --oknodo --retry 5 + start-stop-daemon --stop --name udevd --quiet ;; restart|force-reload) echo "Stopping the hotplug events dispatcher" "udevd" - if start-stop-daemon --stop --name udevd --quiet --oknodo --retry 5; then + if start-stop-daemon --stop --name udevd --quiet ; then exit 1 fi diff --git a/openembedded/packages/udev/udev-084/local.rules b/openembedded/packages/udev/udev-084/local.rules new file mode 100644 index 0000000000..bb8459ba23 --- /dev/null +++ b/openembedded/packages/udev/udev-084/local.rules @@ -0,0 +1,28 @@ +# There are a number of modifiers that are allowed to be used in some +# of the different fields. They provide the following subsitutions: +# +# %n the "kernel number" of the device. +# For example, 'sda3' has a "kernel number" of '3' +# %e the smallest number for that name which does not matches an existing node +# %k the kernel name for the device +# %M the kernel major number for the device +# %m the kernel minor number for the device +# %b the bus id for the device +# %c the string returned by the PROGRAM +# %s{filename} the content of a sysfs attribute +# %% the '%' char itself +# + +# Media automounting +SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh" +SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh" + +# Handle network interface setup +SUBSYSTEM=="net", ACTION=="add" RUN+="/etc/udev/scripts/network.sh" +SUBSYSTEM=="net", ACTION=="remove" RUN+="/etc/udev/scripts/network.sh" + +# The first rtc device is symlinked to /dev/rtc +KERNEL="rtc0", SYMLINK="rtc" + +# Try and modprobe for drivers for new hardware +ACTION="add", DEVPATH="/devices/*", MODALIAS=="?*", RUN+="/sbin/modprobe $modalias" diff --git a/openembedded/packages/udev/udev-084/noasmlinkage.patch b/openembedded/packages/udev/udev-084/noasmlinkage.patch deleted file mode 100644 index 0d8e854c0e..0000000000 --- a/openembedded/packages/udev/udev-084/noasmlinkage.patch +++ /dev/null @@ -1,38 +0,0 @@ - -# -# Patch managed by http://www.holgerschurig.de/patcher.html -# - ---- udev-062/udev.c~noasmlinkage.patch -+++ udev-062/udev.c -@@ -54,7 +54,7 @@ - } - #endif - --static void asmlinkage sig_handler(int signum) -+static void sig_handler(int signum) - { - switch (signum) { - case SIGALRM: ---- udev-062/udevd.c~noasmlinkage.patch -+++ udev-062/udevd.c -@@ -639,7 +639,7 @@ - return msg; - } - --static void asmlinkage sig_handler(int signum) -+static void sig_handler(int signum) - { - int rc; - ---- udev-062/udevstart.c~noasmlinkage.patch -+++ udev-062/udevstart.c -@@ -323,7 +323,7 @@ - exec_list(&device_list); - } - --static void asmlinkage sig_handler(int signum) -+static void sig_handler(int signum) - { - switch (signum) { - case SIGALRM: diff --git a/openembedded/packages/udev/udev-084/udev.rules b/openembedded/packages/udev/udev-084/udev.rules index 6308cb0918..3ac51b301a 100644 --- a/openembedded/packages/udev/udev-084/udev.rules +++ b/openembedded/packages/udev/udev-084/udev.rules @@ -15,6 +15,7 @@ # SCSI devices BUS=="scsi", KERNEL=="sr[0-9]*", NAME="scd%n", SYMLINK+="sr%n" +SUBSYSTEM=="scsi_device", SYSFS{type}=="0|7|14", RUN+="/sbin/modprobe sd_mod" # USB devices BUS=="usb", KERNEL=="auer[0-9]*", NAME="usb/%k" @@ -28,7 +29,7 @@ BUS=="usb", KERNEL=="ttyUSB*", SYSFS{product}=="Palm Handheld*", \ # usbfs-like devices SUBSYSTEM=="usb_device", \ - PROGRAM="/bin/sh -c 'X=%k X=$${X#usbdev} B=$${X%%%%.*} D=$${X#*.}; echo bus/usb/$$B/$$D'", SYMLINK+="%c" + PROGRAM="/bin/sh -c 'export X=%k; export X=$${X#usbdev}; export B=$${X%%%%.*}; export D=$${X#*.}; echo bus/usb/$$B/$$D'", SYMLINK+="%c" # serial devices KERNEL=="capi", NAME="capi20", SYMLINK+="isdn/capi20" diff --git a/openembedded/packages/udev/udev-084/udevsynthesize.patch b/openembedded/packages/udev/udev-084/udevsynthesize.patch deleted file mode 100644 index 7811188485..0000000000 --- a/openembedded/packages/udev/udev-084/udevsynthesize.patch +++ /dev/null @@ -1,776 +0,0 @@ ---- udev-081/udevsynthesize.c.orig 2006-01-29 12:22:45.000000000 +0100 -+++ udev-081/udevsynthesize.c 2006-01-29 12:22:40.000000000 +0100 -@@ -0,0 +1,763 @@ -+/* -+ * udevcoldplug.c -+ * -+ * Copyright (C) 2005 SUSE Linux Products GmbH -+ * -+ * Author: -+ * Kay Sievers -+ * -+ * Synthesize kernel events from sysfs information and pass them -+ * to the udevd daemon. -+ * -+ * 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 version 2 of the License. -+ * -+ * 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, write to the Free Software Foundation, Inc., -+ * 675 Mass Ave, Cambridge, MA 02139, USA. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "udev_libc_wrapper.h" -+#include "udev.h" -+#include "udevd.h" -+#include "udev_version.h" -+#include "logging.h" -+ -+#include "list.h" -+ -+#ifndef DT_DIR -+#define DT_DIR 4 -+#endif -+ -+static const char *udev_log_str; -+static int udevd_sock = -1; -+ -+#ifdef USE_LOG -+void log_message(int priority, const char *format, ...) -+{ -+ va_list args; -+ -+ if (priority > udev_log_priority) -+ return; -+ -+ va_start(args, format); -+ vsyslog(priority, format, args); -+ va_end(args); -+} -+#endif -+ -+struct device { -+ struct list_head node; -+ struct udevd_msg msg; -+ size_t bufpos; -+ char *path; -+}; -+ -+static dev_t read_devt(const char *path) -+{ -+ char filename[PATH_SIZE]; -+ char majorminor[64]; -+ unsigned int major, minor; -+ ssize_t count; -+ int fd; -+ -+ snprintf(filename, sizeof(filename), "%s/%s", path, "dev"); -+ filename[sizeof(filename)-1] = '\0'; -+ -+ fd = open(filename, O_RDONLY); -+ if (fd < 0) -+ return 0; -+ -+ count = read(fd, majorminor, sizeof(majorminor)); -+ close(fd); -+ majorminor[count] = '\0'; -+ if (sscanf(majorminor, "%u:%u", &major, &minor) != 2) -+ return 0; -+ dbg("found major=%d, minor=%d", major, minor); -+ -+ return makedev(major, minor); -+} -+ -+static ssize_t read_file(const char *directory, const char *file, char *str, size_t len) -+{ -+ char filename[PATH_SIZE]; -+ ssize_t count; -+ int fd; -+ -+ memset(filename, 0, sizeof(filename)); -+ snprintf(filename, sizeof(filename), "%s/%s", directory, file); -+ filename[sizeof(filename)-1] = '\0'; -+ -+ fd = open(filename, O_RDONLY); -+ if (fd < 0) -+ return -1; -+ -+ count = read(fd, str, len-1); -+ close(fd); -+ -+ if (count > (ssize_t)len) -+ count = len; -+ str[count-1] = '\0'; -+ -+ return count; -+} -+ -+static ssize_t read_link(const char *directory, const char *file, char *str, size_t size) -+{ -+ char filename[PATH_SIZE]; -+ char target[PATH_SIZE]; -+ int len; -+ char *back; -+ char *strip; -+ int level = 1; -+ -+ snprintf(filename, sizeof(filename), "%s/%s", directory, file); -+ filename[sizeof(filename)-1] = '\0'; -+ -+ len = readlink(filename, target, sizeof(target)-1); -+ if (len < 0) -+ return -1; -+ target[len] = '\0'; -+ -+ back = target; -+ while (strncmp(back, "../", 3) == 0) { -+ back += 3; -+ level++; -+ } -+ while(level--) { -+ strip = strrchr(filename, '/'); -+ if (!strip) -+ return -1; -+ strip[0] = '\0'; -+ } -+ -+ snprintf(str, size, "%s/%s", filename, back); -+ str[size-1] = '\0'; -+ -+ return len; -+} -+ -+static char *add_env_key(struct device *device, const char *key, const char *value) -+{ -+ size_t pos = device->bufpos; -+ device->bufpos += sprintf(&device->msg.envbuf[device->bufpos], "%s=%s", key, value)+1; -+ return &device->msg.envbuf[pos]; -+} -+ -+static struct device *device_create(const char *path, const char *subsystem, dev_t devt) -+{ -+ struct device *device; -+ const char *devpath = &path[strlen(sysfs_path)]; -+ char target[PATH_SIZE]; -+ -+ device = malloc(sizeof(struct device)); -+ if (device == NULL) { -+ dbg("error malloc"); -+ return NULL; -+ } -+ memset(device, 0x00, sizeof(struct device)); -+ -+ device->path = add_env_key(device, "DEVPATH", devpath); -+ device->path += strlen("DEVPATH="); -+ add_env_key(device, "SUBSYSTEM", subsystem); -+ add_env_key(device, "ACTION", "add"); -+ add_env_key(device, "UDEV_COLDPLUG", "1"); -+ -+ if (major(devt)) { -+ char number[32]; -+ sprintf(number, "%u", major(devt)); -+ add_env_key(device, "MAJOR", number); -+ sprintf(number, "%u", minor(devt)); -+ add_env_key(device, "MINOR", number); -+ } -+ -+ if (strncmp(devpath, "/block/", strlen("/block/")) == 0 || -+ strncmp(devpath, "/class/", strlen("/class/")) == 0) { -+ char physpath[PATH_SIZE]; -+ -+ if (read_link(path, "device", physpath, sizeof(physpath)) > (ssize_t)strlen(sysfs_path)) { -+ add_env_key(device, "PHYSDEVPATH", &physpath[strlen(sysfs_path)]); -+ if (read_link(physpath, "driver", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { -+ char *pos = strrchr(target, '/'); -+ if (pos) -+ add_env_key(device, "PHYSDEVDRIVER", &pos[1]); -+ } -+ if (read_link(physpath, "bus", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { -+ char *pos = strrchr(target, '/'); -+ if (pos) -+ add_env_key(device, "PHYSDEVBUS", &pos[1]); -+ } -+ } -+ } else if (strncmp(devpath, "/devices/", strlen("/devices/")) == 0) { -+ if (read_link(path, "driver", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { -+ char *pos = strrchr(target, '/'); -+ if (pos) -+ add_env_key(device, "PHYSDEVDRIVER", &pos[1]); -+ } -+ if (read_link(path, "bus", target, sizeof(target)) > (ssize_t)strlen(sysfs_path)) { -+ char *pos = strrchr(target, '/'); -+ if (pos) -+ add_env_key(device, "PHYSDEVBUS", &pos[1]); -+ } -+ } -+ -+ return device; -+} -+ -+static int device_list_insert(struct list_head *device_list, struct device *device) -+{ -+ struct device *loop_device; -+ -+ dbg("insert: '%s'", device->path); -+ -+ /* sort files in lexical order */ -+ list_for_each_entry(loop_device, device_list, node) -+ if (strcmp(loop_device->path, device->path) > 0) -+ break; -+ -+ list_add_tail(&device->node, &loop_device->node); -+ -+ return 0; -+} -+ -+static int add_device_udevd(struct device *device) -+{ -+ size_t msg_len; -+ struct sockaddr_un saddr; -+ socklen_t addrlen; -+ int retval; -+ -+ memset(&saddr, 0x00, sizeof(struct sockaddr_un)); -+ saddr.sun_family = AF_LOCAL; -+ /* use abstract namespace for socket path */ -+ strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH); -+ addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1; -+ -+ strcpy(device->msg.magic, UDEV_MAGIC); -+ device->msg.type = UDEVD_UEVENT_UDEVSEND; -+ -+ msg_len = offsetof(struct udevd_msg, envbuf) + device->bufpos; -+ dbg("msg_len=%i", msg_len); -+ -+ retval = sendto(udevd_sock, &device->msg, msg_len, 0, (struct sockaddr *)&saddr, addrlen); -+ if (retval < 0) -+ return -1; -+ -+ return 0; -+} -+ -+static void exec_list(struct list_head *device_list, const char *first[], const char *last[]) -+{ -+ struct device *loop_device; -+ struct device *tmp_device; -+ int i; -+ -+ /* handle the "first" type devices first */ -+ if (first) -+ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) { -+ for (i = 0; first[i] != NULL; i++) { -+ if (strncmp(loop_device->path, first[i], strlen(first[i])) == 0) { -+ add_device_udevd(loop_device); -+ list_del(&loop_device->node); -+ free(loop_device); -+ break; -+ } -+ } -+ } -+ -+ /* handle the devices we are allowed to, excluding the "last" type devices */ -+ if (last) -+ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) { -+ int found = 0; -+ for (i = 0; last[i] != NULL; i++) { -+ if (strncmp(loop_device->path, last[i], strlen(last[i])) == 0) { -+ found = 1; -+ break; -+ } -+ } -+ if (found) -+ continue; -+ -+ add_device_udevd(loop_device); -+ list_del(&loop_device->node); -+ free(loop_device); -+ } -+ -+ /* handle the rest of the devices */ -+ list_for_each_entry_safe(loop_device, tmp_device, device_list, node) { -+ add_device_udevd(loop_device); -+ list_del(&loop_device->node); -+ free(loop_device); -+ } -+} -+ -+static int udev_scan_class(void) -+{ -+ char base[PATH_SIZE]; -+ DIR *dir; -+ struct dirent *dent; -+ LIST_HEAD(device_list); -+ -+ /* we want /dev/null and /dev/console first */ -+ const char *first[] = { -+ "/class/mem", -+ "/class/tty", -+ NULL, -+ }; -+ -+ snprintf(base, sizeof(base), "%s/class", sysfs_path); -+ base[sizeof(base)-1] = '\0'; -+ -+ dir = opendir(base); -+ if (!dir) -+ return -1; -+ -+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { -+ char dirname[PATH_SIZE]; -+ DIR *dir2; -+ struct dirent *dent2; -+ -+ if (dent->d_name[0] == '.') -+ continue; -+ -+ snprintf(dirname, sizeof(dirname), "%s/%s", base, dent->d_name); -+ dirname[sizeof(dirname)-1] = '\0'; -+ -+ dir2 = opendir(dirname); -+ if (!dir2) -+ continue; -+ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { -+ char dirname2[PATH_SIZE]; -+ struct device *device; -+ dev_t devt; -+ -+ if (dent2->d_name[0] == '.') -+ continue; -+ if (dent2->d_type != DT_DIR) -+ continue; -+ -+ snprintf(dirname2, sizeof(dirname2), "%s/%s", dirname, dent2->d_name); -+ dirname2[sizeof(dirname2)-1] = '\0'; -+ devt = read_devt(dirname2); -+ device = device_create(dirname2, dent->d_name, devt); -+ -+ if (strcmp(dent->d_name, "net") == 0 || -+ strcmp(dent->d_name, "bluetooth") == 0) { -+ add_env_key(device, "INTERFACE", dent2->d_name); -+ } else if (strcmp(dent->d_name, "pcmcia_socket") == 0 && -+ strlen(dent->d_name) > 14) { -+ add_env_key(device, "SOCKET_NO", -+ dent2->d_name + 14); -+ } -+ -+ device_list_insert(&device_list, device); -+ } -+ closedir(dir2); -+ } -+ closedir(dir); -+ exec_list(&device_list, first, NULL); -+ -+ return 0; -+} -+ -+static int udev_scan_block(void) -+{ -+ char base[PATH_SIZE]; -+ DIR *dir; -+ struct dirent *dent; -+ LIST_HEAD(device_list); -+ -+ /* dm wants to have the block devices around before it */ -+ const char *last[] = { -+ "/block/dm", -+ NULL, -+ }; -+ -+ snprintf(base, sizeof(base), "%s/block", sysfs_path); -+ base[sizeof(base)-1] = '\0'; -+ -+ dir = opendir(base); -+ if (!dir) -+ return -1; -+ -+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { -+ char dirname[PATH_SIZE]; -+ struct device *device; -+ struct dirent *dent2; -+ DIR *dir2; -+ dev_t devt; -+ -+ if (dent->d_name[0] == '.') -+ continue; -+ if (dent->d_type != DT_DIR) -+ continue; -+ -+ snprintf(dirname, sizeof(dirname), "%s/%s", base, dent->d_name); -+ dirname[sizeof(dirname)-1] = '\0'; -+ devt = read_devt(dirname); -+ if (major(devt)) { -+ device = device_create(dirname, "block", devt); -+ device_list_insert(&device_list, device); -+ } -+ -+ /* look for partitions */ -+ dir2 = opendir(dirname); -+ if (!dir2) -+ continue; -+ for (dent2 = readdir(dir2); dent2 != NULL; dent2 = readdir(dir2)) { -+ char dirname2[PATH_SIZE]; -+ -+ if (dent2->d_name[0] == '.') -+ continue; -+ if (dent2->d_type != DT_DIR) -+ continue; -+ -+ snprintf(dirname2, sizeof(dirname2), "%s/%s", dirname, dent2->d_name); -+ dirname2[sizeof(dirname2)-1] = '\0'; -+ devt = read_devt(dirname2); -+ if (major(devt)) { -+ device = device_create(dirname2, "block", devt); -+ device_list_insert(&device_list, device); -+ continue; -+ } -+ } -+ closedir(dir2); -+ } -+ closedir(dir); -+ exec_list(&device_list, NULL, last); -+ -+ return 0; -+} -+ -+static int pci_handler(struct device *device) -+{ -+ char path[PATH_SIZE]; -+ char value[PATH_SIZE]; -+ char vendor[PATH_SIZE]; -+ char product[PATH_SIZE]; -+ const char *name; -+ -+ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); -+ path[sizeof(path)-1] = '\0'; -+ -+ if (read_file(path, "modalias", value, sizeof(value)) > 0) -+ add_env_key(device, "MODALIAS", value); -+ -+ name = strrchr(device->path, '/'); -+ if (name) -+ add_env_key(device, "PCI_SLOT_NAME", &name[1]); -+ -+ if (read_file(path, "class", value, sizeof(value)) > 0) -+ add_env_key(device, "PCI_CLASS", &value[2]); -+ -+ if (read_file(path, "vendor", vendor, sizeof(vendor)) > 0 && -+ read_file(path, "device", product, sizeof(product)) > 0) { -+ snprintf(value, sizeof(value), "%s:%s", &vendor[2], &product[2]); -+ path[sizeof(value)-1] = '\0'; -+ add_env_key(device, "PCI_ID", value); -+ } -+ -+ if (read_file(path, "subsystem_vendor", vendor, sizeof(vendor)) > 0 && -+ read_file(path, "subsystem_device", product, sizeof(product)) > 0) { -+ snprintf(value, sizeof(value), "%s:%s", &vendor[2], &product[2]); -+ path[sizeof(value)-1] = '\0'; -+ add_env_key(device, "PCI_SUBSYS_ID", value); -+ } -+ -+ return 0; -+} -+ -+static int usb_handler(struct device *device) -+{ -+ char path[PATH_SIZE]; -+ char value[PATH_SIZE]; -+ char str1[PATH_SIZE]; -+ char str2[PATH_SIZE]; -+ char str3[PATH_SIZE]; -+ unsigned int int1; -+ unsigned int int2; -+ unsigned int int3; -+ char *pos; -+ -+ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); -+ path[sizeof(path)-1] = '\0'; -+ -+ /* device events have : in their directory name */ -+ pos = strrchr(path, '/'); -+ if (!strchr(pos, ':')) -+ return 0; /* and do not have other variables */ -+ -+ if (read_file(path, "modalias", value, sizeof(value)) > 0) -+ add_env_key(device, "MODALIAS", value); -+ -+ if (read_file(path, "bInterfaceClass", str1, sizeof(str1)) > 0 && -+ read_file(path, "bInterfaceSubClass", str2, sizeof(str2)) > 0 && -+ read_file(path, "bInterfaceProtocol", str3, sizeof(str3)) > 0) { -+ int1 = (int) strtol(str1, NULL, 16); -+ int2 = (int) strtol(str2, NULL, 16); -+ int3 = (int) strtol(str3, NULL, 16); -+ snprintf(value, sizeof(value), "%u/%u/%u", int1, int2, int3); -+ path[sizeof(value)-1] = '\0'; -+ add_env_key(device, "INTERFACE", value); -+ } -+ -+ /* move to the parent directory */ -+ pos[0] = '\0'; -+ -+ if (read_file(path, "idVendor", str1, sizeof(str1)) > 0 && -+ read_file(path, "idProduct", str2, sizeof(str2)) > 0 && -+ read_file(path, "bcdDevice", str3, sizeof(str3)) > 0) { -+ int1 = (int) strtol(str1, NULL, 16); -+ int2 = (int) strtol(str2, NULL, 16); -+ int3 = (int) strtol(str3, NULL, 16); -+ snprintf(value, sizeof(value), "%x/%x/%x", int1, int2, int3); -+ path[sizeof(value)-1] = '\0'; -+ add_env_key(device, "PRODUCT", value); -+ } -+ -+ if (read_file(path, "bDeviceClass", str1, sizeof(str1)) > 0 && -+ read_file(path, "bDeviceSubClass", str2, sizeof(str2)) > 0 && -+ read_file(path, "bDeviceProtocol", str3, sizeof(str3)) > 0) { -+ int1 = (int) strtol(str1, NULL, 16); -+ int2 = (int) strtol(str2, NULL, 16); -+ int3 = (int) strtol(str3, NULL, 16); -+ snprintf(value, sizeof(value), "%u/%u/%u", int1, int2, int3); -+ path[sizeof(value)-1] = '\0'; -+ add_env_key(device, "TYPE", value); -+ } -+ -+ if (read_file(path, "devnum", str2, sizeof(str2)) > 0) { -+ pos = strrchr(path, 'b'); -+ int1 = (int) strtol(pos + 1, NULL, 16); -+ int2 = (int) strtol(str2, NULL, 16); -+ snprintf(value, sizeof(value), -+ "/proc/bus/usb/%03d/%03d", int1, int2); -+ path[sizeof(value)-1] = '\0'; -+ add_env_key(device, "DEVICE", value); -+ } -+ -+ return 0; -+} -+ -+static int serio_handler(struct device *device) -+{ -+ char path[PATH_SIZE]; -+ char value[PATH_SIZE]; -+ -+ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); -+ path[sizeof(path)-1] = '\0'; -+ -+ if (read_file(path, "modalias", value, sizeof(value)) > 0) -+ add_env_key(device, "MODALIAS", value); -+ -+ if (read_file(path, "id/type", value, sizeof(value)) > 0) -+ add_env_key(device, "SERIO_TYPE", value); -+ -+ if (read_file(path, "id/proto", value, sizeof(value)) > 0) -+ add_env_key(device, "SERIO_PROTO", value); -+ -+ if (read_file(path, "id/id", value, sizeof(value)) > 0) -+ add_env_key(device, "SERIO_ID", value); -+ -+ if (read_file(path, "id/extra", value, sizeof(value)) > 0) -+ add_env_key(device, "SERIO_EXTRA", value); -+ -+ return 0; -+} -+ -+static int ccw_handler(struct device *device) -+{ -+ char path[PATH_SIZE]; -+ char value[PATH_SIZE], *tmp; -+ -+ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); -+ path[sizeof(path)-1] = '\0'; -+ -+ if (read_file(path, "modalias", value, sizeof(value)) > 0) -+ add_env_key(device, "MODALIAS", value); -+ -+ if (read_file(path, "cutype", value, sizeof(value)) > 0) { -+ value[4] = 0; -+ tmp = &value[5]; -+ add_env_key(device, "CU_TYPE", value); -+ add_env_key(device, "CU_MODEL", tmp); -+ } -+ -+ if (read_file(path, "devtype", value, sizeof(value)) > 0) { -+ if (value[0] == 'n') { -+ add_env_key(device, "DEV_TYPE", "0000"); -+ add_env_key(device, "DEV_MODEL", "00"); -+ } -+ else { -+ value[4] = 0; -+ tmp = &value[5]; -+ add_env_key(device, "DEV_TYPE", value); -+ add_env_key(device, "DEV_MODEL", tmp); -+ } -+ } -+ -+ return 0; -+} -+ -+static int modalias_handler(struct device *device) -+{ -+ char path[PATH_SIZE]; -+ char value[PATH_SIZE]; -+ -+ snprintf(path, sizeof(path), "%s%s", sysfs_path, device->path); -+ path[sizeof(path)-1] = '\0'; -+ -+ if (read_file(path, "modalias", value, sizeof(value)) > 0) -+ add_env_key(device, "MODALIAS", value); -+ -+ return 0; -+} -+ -+static int udev_scan_bus(const char *bus, int bus_handler(struct device *device)) -+{ -+ char base[PATH_SIZE]; -+ DIR *dir; -+ struct dirent *dent; -+ LIST_HEAD(device_list); -+ -+ snprintf(base, sizeof(base), "%s/bus/%s/devices", sysfs_path, bus); -+ base[sizeof(base)-1] = '\0'; -+ -+ dir = opendir(base); -+ if (!dir) -+ return -1; -+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { -+ char devpath[PATH_SIZE]; -+ struct device *device; -+ -+ if (dent->d_name[0] == '.') -+ continue; -+ -+ if (read_link(base, dent->d_name, devpath, sizeof(devpath)) < 0) -+ continue; -+ -+ device = device_create(devpath, bus, makedev(0, 0)); -+ if (bus_handler) { -+ if (bus_handler(device) < 0) { -+ dbg("'%s' bus handler skipped event", devpath); -+ free(device); -+ continue; -+ } -+ } -+ -+ device_list_insert(&device_list, device); -+ } -+ closedir(dir); -+ exec_list(&device_list, NULL, NULL); -+ -+ return 0; -+} -+ -+static int udev_scan_devices(void) -+{ -+ char base[PATH_SIZE]; -+ DIR *dir; -+ struct dirent *dent; -+ -+ snprintf(base, sizeof(base), "%s/bus", sysfs_path); -+ base[sizeof(base)-1] = '\0'; -+ -+ dir = opendir(base); -+ if (!dir) -+ return -1; -+ -+ for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { -+ if (dent->d_name[0] == '.') -+ continue; -+ if (dent->d_type != DT_DIR) -+ continue; -+ -+ /* add bus specific env values */ -+ if (strcmp(dent->d_name, "pci") == 0) -+ udev_scan_bus("pci", pci_handler); -+ else if (strcmp(dent->d_name, "usb") == 0) -+ udev_scan_bus("usb", usb_handler); -+ else if (strcmp(dent->d_name, "serio") == 0) -+ udev_scan_bus("serio", serio_handler); -+ else if (strcmp(dent->d_name, "ccw") == 0) -+ udev_scan_bus("ccw", ccw_handler); -+ else -+ udev_scan_bus(dent->d_name, modalias_handler); -+ } -+ closedir(dir); -+ -+ return 0; -+} -+ -+int main(int argc, char *argv[], char *envp[]) -+{ -+ LIST_HEAD(device_list); -+ int i; -+ -+ logging_init("udevcoldplug"); -+ udev_config_init(); sysfs_init(); -+ dbg("version %s", UDEV_VERSION); -+ -+ udev_log_str = getenv("UDEV_LOG"); -+ -+ /* disable all logging if not explicitely requested */ -+ if (udev_log_str == NULL) -+ udev_log_priority = 0; -+ -+ for (i = 1 ; i < argc; i++) { -+ char *arg = argv[i]; -+ -+ if (strcmp(arg, "help") == 0 || strcmp(arg, "--help") == 0 || strcmp(arg, "-h") == 0) { -+ printf("Usage: udevcoldplug \n" -+ " --help print this help text\n\n"); -+ exit(0); -+ } else { -+ fprintf(stderr, "unknown option\n\n"); -+ exit(1); -+ } -+ } -+ -+ udevd_sock = socket(AF_LOCAL, SOCK_DGRAM, 0); -+ if (udevd_sock < 0) { -+ err("error getting socket"); -+ return 1; -+ } -+ -+ /* create nodes for already available devices */ -+ udev_scan_class(); -+ udev_scan_block(); -+ -+ /* synthesize events for bus devices -+ * may load modules or configure the device */ -+ udev_scan_devices(); -+ -+ if (udevd_sock >= 0) -+ close(udevd_sock); -+ logging_close(); -+ -+ return 0; -+} ---- udev-081/Makefile -+++ udev-081/Makefile -@@ -58,6 +58,7 @@ PROGRAMS = \ - udevmonitor \ - udevinfo \ - udevtest \ -+ udevsynthesize \ - udevstart - - HEADERS = \ diff --git a/openembedded/packages/udev/udev-084/udevsynthesize.sh b/openembedded/packages/udev/udev-084/udevsynthesize.sh deleted file mode 100644 index d58217c144..0000000000 --- a/openembedded/packages/udev/udev-084/udevsynthesize.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh -e - -load_input_modules() { - for module in mousedev evdev joydev; do - modprobe -q $module || true - done -} - -if [ ! -e /sys/class/mem/null/uevent ]; then # <= 2.6.14 - /lib/udev/udevsynthesize - load_input_modules - exit 0 -fi - -# replace $IFS with something which is not likely to appear in a sysfs path, -# because some buggy drivers have spaces in their names -oldifs="$IFS" -IFS="|" - -for file in /sys/bus/*/devices/*/uevent /sys/class/*/*/uevent \ - /sys/block/*/uevent /sys/block/*/*/uevent; do - case "$file" in - */device/uevent) ;; # skip followed device symlinks - */\*/*) ;; - - */class/mem/*) # for /dev/null - first="$first${IFS}$file" ;; - - */block/md[0-9]*) - last="$last${IFS}$file" ;; - - *) - default="$default${IFS}$file" ;; - esac -done - -for file in $first${IFS}$default${IFS}$last; do - [ "$file" ] || continue - echo 'add' > "$file" || true -done - -IFS="$oldifs" - -case "$(uname -r)" in - 2.6.1[0-5]|2.6.1[0-5][!0-9]*) # <= 2.6.15 - load_input_modules - ;; -esac - -exit 0 - diff --git a/openembedded/packages/udev/udev.inc b/openembedded/packages/udev/udev.inc index a2883aef50..a3896a6978 100644 --- a/openembedded/packages/udev/udev.inc +++ b/openembedded/packages/udev/udev.inc @@ -20,7 +20,7 @@ FILES_udev-utils = "${usrbindir}/udevinfo ${usrbindir}/udevtest" inherit update-rc.d INITSCRIPT_NAME = "udev" -INITSCRIPT_PARAMS = "start 04 S . start 55 0 6 ." +INITSCRIPT_PARAMS = "start 04 S ." export CROSS = "${TARGET_PREFIX}" export HOSTCC = "${BUILD_CC}" diff --git a/openembedded/packages/udev/udev_071.bb b/openembedded/packages/udev/udev_071.bb deleted file mode 100644 index 937462de85..0000000000 --- a/openembedded/packages/udev/udev_071.bb +++ /dev/null @@ -1,17 +0,0 @@ -SRC_URI = "http://kernel.org/pub/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \ - file://tmpfs.patch;patch=1 \ - file://noasmlinkage.patch;patch=1 \ - file://flags.patch;patch=1 \ - file://tty-symlinks.patch;patch=1" - -include udev.inc - -PR = "r8" - -UDEV_EXTRAS = "extras/firmware/ extras/scsi_id/ extras/volume_id/ extras/run_directory/" - -#FIXME UDEV MIGRATION PLAN: -#FIXME a) udevd is now a netlink daemon and needs to be started by the init script (ours is way too old) -#FIXME b) sbin/hotplug should no longer be called by the kernel, i.e. echo "" >/proc/sys/kernel/hotplug -#FIXME done c) until d) happens, udev will emulate hotplugd behaviour (see do_install_append() -#FIXME d) eventually hotplug should no longer be used at all, all agents shall be converted to udev rules diff --git a/openembedded/packages/udev/udev_084.bb b/openembedded/packages/udev/udev_084.bb index 85393315c5..0bb96c7f36 100644 --- a/openembedded/packages/udev/udev_084.bb +++ b/openembedded/packages/udev/udev_084.bb @@ -7,13 +7,15 @@ SRC_URI = "http://kernel.org/pub/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \ file://noasmlinkage.patch;patch=1 \ file://flags.patch;patch=1 \ file://udevsynthesize.patch;patch=1 \ - file://udevsynthesize.sh" - + file://udevsynthesize.sh \ + file://mount.blacklist \ + file://udev_network_queue.sh" + include udev.inc -INITSCRIPT_PARAMS = "start 03 S . start 55 0 6 ." +INITSCRIPT_PARAMS = "start 03 S ." -PR = "r1" +PR = "r12" FILES_${PN} += "${base_libdir}" UDEV_EXTRAS = "extras/firmware/ extras/scsi_id/ extras/volume_id/ extras/run_directory/" @@ -25,9 +27,11 @@ do_install () { oe_runmake 'DESTDIR=${D}' INSTALL=install install install -d ${D}${sysconfdir}/init.d install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/udev - + install -m 0755 ${WORKDIR}/udev_network_queue.sh ${D}${sysconfdir}/init.d/ + install -d ${D}${sysconfdir}/udev/rules.d/ + install -m 0644 ${WORKDIR}/mount.blacklist ${D}${sysconfdir}/udev/ install -m 0644 ${WORKDIR}/local.rules ${D}${sysconfdir}/udev/rules.d/local.rules install -m 0644 ${WORKDIR}/permissions.rules ${D}${sysconfdir}/udev/rules.d/permissions.rules install -m 0644 ${WORKDIR}/udev.rules ${D}${sysconfdir}/udev/rules.d/udev.rules @@ -44,3 +48,13 @@ do_install () { install -m 0755 ${S}/udevsynthesize ${D}${base_libdir}/udev/udevsynthesize install -m 0755 ${WORKDIR}/udevsynthesize.sh ${D}${sbindir}/udevsynthesize } + + +pkg_postinst_append() { + update-rc.d -s udev_network_queue.sh start 41 S . start 55 0 6 . +} + + +pkg_postrm_append() { + update-rc.d -f udev_network_queue.sh remove +} -- cgit v1.2.3