X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev.c;h=5ad7e425e6fc212433148a52b16489aca28afc4d;hp=8e6d06f1bd0071a3414db5dac712a7d8b218f951;hb=7757db1f859616171693ed9a54d1d16d3d5ed8e9;hpb=c449b25e3f998efe8f5988632126fb468ee55fc5 diff --git a/udev.c b/udev.c index 8e6d06f1b..5ad7e425e 100644 --- a/udev.c +++ b/udev.c @@ -33,7 +33,7 @@ #include "libsysfs/sysfs/libsysfs.h" #include "udev.h" -#include "udev_lib.h" +#include "udev_utils.h" #include "udev_sysfs.h" #include "udev_version.h" #include "namedev.h" @@ -55,6 +55,30 @@ void log_message(int level, const char *format, ...) } #endif +/* (for now) true if udevsend is the helper */ +static int manage_hotplug_event(void) { + char helper[256]; + int fd; + int len; + + fd = open("/proc/sys/kernel/hotplug", O_RDONLY); + if (fd < 0) + goto exit; + + len = read(fd, helper, 256); + close(fd); + + if (len < 0) + goto exit; + helper[len] = '\0'; + + if (strstr(helper, "udevsend")) + return 1; + +exit: + return 0; +} + static void asmlinkage sig_handler(int signum) { switch (signum) { @@ -84,6 +108,7 @@ int main(int argc, char *argv[], char *envp[]) udev_init_config(); /* set signal handlers */ + memset(&act, 0x00, sizeof(act)); act.sa_handler = (void (*) (int))sig_handler; sigemptyset (&act.sa_mask); act.sa_flags = 0; @@ -110,20 +135,20 @@ int main(int argc, char *argv[], char *envp[]) if (!action) { dbg("no action"); - goto exit; + goto hotplug; } if (!subsystem) { dbg("no subsystem"); - goto exit; + goto hotplug; } if (!devpath) { dbg("no devpath"); - goto exit; + goto hotplug; } - /* export logging flag, called scripts may want to do the same as udev */ + /* export logging flag, as called scripts may want to do the same as udev */ if (udev_log) setenv("UDEV_LOG", "1", 1); @@ -135,14 +160,14 @@ int main(int argc, char *argv[], char *envp[]) /* skip blacklisted subsystems */ if (udev.type != 'n' && subsystem_expect_no_dev(udev.subsystem)) { dbg("don't care about '%s' devices", udev.subsystem); - goto exit; + 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 ("open class device failed"); - goto exit; + goto hotplug; } dbg("opened class_dev->name='%s'", class_dev->name); @@ -155,9 +180,9 @@ int main(int argc, char *argv[], char *envp[]) 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') { + if (udev_dev_d && udev.devname[0] != '\0') { setenv("DEVNAME", udev.devname, 1); - dev_d_execute(&udev, DEVD_DIR, DEVD_SUFFIX); + udev_multiplex_directory(&udev, DEVD_DIR, DEVD_SUFFIX); } sysfs_close_class_device(class_dev); @@ -165,13 +190,17 @@ int main(int argc, char *argv[], char *envp[]) /* possibly remove a node */ dbg("udev remove"); - /* get node from db, delete it */ + /* get node from db, remove db-entry, delete created node */ retval = udev_remove_device(&udev); - /* run dev.d/ scripts if we're not instructed to ignore the event */ + /* Set the DEVNAME if known */ if (udev.devname[0] != '\0') { setenv("DEVNAME", udev.devname, 1); - dev_d_execute(&udev, DEVD_DIR, DEVD_SUFFIX); + } + /* run dev.d/ scripts if we're not instructed to ignore the event */ + if (udev_dev_d && udev.devname[0] != '\0') { + setenv("DEVNAME", udev.devname, 1); + udev_multiplex_directory(&udev, DEVD_DIR, DEVD_SUFFIX); } } @@ -184,7 +213,7 @@ int main(int argc, char *argv[], char *envp[]) devices_dev = wait_devices_device_open(path); if (!devices_dev) { dbg("devices device unavailable (probably remove has beaten us)"); - goto exit; + goto hotplug; } dbg("devices device opened '%s'", path); @@ -198,6 +227,10 @@ int main(int argc, char *argv[], char *envp[]) dbg("unhandled"); } +hotplug: + if (manage_hotplug_event()) + udev_multiplex_directory(&udev, HOTPLUGD_DIR, HOTPLUG_SUFFIX); + exit: logging_close(); return retval;