diff options
Diffstat (limited to 'busybox/debianutils/run_parts.c')
-rw-r--r-- | busybox/debianutils/run_parts.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/busybox/debianutils/run_parts.c b/busybox/debianutils/run_parts.c new file mode 100644 index 000000000..6205595bf --- /dev/null +++ b/busybox/debianutils/run_parts.c | |||
@@ -0,0 +1,114 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Mini run-parts implementation for busybox | ||
4 | * | ||
5 | * | ||
6 | * Copyright (C) 2001 by Emanuele Aina <emanuele.aina@tiscali.it> | ||
7 | * | ||
8 | * Based on the Debian run-parts program, version 1.15 | ||
9 | * Copyright (C) 1996 Jeff Noxon <jeff@router.patch.net>, | ||
10 | * Copyright (C) 1996-1999 Guy Maor <maor@debian.org> | ||
11 | * | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify | ||
14 | * it under the terms of the GNU General Public License as published by | ||
15 | * the Free Software Foundation; either version 2 of the License, or | ||
16 | * (at your option) any later version. | ||
17 | * | ||
18 | * This program is distributed in the hope that it will be useful, | ||
19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
21 | * General Public License for more details. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License | ||
24 | * along with this program; if not, write to the Free Software | ||
25 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | ||
26 | * 02111-1307 USA | ||
27 | * | ||
28 | */ | ||
29 | |||
30 | /* This is my first attempt to write a program in C (well, this is my first | ||
31 | * attempt to write a program! :-) . */ | ||
32 | |||
33 | /* This piece of code is heavily based on the original version of run-parts, | ||
34 | * taken from debian-utils. I've only removed the long options and a the | ||
35 | * report mode. As the original run-parts support only long options, I've | ||
36 | * broken compatibility because the BusyBox policy doesn't allow them. | ||
37 | * The supported options are: | ||
38 | * -t test. Print the name of the files to be executed, without | ||
39 | * execute them. | ||
40 | * -a ARG argument. Pass ARG as an argument the program executed. It can | ||
41 | * be repeated to pass multiple arguments. | ||
42 | * -u MASK umask. Set the umask of the program executed to MASK. */ | ||
43 | |||
44 | /* TODO | ||
45 | * done - convert calls to error in perror... and remove error() | ||
46 | * done - convert malloc/realloc to their x... counterparts | ||
47 | * done - remove catch_sigchld | ||
48 | * done - use bb's concat_path_file() | ||
49 | * done - declare run_parts_main() as extern and any other function as static? | ||
50 | */ | ||
51 | |||
52 | #include <getopt.h> | ||
53 | #include <stdlib.h> | ||
54 | |||
55 | #include "libbb.h" | ||
56 | |||
57 | static const struct option runparts_long_options[] = { | ||
58 | { "test", 0, NULL, 't' }, | ||
59 | { "umask", 1, NULL, 'u' }, | ||
60 | { "arg", 1, NULL, 'a' }, | ||
61 | { 0, 0, 0, 0 } | ||
62 | }; | ||
63 | |||
64 | extern char **environ; | ||
65 | |||
66 | /* run_parts_main */ | ||
67 | /* Process options */ | ||
68 | int run_parts_main(int argc, char **argv) | ||
69 | { | ||
70 | char **args = xmalloc(2 * sizeof(char *)); | ||
71 | unsigned char test_mode = 0; | ||
72 | unsigned short argcount = 1; | ||
73 | int opt; | ||
74 | |||
75 | umask(022); | ||
76 | |||
77 | while ((opt = getopt_long (argc, argv, "tu:a:", | ||
78 | runparts_long_options, NULL)) > 0) | ||
79 | { | ||
80 | switch (opt) { | ||
81 | /* Enable test mode */ | ||
82 | case 't': | ||
83 | test_mode++; | ||
84 | break; | ||
85 | /* Set the umask of the programs executed */ | ||
86 | case 'u': | ||
87 | /* Check and set the umask of the program executed. As stated in the original | ||
88 | * run-parts, the octal conversion in libc is not foolproof; it will take the | ||
89 | * 8 and 9 digits under some circumstances. We'll just have to live with it. | ||
90 | */ | ||
91 | umask(bb_xgetlarg(optarg, 8, 0, 07777)); | ||
92 | break; | ||
93 | /* Pass an argument to the programs */ | ||
94 | case 'a': | ||
95 | /* Add an argument to the commands that we will call. | ||
96 | * Called once for every argument. */ | ||
97 | args = xrealloc(args, (argcount + 2) * (sizeof(char *))); | ||
98 | args[argcount++] = optarg; | ||
99 | break; | ||
100 | default: | ||
101 | bb_show_usage(); | ||
102 | } | ||
103 | } | ||
104 | |||
105 | /* We require exactly one argument: the directory name */ | ||
106 | if (optind != (argc - 1)) { | ||
107 | bb_show_usage(); | ||
108 | } | ||
109 | |||
110 | args[0] = argv[optind]; | ||
111 | args[argcount] = 0; | ||
112 | |||
113 | return(run_parts(args, test_mode, environ)); | ||
114 | } | ||