X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=debianutils%2Frun_parts.c;h=c80cc863f8a2764f9a05be8ea405e98ee12082b2;hb=6c4f87e411aa5375eaea5a5909a5c610e38c7e70;hp=8f08f6dc66cef5a75b1dd65bb7156ea7c08884df;hpb=378ab6819907fa9e439e93ed081c73c2351b4330;p=oweals%2Fbusybox.git diff --git a/debianutils/run_parts.c b/debianutils/run_parts.c index 8f08f6dc6..c80cc863f 100644 --- a/debianutils/run_parts.c +++ b/debianutils/run_parts.c @@ -4,14 +4,13 @@ * * Copyright (C) 2007 Bernhard Reutner-Fischer * - * Based on a older version that was in busybox which was 1k big.. + * Based on a older version that was in busybox which was 1k big. * Copyright (C) 2001 by Emanuele Aina * * Based on the Debian run-parts program, version 1.15 * Copyright (C) 1996 Jeff Noxon , * Copyright (C) 1996-1999 Guy Maor * - * * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ @@ -19,26 +18,58 @@ * attempt to write a program! :-) . */ /* This piece of code is heavily based on the original version of run-parts, - * taken from debian-utils. I've only removed the long options and a the + * taken from debian-utils. I've only removed the long options and the * report mode. As the original run-parts support only long options, I've * broken compatibility because the BusyBox policy doesn't allow them. - * The supported options are: - * -t test. Print the name of the files to be executed, without - * execute them. - * -a ARG argument. Pass ARG as an argument the program executed. It can - * be repeated to pass multiple arguments. - * -u MASK umask. Set the umask of the program executed to MASK. */ +//config:config RUN_PARTS +//config: bool "run-parts (6.1 kb)" +//config: default y +//config: help +//config: run-parts is a utility designed to run all the scripts in a directory. +//config: +//config: It is useful to set up a directory like cron.daily, where you need to +//config: execute all the scripts in that directory. +//config: +//config: In this implementation of run-parts some features (such as report +//config: mode) are not implemented. +//config: +//config: Unless you know that run-parts is used in some of your scripts +//config: you can safely say N here. +//config: +//config:config FEATURE_RUN_PARTS_LONG_OPTIONS +//config: bool "Enable long options" +//config: default y +//config: depends on RUN_PARTS && LONG_OPTS +//config: +//config:config FEATURE_RUN_PARTS_FANCY +//config: bool "Support additional arguments" +//config: default y +//config: depends on RUN_PARTS +//config: help +//config: Support additional options: +//config: -l --list print the names of the all matching files (not +//config: limited to executables), but don't actually run them. + +//applet:IF_RUN_PARTS(APPLET_ODDNAME(run-parts, run_parts, BB_DIR_BIN, BB_SUID_DROP, run_parts)) + +//kbuild:lib-$(CONFIG_RUN_PARTS) += run_parts.o //usage:#define run_parts_trivial_usage -//usage: "[-t] "IF_FEATURE_RUN_PARTS_FANCY("[-l] ")"[-a ARG] [-u MASK] DIRECTORY" +//usage: "[-a ARG]... [-u UMASK] " +//usage: IF_FEATURE_RUN_PARTS_LONG_OPTIONS("[--reverse] [--test] [--exit-on-error] "IF_FEATURE_RUN_PARTS_FANCY("[--list] ")) +//usage: "DIRECTORY" //usage:#define run_parts_full_usage "\n\n" //usage: "Run a bunch of scripts in DIRECTORY\n" -//usage: "\n -t Print what would be run, but don't actually run anything" -//usage: "\n -a ARG Pass ARG as argument for every program" -//usage: "\n -u MASK Set the umask to MASK before running every program" +//usage: "\n -a ARG Pass ARG as argument to scripts" +//usage: "\n -u UMASK Set UMASK before running scripts" +//usage: IF_FEATURE_RUN_PARTS_LONG_OPTIONS( +//usage: "\n --reverse Reverse execution order" +//usage: "\n --test Dry run" +//usage: "\n --exit-on-error Exit if a script exits with non-zero" //usage: IF_FEATURE_RUN_PARTS_FANCY( -//usage: "\n -l Print names of all matching files even if they are not executable" +//usage: "\n --list Print names of matching files even if they are not executable" +//usage: ) //usage: ) //usage: //usage:#define run_parts_example_usage @@ -56,34 +87,31 @@ //usage: "+ shutdown -h +4m" #include "libbb.h" +#include "common_bufsiz.h" struct globals { char **names; int cur; - char *cmd[1]; + char *cmd[2 /* using 1 provokes compiler warning */]; } FIX_ALIASING; -#define G (*(struct globals*)&bb_common_bufsiz1) +#define G (*(struct globals*)bb_common_bufsiz1) #define names (G.names) #define cur (G.cur ) #define cmd (G.cmd ) -#define INIT_G() do { } while (0) +#define INIT_G() do { setup_common_bufsiz(); } while (0) enum { NUM_CMD = (COMMON_BUFSIZE - sizeof(G)) / sizeof(cmd[0]) - 1 }; enum { - OPT_r = (1 << 0), - OPT_a = (1 << 1), - OPT_u = (1 << 2), - OPT_t = (1 << 3), - OPT_l = (1 << 4) * ENABLE_FEATURE_RUN_PARTS_FANCY, + OPT_a = (1 << 0), + OPT_u = (1 << 1), + OPT_r = (1 << 2) * ENABLE_FEATURE_RUN_PARTS_LONG_OPTIONS, + OPT_t = (1 << 3) * ENABLE_FEATURE_RUN_PARTS_LONG_OPTIONS, + OPT_e = (1 << 4) * ENABLE_FEATURE_RUN_PARTS_LONG_OPTIONS, + OPT_l = (1 << 5) * ENABLE_FEATURE_RUN_PARTS_LONG_OPTIONS + * ENABLE_FEATURE_RUN_PARTS_FANCY, }; -#if ENABLE_FEATURE_RUN_PARTS_FANCY -#define list_mode (option_mask32 & OPT_l) -#else -#define list_mode 0 -#endif - /* Is this a valid filename (upper/lower alpha, digits, * underscores, and hyphens only?) */ @@ -111,7 +139,7 @@ static int FAST_FUNC act(const char *file, struct stat *statbuf, void *args UNUS if (depth == 2 && ( !(statbuf->st_mode & (S_IFREG | S_IFLNK)) || invalid_name(file) - || (!list_mode && access(file, X_OK) != 0)) + || (!(option_mask32 & OPT_l) && access(file, X_OK) != 0)) ) { return SKIP; } @@ -127,13 +155,19 @@ static int FAST_FUNC act(const char *file, struct stat *statbuf, void *args UNUS static const char runparts_longopts[] ALIGN1 = "arg\0" Required_argument "a" "umask\0" Required_argument "u" - "test\0" No_argument "t" -#if ENABLE_FEATURE_RUN_PARTS_FANCY - "list\0" No_argument "l" - "reverse\0" No_argument "r" //TODO: "verbose\0" No_argument "v" -#endif + "reverse\0" No_argument "\xf0" + "test\0" No_argument "\xf1" + "exit-on-error\0" No_argument "\xf2" +# if ENABLE_FEATURE_RUN_PARTS_FANCY + "list\0" No_argument "\xf3" +# endif ; +# define GETOPT32 getopt32long +# define LONGOPTS ,runparts_longopts +#else +# define GETOPT32 getopt32 +# define LONGOPTS #endif int run_parts_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; @@ -146,12 +180,10 @@ int run_parts_main(int argc UNUSED_PARAM, char **argv) INIT_G(); -#if ENABLE_FEATURE_RUN_PARTS_LONG_OPTIONS - applet_long_options = runparts_longopts; -#endif /* We require exactly one argument: the directory name */ - opt_complementary = "=1:a::"; - getopt32(argv, "ra:u:t"IF_FEATURE_RUN_PARTS_FANCY("l"), &arg_list, &umask_p); + GETOPT32(argv, "^" "a:*u:" "\0" "=1" LONGOPTS, + &arg_list, &umask_p + ); umask(xstrtou_range(umask_p, 8, 0, 07777)); @@ -193,7 +225,10 @@ int run_parts_main(int argc UNUSED_PARAM, char **argv) if (ret < 0) bb_perror_msg("can't execute '%s'", name); else /* ret > 0 */ - bb_error_msg("%s exited with code %d", name, ret & 0xff); + bb_error_msg("%s: exit status %u", name, ret & 0xff); + + if (option_mask32 & OPT_e) + xfunc_die(); } return n;