#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:
*/
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);
}