From: Kay Sievers <kay.sievers@vrfy.org>
To: linux-hotplug@vger.kernel.org
Subject: Re: [adventure] replace /sbin/hotplug by udevd
Date: Thu, 18 Nov 2004 23:47:25 +0000 [thread overview]
Message-ID: <20041118234725.GA7400@vrfy.org> (raw)
In-Reply-To: <20041118002726.GA4281@vrfy.org>
[-- Attachment #1: Type: text/plain, Size: 1031 bytes --]
On Wed, Nov 17, 2004 at 05:25:01PM -0800, Greg KH wrote:
> On Thu, Nov 18, 2004 at 01:27:26AM +0100, Kay Sievers wrote:
> > This patch applies on top of udev v045. /proc/sys/kernel/hotplug should be
> > set to /sbin/udevsend.
>
> No, it applies on top of the latest udev bk tree, not on top of the
> recently released udev v045 that is on kernel.org.
>
> That's my fault due to the way I've been releasing v044 and v045 without
> your database changes. I'll fix this up tomorrow by putting out a v046
> that has all of your recent changes in it, and then this patch will
> apply on top of it.
Here is a new version on top of the released v046. It's a very small
patch now. To test it:
kill the current daemon:
[root@pim udev.kay]# killall udevd
disable the usual hotplug multiplexer and pass the event to the daemon only:
[root@pim udev.kay]# echo /sbin/udevsend > /proc/sys/kernel/hotplug
start the daemon, but let it fork the new udev:
[root@pim udev.kay]# UDEV_BIN=/home/kay/src/udev.kay/udev ./udevd
Thanks,
Kay
[-- Attachment #2: udev-as-hotplugd-03.patch --]
[-- Type: text/plain, Size: 7449 bytes --]
===== dev_d.c 1.20 vs edited =====
--- 1.20/dev_d.c 2004-11-11 22:32:18 +01:00
+++ edited/dev_d.c 2004-11-18 21:28:52 +01:00
@@ -37,6 +37,11 @@
int fd;
struct udevice *udev = data;
+ if (strstr(filename, "udev.hotplug") != NULL) {
+ dbg("prevent loop, don't call link pointing to ourself");
+ return 0;
+ }
+
dbg("running %s", filename);
pid = fork();
@@ -96,13 +101,17 @@
temp = strchr(temp, '/');
}
- snprintf(dirname, PATH_MAX, "%s/%s", basedir, udev->name);
- dirname[PATH_MAX-1] = '\0';
- call_foreach_file(run_program, dirname, suffix, udev);
-
- snprintf(dirname, PATH_MAX, "%s/%s", basedir, udev->subsystem);
- dirname[PATH_MAX-1] = '\0';
- call_foreach_file(run_program, dirname, suffix, udev);
+ if (udev->name[0] != '\0') {
+ snprintf(dirname, PATH_MAX, "%s/%s", basedir, udev->name);
+ dirname[PATH_MAX-1] = '\0';
+ call_foreach_file(run_program, dirname, suffix, udev);
+ }
+
+ if (udev->subsystem[0] != '\0') {
+ snprintf(dirname, PATH_MAX, "%s/%s", basedir, udev->subsystem);
+ dirname[PATH_MAX-1] = '\0';
+ call_foreach_file(run_program, dirname, suffix, udev);
+ }
snprintf(dirname, PATH_MAX, "%s/default", basedir);
dirname[PATH_MAX-1] = '\0';
===== udev.c 1.82 vs edited =====
--- 1.82/udev.c 2004-11-13 06:51:09 +01:00
+++ edited/udev.c 2004-11-18 21:28:53 +01:00
@@ -4,6 +4,7 @@
* Userspace devfs
*
* Copyright (C) 2003,2004 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -68,66 +69,19 @@
{
struct sigaction act;
struct sysfs_class_device *class_dev;
+ struct sysfs_device *devices_dev;
struct udevice udev;
char path[SYSFS_PATH_MAX];
int retval = -EINVAL;
- enum {
- ADD,
- REMOVE,
- UDEVSTART,
- } act_type;
+ const char *error;
+ const char *action = getenv("ACTION");
+ const char *devpath = getenv("DEVPATH");
+ const char *subsystem = argv[1];
dbg("version %s", UDEV_VERSION);
logging_init("udev");
udev_init_config();
- if (strstr(argv[0], "udevstart") || (argv[1] != NULL && strstr(argv[1], "udevstart"))) {
- act_type = UDEVSTART;
- } else {
- const char *action = getenv("ACTION");
- const char *devpath = getenv("DEVPATH");
- const char *subsystem = argv[1];
-
- if (!action) {
- dbg("no action?");
- goto exit;
- }
- if (strcmp(action, "add") == 0) {
- act_type = ADD;
- } else if (strcmp(action, "remove") == 0) {
- act_type = REMOVE;
- } else {
- dbg("no action '%s' for us", action);
- goto exit;
- }
-
- if (!devpath) {
- dbg("no devpath?");
- goto exit;
- }
- dbg("looking at '%s'", devpath);
-
- /* we only care about class devices and block stuff */
- if (!strstr(devpath, "class") && !strstr(devpath, "block")) {
- dbg("not a block or class device");
- goto exit;
- }
-
- if (!subsystem) {
- dbg("no subsystem");
- goto exit;
- }
-
- udev_set_values(&udev, devpath, subsystem, action);
-
- /* skip blacklisted subsystems */
- if (udev.type != 'n' && subsystem_expect_no_dev(subsystem)) {
- dbg("don't care about '%s' devices", subsystem);
- goto exit;
- };
-
- }
-
/* set signal handlers */
act.sa_handler = (void (*) (int))sig_handler;
sigemptyset (&act.sa_mask);
@@ -137,51 +91,104 @@
sigaction(SIGINT, &act, NULL);
sigaction(SIGTERM, &act, NULL);
- /* trigger timout to interrupt blocking syscalls */
+ /* trigger timeout to interrupt blocking syscalls */
alarm(ALARM_TIMEOUT);
- switch(act_type) {
- case UDEVSTART:
- dbg("udevstart");
+ udev_set_values(&udev, devpath, subsystem, action);
+
+ if (strstr(argv[0], "udevstart") || (argv[1] != NULL && strstr(argv[1], "udevstart"))) {
+ dbg("event: udevstart");
udev_log = 0;
namedev_init();
retval = udev_start();
- break;
- case ADD:
- dbg("udev add");
-
- /* open the device */
- snprintf(path, SYSFS_PATH_MAX, "%s%s", sysfs_path, udev.devpath);
- class_dev = sysfs_open_class_device_path(path);
- if (class_dev == NULL) {
- dbg ("sysfs_open_class_device_path failed");
- break;
- }
- dbg("opened class_dev->name='%s'", class_dev->name);
+ goto exit;
+ }
- /* init rules */
- namedev_init();
+ if (!action) {
+ dbg("no action");
+ goto hotplug;
+ }
+
+ if (!subsystem) {
+ dbg("no subsystem");
+ goto hotplug;
+ }
+
+ if (!devpath) {
+ dbg("no devpath");
+ goto hotplug;
+ }
+
+ if ((strncmp(devpath, "/block/", 7) == 0) || (strncmp(devpath, "/class/", 7) == 0)) {
+ if (strcmp(action, "add") == 0) {
+ /* wait for sysfs and possibly add node */
+ dbg("event: udev add");
+
+ /* skip blacklisted subsystems */
+ if (udev.type != 'n' && subsystem_expect_no_dev(udev.subsystem)) {
+ dbg("don't care about '%s' devices", udev.subsystem);
+ goto hotplug;
+ };
+
+ snprintf(path, SYSFS_PATH_MAX, "%s%s", sysfs_path, udev.devpath);
+ class_dev = wait_class_device_open(path);
+ if (class_dev == NULL) {
+ dbg ("sysfs_open_class_device_path failed");
+ goto hotplug;
+ }
+ dbg("opened class_dev->name='%s'", class_dev->name);
+
+ wait_for_class_device(class_dev, &error);
+
+ /* init rules, permissions */
+ namedev_init();
+
+ /* name, create node, store in db */
+ retval = udev_add_device(&udev, class_dev);
+
+ /* run dev.d/ scripts if we created a node or changed a netif name */
+ if (udev.devname[0] != '\0') {
+ setenv("DEVNAME", udev.devname, 1);
+ dev_d_execute(&udev, DEVD_DIR, DEVD_SUFFIX);
+ }
- /* name, create node, store in db */
- retval = udev_add_device(&udev, class_dev);
+ sysfs_close_class_device(class_dev);
+ } else if (strcmp(action, "remove") == 0) {
+ /* possibly remove a node */
+ dbg("event: udev remove");
- /* run dev.d/ scripts if we created a node or changed a netif name */
- if (udev.devname[0] != '\0') {
- setenv("DEVNAME", udev.devname, 1);
+ /* get node from db, delete it */
+ retval = udev_remove_device(&udev);
+
+ /* run scripts */
dev_d_execute(&udev, DEVD_DIR, DEVD_SUFFIX);
}
+ } else if ((strncmp(devpath, "/devices/", 9) == 0)) {
+ if (strcmp(action, "add") == 0) {
+ /* wait for sysfs */
+ dbg("event: devices add");
- sysfs_close_class_device(class_dev);
- break;
- case REMOVE:
- dbg("udev remove");
+ snprintf(path, SYSFS_PATH_MAX, "%s%s", sysfs_path, devpath);
+ devices_dev = wait_devices_device_open(path);
+ if (!devices_dev) {
+ dbg("error: devices device unavailable (probably remove has beaten us)");
+ goto hotplug;
+ }
+ dbg("devices device opened '%s'", path);
- /* get node from db, delete it*/
- retval = udev_remove_device(&udev);
+ wait_for_devices_device(devices_dev, &error);
- /* run scripts */
- dev_d_execute(&udev, DEVD_DIR, DEVD_SUFFIX);
+ sysfs_close_device(devices_dev);
+ } else if (strcmp(action, "remove") == 0) {
+ dbg("event: devices remove");
+ }
+ } else {
+ dbg("event: unhandled");
}
+
+hotplug:
+ /* call the hotplug scripts */
+ dev_d_execute(&udev, HOTPLUGD_DIR, HOTPLUG_SUFFIX);
exit:
logging_close();
===== udev.h 1.72 vs edited =====
--- 1.72/udev.h 2004-11-13 06:43:23 +01:00
+++ edited/udev.h 2004-11-18 21:28:53 +01:00
@@ -44,6 +44,9 @@
#define DEVD_DIR "/etc/dev.d"
#define DEVD_SUFFIX ".dev"
+#define HOTPLUGD_DIR "/etc/hotplug.d"
+#define HOTPLUG_SUFFIX ".hotplug"
+
struct udevice {
char devpath[DEVPATH_SIZE];
char subsystem[SUBSYSTEM_SIZE];
next prev parent reply other threads:[~2004-11-18 23:47 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-11-18 0:27 [adventure] replace /sbin/hotplug by udevd Kay Sievers
2004-11-18 1:25 ` Greg KH
2004-11-18 4:04 ` Kevin P. Fleming
2004-11-18 6:40 ` Stefan Schweizer
2004-11-18 23:47 ` Kay Sievers [this message]
2004-11-19 0:03 ` Kay Sievers
2004-11-19 0:55 ` Greg KH
2004-11-19 1:11 ` Kay Sievers
2004-11-19 7:27 ` Greg KH
2004-11-19 16:03 ` Kay Sievers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20041118234725.GA7400@vrfy.org \
--to=kay.sievers@vrfy.org \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.