chiark / gitweb /
69faecc15e4e31b7caeba7e8e629c24a608fdc14
[elogind.git] / extras / run_directory / run_directory.c
1 /*
2  * udev_run_directory.c - directory multiplexer
3  *
4  * Copyright (C) 2005 Kay Sievers <kay@vrfy.org>
5  *
6  *      This program is free software; you can redistribute it and/or modify it
7  *      under the terms of the GNU General Public License as published by the
8  *      Free Software Foundation version 2 of the License.
9  *
10  */
11
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <stddef.h>
16 #include <dirent.h>
17 #include <errno.h>
18 #include <unistd.h>
19 #include <fcntl.h>
20 #include <limits.h>
21 #include <sys/types.h>
22 #include <sys/wait.h>
23 #include <sys/stat.h>
24
25 #include "../../udev_utils.h"
26 #include "../../list.h"
27 #include "../../logging.h"
28 #include "run_directory.h"
29
30 static int exec_program(const char *filename, const char *subsystem)
31 {
32         pid_t pid;
33
34         dbg("running %s", filename);
35         pid = fork();
36         switch (pid) {
37         case 0:
38                 /* child */
39                 execl(filename, filename, subsystem, NULL);
40                 dbg("exec of child failed");
41                 _exit(1);
42         case -1:
43                 dbg("fork of child failed");
44                 break;
45                 return -1;
46         default:
47                 waitpid(pid, NULL, 0);
48         }
49
50         return 0;
51 }
52
53 int run_directory(const char *dir, const char *suffix, const char *subsystem)
54 {
55         struct name_entry *name_loop, *name_tmp;
56         struct stat buf;
57         LIST_HEAD(name_list);
58
59         dbg("looking at '%s'", dir);
60
61         if (stat(dir, &buf) != 0) {
62                 dbg("directory '%s' not found", dir);
63                 return 0;
64         }
65
66         add_matching_files(&name_list, dir, suffix);
67
68         list_for_each_entry_safe(name_loop, name_tmp, &name_list, node) {
69                 exec_program(name_loop->name, subsystem);
70                 list_del(&name_loop->node);
71         }
72
73         logging_close();
74         return 0;
75 }