X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udev_multiplex.c;h=22bbaf7b614bcef316cf28454b2b9793814f45da;hp=7e3dc656d6d7d48edcb3ff284bb805c8409a0d26;hb=13ca17798cd69dd384ddade607ae3a9878622965;hpb=9af5bb2f8fdbf54c064ddbd319d61092f28a4132 diff --git a/udev_multiplex.c b/udev_multiplex.c index 7e3dc656d..22bbaf7b6 100644 --- a/udev_multiplex.c +++ b/udev_multiplex.c @@ -28,42 +28,10 @@ #include #include "udev.h" +#include "udev_libc_wrapper.h" #include "udev_utils.h" #include "logging.h" -static int run_program(const char *filename, void *data) -{ - pid_t pid; - int fd; - struct udevice *udev = data; - - dbg("running %s", filename); - - pid = fork(); - switch (pid) { - case 0: - /* child */ - fd = open("/dev/null", O_RDWR); - if ( fd >= 0) { - dup2(fd, STDOUT_FILENO); - dup2(fd, STDIN_FILENO); - dup2(fd, STDERR_FILENO); - } - close(fd); - - execl(filename, filename, udev->subsystem, NULL); - dbg("exec of child failed"); - _exit(1); - case -1: - dbg("fork of child failed"); - break; - return -1; - default: - waitpid(pid, NULL, 0); - } - - return 0; -} /* * runs files in these directories in order: @@ -73,42 +41,52 @@ static int run_program(const char *filename, void *data) */ void udev_multiplex_directory(struct udevice *udev, const char *basedir, const char *suffix) { - char dirname[PATH_MAX]; - char devname[NAME_SIZE]; - char *temp; - - /* skip if UDEV_NO_DEVD is set */ - if (udev_dev_d == 0) - return; - - strfieldcpy(devname, udev->name); + char dirname[PATH_SIZE]; + struct name_entry *name_loop, *name_tmp; + LIST_HEAD(name_list); /* chop the device name up into pieces based on '/' */ - temp = strchr(devname, '/'); - while (temp != NULL) { - temp[0] = '\0'; - snprintf(dirname, PATH_MAX, "%s/%s", basedir, devname); - dirname[PATH_MAX-1] = '\0'; - call_foreach_file(run_program, dirname, suffix, udev); - - temp[0] = '/'; - ++temp; - temp = strchr(temp, '/'); + if (udev->name[0] != '\0') { + char devname[PATH_SIZE]; + char *temp; + + strlcpy(devname, udev->name, sizeof(devname)); + temp = strchr(devname, '/'); + while (temp != NULL) { + temp[0] = '\0'; + + /* don't call the subsystem directory here */ + if (strcmp(devname, udev->subsystem) != 0) { + snprintf(dirname, sizeof(dirname), "%s/%s", basedir, devname); + dirname[sizeof(dirname)-1] = '\0'; + add_matching_files(&name_list, dirname, suffix); + } + + temp[0] = '/'; + ++temp; + temp = strchr(temp, '/'); + } } 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); + snprintf(dirname, sizeof(dirname), "%s/%s", basedir, udev->name); + dirname[sizeof(dirname)-1] = '\0'; + add_matching_files(&name_list, dirname, suffix); } 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, sizeof(dirname), "%s/%s", basedir, udev->subsystem); + dirname[sizeof(dirname)-1] = '\0'; + add_matching_files(&name_list, dirname, suffix); + } + + snprintf(dirname, sizeof(dirname), "%s/default", basedir); + dirname[sizeof(dirname)-1] = '\0'; + add_matching_files(&name_list, dirname, suffix); + + list_for_each_entry_safe(name_loop, name_tmp, &name_list, node) { + execute_command(name_loop->name, udev->subsystem); + list_del(&name_loop->node); } - snprintf(dirname, PATH_MAX, "%s/default", basedir); - dirname[PATH_MAX-1] = '\0'; - call_foreach_file(run_program, dirname, suffix, udev); }