From 19fb67eee4d69e6b473c784ed95b8c08ccf24b14 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 28 Feb 2008 21:30:22 +0000 Subject: run-parts: add --reverse --- debianutils/run_parts.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/debianutils/run_parts.c b/debianutils/run_parts.c index 338817f8f..20f8b3ab8 100644 --- a/debianutils/run_parts.c +++ b/debianutils/run_parts.c @@ -23,11 +23,11 @@ * 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. + * -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. */ #include @@ -47,14 +47,15 @@ struct globals { enum { NUM_CMD = (COMMON_BUFSIZE - sizeof(struct globals)) / sizeof(cmd[0]) }; enum { - RUN_PARTS_OPT_a = (1 << 0), - RUN_PARTS_OPT_u = (1 << 1), - RUN_PARTS_OPT_t = (1 << 2), - RUN_PARTS_OPT_l = (1 << 3) * ENABLE_FEATURE_RUN_PARTS_FANCY, + 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, }; #if ENABLE_FEATURE_RUN_PARTS_FANCY -#define list_mode (option_mask32 & RUN_PARTS_OPT_l) +#define list_mode (option_mask32 & OPT_l) #else #define list_mode 0 #endif @@ -74,7 +75,8 @@ static bool invalid_name(const char *c) static int bb_alphasort(const void *p1, const void *p2) { - return strcmp(*(char **) p1, *(char **) p2); + int r = strcmp(*(char **) p1, *(char **) p2); + return (option_mask32 & OPT_r) ? -r : r; } static int act(const char *file, struct stat *statbuf, void *args, int depth) @@ -104,7 +106,7 @@ static const char runparts_longopts[] ALIGN1 = "test\0" No_argument "t" #if ENABLE_FEATURE_RUN_PARTS_FANCY "list\0" No_argument "l" -//TODO: "reverse\0" No_argument "r" + "reverse\0" No_argument "r" //TODO: "verbose\0" No_argument "v" #endif ; @@ -121,9 +123,10 @@ int run_parts_main(int argc, char **argv) #if ENABLE_FEATURE_RUN_PARTS_LONG_OPTIONS applet_long_options = runparts_longopts; #endif + /* We require exactly one argument: the directory name */ /* We require exactly one argument: the directory name */ opt_complementary = "=1:a::"; - getopt32(argv, "a:u:t"USE_FEATURE_RUN_PARTS_FANCY("l"), &arg_list, &umask_p); + getopt32(argv, "ra:u:t"USE_FEATURE_RUN_PARTS_FANCY("l"), &arg_list, &umask_p); umask(xstrtou_range(umask_p, 8, 0, 07777)); @@ -155,7 +158,7 @@ int run_parts_main(int argc, char **argv) char *name = *names++; if (!name) break; - if (option_mask32 & (RUN_PARTS_OPT_t | RUN_PARTS_OPT_l)) { + if (option_mask32 & (OPT_t | OPT_l)) { puts(name); continue; } @@ -165,9 +168,9 @@ int run_parts_main(int argc, char **argv) continue; n = 1; if (ret < 0) - bb_perror_msg("failed to exec %s", name); + bb_perror_msg("can't exec %s", name); else /* ret > 0 */ - bb_error_msg("%s exited with return code %d", name, ret); + bb_error_msg("%s exited with code %d", name, ret); } return n; -- cgit v1.2.3