/* * udev_run_directory.c - directory multiplexer * * Copyright (C) 2005 Kay Sievers * * 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 * Free Software Foundation version 2 of the License. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include "../../udev_utils.h" #include "../../list.h" #include "../../logging.h" int run_directory(const char *dir, const char *suffix, const char *subsystem); static int run_program(const char *filename, const char *subsystem) { pid_t pid; dbg("running %s", filename); pid = fork(); switch (pid) { case 0: /* child */ execl(filename, filename, 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; } int run_directory(const char *dir, const char *suffix, const char *subsystem) { char dirname[NAME_SIZE]; struct name_entry *name_loop, *name_tmp; LIST_HEAD(name_list); if (subsystem) { snprintf(dirname, sizeof(dirname), "%s/%s", dir, subsystem); dirname[sizeof(dirname)-1] = '\0'; dbg("looking at '%s'", dirname); add_matching_files(&name_list, dirname, suffix); } snprintf(dirname, sizeof(dirname), "%s/default", dir); dirname[sizeof(dirname)-1] = '\0'; dbg("looking at '%s'", dirname); add_matching_files(&name_list, dirname, suffix); list_for_each_entry_safe(name_loop, name_tmp, &name_list, node) { run_program(name_loop->name, subsystem); list_del(&name_loop->node); } logging_close(); return 0; }