Since rangecoder is just a bunch of C functions, move it into the one user
[oweals/busybox.git] / debianutils / run_parts.c
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  * Licensed under GPL v2, see file LICENSE in this tarball for details.
14  */
15
16 /* This is my first attempt to write a program in C (well, this is my first
17  * attempt to write a program! :-) . */
18
19 /* This piece of code is heavily based on the original version of run-parts,
20  * taken from debian-utils. I've only removed the long options and a the
21  * report mode. As the original run-parts support only long options, I've
22  * broken compatibility because the BusyBox policy doesn't allow them.
23  * The supported options are:
24  * -t                   test. Print the name of the files to be executed, without
25  *                              execute them.
26  * -a ARG               argument. Pass ARG as an argument the program executed. It can
27  *                              be repeated to pass multiple arguments.
28  * -u MASK              umask. Set the umask of the program executed to MASK. */
29
30 /* TODO
31  * done - convert calls to error in perror... and remove error()
32  * done - convert malloc/realloc to their x... counterparts
33  * done - remove catch_sigchld
34  * done - use bb's concat_path_file()
35  * done - declare run_parts_main() as extern and any other function as static?
36  */
37
38 #include "busybox.h"
39 #include <getopt.h>
40 #include <stdlib.h>
41
42
43 static const struct option runparts_long_options[] = {
44         { "test",               0,              NULL,           't' },
45         { "umask",              1,              NULL,           'u' },
46         { "arg",                1,              NULL,           'a' },
47         { 0,                    0,              0,                      0 }
48 };
49
50 extern char **environ;
51
52 /* run_parts_main */
53 /* Process options */
54 int run_parts_main(int argc, char **argv)
55 {
56         char **args = xmalloc(2 * sizeof(char *));
57         unsigned char test_mode = 0;
58         unsigned short argcount = 1;
59         int opt;
60
61         umask(022);
62
63         while ((opt = getopt_long (argc, argv, "tu:a:",
64                                         runparts_long_options, NULL)) > 0)
65         {
66                 switch (opt) {
67                         /* Enable test mode */
68                         case 't':
69                                 test_mode++;
70                                 break;
71                         /* Set the umask of the programs executed */
72                         case 'u':
73                                 /* Check and set the umask of the program executed. As stated in the original
74                                  * run-parts, the octal conversion in libc is not foolproof; it will take the
75                                  * 8 and 9 digits under some circumstances. We'll just have to live with it.
76                                  */
77                                 umask(bb_xgetlarg(optarg, 8, 0, 07777));
78                                 break;
79                         /* Pass an argument to the programs */
80                         case 'a':
81                                 /* Add an argument to the commands that we will call.
82                                  * Called once for every argument. */
83                                 args = xrealloc(args, (argcount + 2) * (sizeof(char *)));
84                                 args[argcount++] = optarg;
85                                 break;
86                         default:
87                                 bb_show_usage();
88                 }
89         }
90
91         /* We require exactly one argument: the directory name */
92         if (optind != (argc - 1)) {
93                 bb_show_usage();
94         }
95
96         args[0] = argv[optind];
97         args[argcount] = 0;
98
99         return(run_parts(args, test_mode, environ));
100 }