chiark / gitweb /
remove detach_state files from the sysfs test tree.
[elogind.git] / udev_multiplex.c
index 7e3dc656d6d7d48edcb3ff284bb805c8409a0d26..22bbaf7b614bcef316cf28454b2b9793814f45da 100644 (file)
 #include <fcntl.h>
 
 #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);
 }