Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (17 years ago)
Author:
Bruno Cornec
Message:

Update to busybox 1.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.5/mindi-busybox/debianutils/run_parts.c

    r821 r1765  
    33 * Mini run-parts implementation for busybox
    44 *
     5 * Copyright (C) 2007 Bernhard Fischer
    56 *
    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>
    79 *
    810 * Based on the Debian run-parts program, version 1.15
     
    1113 *
    1214 *
    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.
    1416 */
    1517
     
    2628 * -a ARG       argument. Pass ARG as an argument the program executed. It can
    2729 *              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.
    3631 */
    3732
    38 #include "busybox.h"
    3933#include <getopt.h>
    40 #include <stdlib.h>
    4134
     35#include "libbb.h"
    4236
    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
     38static 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
     50struct globals {
     51    smalluint mode;
     52    char *cmd[10]; /* merely arbitrary arg count */
    4853};
     54#define G (*(struct globals*)&bb_common_bufsiz1)
    4955
    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 */
     60static bool invalid_name(const char *c)
     61{
     62    c = bb_basename(c);
    5163
    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
     84static 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
     111int run_parts_main(int argc, char **argv);
    54112int run_parts_main(int argc, char **argv)
    55113{
    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;
    60117
    61118    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));
    89133    }
    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;
    100146}
Note: See TracChangeset for help on using the changeset viewer.