Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/debianutils/run_parts.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/debianutils/run_parts.c
r821 r1770 3 3 * Mini run-parts implementation for busybox 4 4 * 5 * Copyright (C) 2007 Bernhard Fischer 5 6 * 6 * Copyright (C) 2001 by Emanuele Aina <emanuele.aina@tiscali.it> 7 * Based on a older version that was in busybox which was 1k big.. 8 * Copyright (C) 2001 by Emanuele Aina <emanuele.aina@tiscali.it> 7 9 * 8 10 * Based on the Debian run-parts program, version 1.15 … … 11 13 * 12 14 * 13 * Licensed under GPL v2 , see file LICENSE in this tarball for details.15 * Licensed under GPL v2 or later, see file LICENSE in this tarball for details. 14 16 */ 15 17 … … 26 28 * -a ARG argument. Pass ARG as an argument the program executed. It can 27 29 * 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? 30 * -u MASK umask. Set the umask of the program executed to MASK. 36 31 */ 37 32 38 #include "busybox.h"39 33 #include <getopt.h> 40 #include <stdlib.h>41 34 35 #include "libbb.h" 42 36 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 } 37 #if ENABLE_FEATURE_RUN_PARTS_LONG_OPTIONS 38 static const char runparts_longopts[] ALIGN1 = 39 "arg\0" Required_argument "a" 40 "umask\0" Required_argument "u" 41 "test\0" No_argument "t" 42 #if ENABLE_FEATURE_RUN_PARTS_FANCY 43 "list\0" No_argument "l" 44 //TODO: "reverse\0" No_argument "r" 45 //TODO: "verbose\0" No_argument "v" 46 #endif 47 ; 48 #endif 49 50 struct globals { 51 smalluint mode; 52 char *cmd[10]; /* merely arbitrary arg count */ 48 53 }; 54 #define G (*(struct globals*)&bb_common_bufsiz1) 49 55 50 extern char **environ; 56 /* valid_name */ 57 /* True or false? Is this a valid filename (upper/lower alpha, digits, 58 * underscores, and hyphens only?) 59 */ 60 static bool invalid_name(const char *c) 61 { 62 c = bb_basename(c); 51 63 52 /* run_parts_main */ 53 /* Process options */ 64 while (*c && (isalnum(*c) || *c == '_' || *c == '-')) 65 c++; 66 67 return *c; /* TRUE (!0) if terminating NUL is not reached */ 68 } 69 70 #define RUN_PARTS_OPT_a (1<<0) 71 #define RUN_PARTS_OPT_u (1<<1) 72 #define RUN_PARTS_OPT_t (1<<2) 73 #if ENABLE_FEATURE_RUN_PARTS_FANCY 74 #define RUN_PARTS_OPT_l (1<<3) 75 #endif 76 77 #define test_mode (G.mode & RUN_PARTS_OPT_t) 78 #if ENABLE_FEATURE_RUN_PARTS_FANCY 79 #define list_mode (G.mode & RUN_PARTS_OPT_l) 80 #else 81 #define list_mode (0) 82 #endif 83 84 static int act(const char *file, struct stat *statbuf, void *args, int depth) 85 { 86 int ret; 87 88 if (depth == 1) 89 return TRUE; 90 91 if (depth == 2 && 92 ((!list_mode && access(file, X_OK)) || 93 invalid_name(file) || 94 !(statbuf->st_mode & (S_IFREG | S_IFLNK))) ) 95 return SKIP; 96 97 if (test_mode || list_mode) { 98 puts(file); 99 return TRUE; 100 } 101 G.cmd[0] = (char*)file; 102 ret = wait4pid(spawn(G.cmd)); 103 if (ret < 0) { 104 bb_perror_msg("failed to exec %s", file); 105 } else if (ret > 0) { 106 bb_error_msg("%s exited with return code %d", file, ret); 107 } 108 return !ret; 109 } 110 111 int run_parts_main(int argc, char **argv); 54 112 int run_parts_main(int argc, char **argv) 55 113 { 56 char **args = xmalloc(2 * sizeof(char *)); 57 unsigned char test_mode = 0; 58 unsigned short argcount = 1; 59 int opt; 114 char *umask_p; 115 llist_t *arg_list = NULL; 116 unsigned tmp; 60 117 61 118 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 } 119 /* We require exactly one argument: the directory name */ 120 opt_complementary = "=1:a::"; 121 #if ENABLE_FEATURE_RUN_PARTS_LONG_OPTIONS 122 applet_long_options = runparts_longopts; 123 #endif 124 tmp = getopt32(argv, "a:u:t"USE_FEATURE_RUN_PARTS_FANCY("l"), &arg_list, &umask_p); 125 G.mode = tmp &~ (RUN_PARTS_OPT_a|RUN_PARTS_OPT_u); 126 if (tmp & RUN_PARTS_OPT_u) { 127 /* Check and set the umask of the program executed. 128 * As stated in the original run-parts, the octal conversion in 129 * libc is not foolproof; it will take the 8 and 9 digits under 130 * some circumstances. We'll just have to live with it. 131 */ 132 umask(xstrtoul_range(umask_p, 8, 0, 07777)); 89 133 } 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)); 134 for (tmp = 1; arg_list; arg_list = arg_list->link, tmp++) 135 G.cmd[tmp] = arg_list->data; 136 /* G.cmd[tmp] = NULL; - G is already zeroed out */ 137 if (!recursive_action(argv[argc - 1], 138 ACTION_RECURSE|ACTION_FOLLOWLINKS, 139 act, /* file action */ 140 act, /* dir action */ 141 NULL, /* user data */ 142 1 /* depth */ 143 )) 144 return EXIT_FAILURE; 145 return EXIT_SUCCESS; 100 146 }
Note:
See TracChangeset
for help on using the changeset viewer.