From: "Vladimir N. Oleynik" Date: Mon, 5 Sep 2005 14:46:07 +0000 (-0000) Subject: 1) bb_opt_complementaly -> bb_opt_complementally X-Git-Tag: 1_1_0~777 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=27421a1878847389391c1a43420baaccf57057a7;p=oweals%2Fbusybox.git 1) bb_opt_complementaly -> bb_opt_complementally 2) better support long options 3) new flag '!' for bb_opt_complementally: produce bb_show_usage() if BB_GETOPT_ERROR internally --- diff --git a/archival/ar.c b/archival/ar.c index 8326aa6de..21096d712 100644 --- a/archival/ar.c +++ b/archival/ar.c @@ -67,10 +67,10 @@ extern int ar_main(int argc, char **argv) archive_handle = init_handle(); - bb_opt_complementaly = "p~tx:t~px:x~pt"; + bb_opt_complementally = "!p~tx:t~px:x~pt"; opt = bb_getopt_ulflags(argc, argv, "ptxovcr"); - if ((opt & BB_GETOPT_ERROR) || (opt == 0) || (optind == argc)) { + if ((opt == 0) || (optind == argc)) { bb_show_usage(); } diff --git a/archival/dpkg_deb.c b/archival/dpkg_deb.c index b95ec2d6e..6c665e57a 100644 --- a/archival/dpkg_deb.c +++ b/archival/dpkg_deb.c @@ -56,7 +56,7 @@ extern int dpkg_deb_main(int argc, char **argv) control_tar_llist = llist_add_to(control_tar_llist, "control.tar.bz2"); #endif - bb_opt_complementaly = "c~efXx:e~cfXx:f~ceXx:X~cefx:x~cefX"; + bb_opt_complementally = "!c~efXx:e~cfXx:f~ceXx:X~cefx:x~cefX"; opt = bb_getopt_ulflags(argc, argv, "cefXx"); if (opt & DPKG_DEB_OPT_CONTENTS) { @@ -88,7 +88,7 @@ extern int dpkg_deb_main(int argc, char **argv) argcount = 2; } - if ((optind + argcount != argc) || (opt & BB_GETOPT_ERROR)) { + if ((optind + argcount) != argc) { bb_show_usage(); } diff --git a/archival/tar.c b/archival/tar.c index 585f0629f..a2623863d 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -706,7 +706,7 @@ int tar_main(int argc, char **argv) tar_handle = init_handle(); tar_handle->flags = ARCHIVE_CREATE_LEADING_DIRS | ARCHIVE_PRESERVE_DATE | ARCHIVE_EXTRACT_UNCONDITIONAL; - bb_opt_complementaly = "c~tx:t~cx:x~ct:X*:T*"; + bb_opt_complementally = "!c~tx:t~cx:x~ct:X*:T*"; #ifdef CONFIG_FEATURE_TAR_LONG_OPTIONS bb_applet_long_options = tar_long_options; #endif @@ -720,10 +720,6 @@ int tar_main(int argc, char **argv) #endif ); - /* Check one and only one context option was given */ - if(opt & BB_GETOPT_ERROR) { - bb_show_usage(); - } #ifdef CONFIG_FEATURE_TAR_CREATE ctx_flag = opt & (CTX_CREATE | CTX_TEST | CTX_EXTRACT); #else diff --git a/coreutils/cut.c b/coreutils/cut.c index e5fb5aff7..f65754e63 100644 --- a/coreutils/cut.c +++ b/coreutils/cut.c @@ -295,7 +295,7 @@ extern int cut_main(int argc, char **argv) unsigned long opt; char *sopt, *sdopt; - bb_opt_complementaly = "b~bcf:c~bcf:f~bcf"; + bb_opt_complementally = "b~bcf:c~bcf:f~bcf"; opt = bb_getopt_ulflags(argc, argv, optstring, &sopt, &sopt, &sopt, &sdopt); part = opt & (OPT_BYTE_FLGS|OPT_CHAR_FLGS|OPT_FIELDS_FLGS); if(part == 0) diff --git a/coreutils/date.c b/coreutils/date.c index 70484e2cd..0488b2de3 100644 --- a/coreutils/date.c +++ b/coreutils/date.c @@ -152,7 +152,7 @@ int date_main(int argc, char **argv) #else # define GETOPT_ISOFMT #endif - bb_opt_complementaly = "d~ds:s~ds"; + bb_opt_complementally = "!d~ds:s~ds"; opt = bb_getopt_ulflags(argc, argv, "Rs:ud:r:" GETOPT_ISOFMT, &date_str, &date_str, &filename #ifdef CONFIG_FEATURE_DATE_ISOFMT @@ -165,8 +165,6 @@ int date_main(int argc, char **argv) bb_error_msg_and_die(bb_msg_memory_exhausted); } use_arg = opt & DATE_OPT_DATE; - if(opt & BB_GETOPT_ERROR) - bb_show_usage(); #ifdef CONFIG_FEATURE_DATE_ISOFMT if(opt & DATE_OPT_TIMESPEC) { if (!isofmt_arg) { diff --git a/coreutils/df.c b/coreutils/df.c index 9233fbbf1..51d3cc632 100644 --- a/coreutils/df.c +++ b/coreutils/df.c @@ -62,7 +62,7 @@ extern int df_main(int argc, char **argv) const char *disp_units_hdr = hdr_1k; #ifdef CONFIG_FEATURE_HUMAN_READABLE - bb_opt_complementaly = "h-km:k-hm:m-hk"; + bb_opt_complementally = "h-km:k-hm:m-hk"; opt = bb_getopt_ulflags(argc, argv, "hmk"); if(opt & 1) { df_disp_hr = 0; diff --git a/coreutils/du.c b/coreutils/du.c index bfa44034a..3778f0895 100644 --- a/coreutils/du.c +++ b/coreutils/du.c @@ -191,7 +191,7 @@ int du_main(int argc, char **argv) * ignore -a. This is consistent with -s being equivalent to -d 0. */ #ifdef CONFIG_FEATURE_HUMAN_READABLE - bb_opt_complementaly = "h-km:k-hm:m-hk:H-L:L-H:s-d:d-s"; + bb_opt_complementally = "h-km:k-hm:m-hk:H-L:L-H:s-d:d-s"; opt = bb_getopt_ulflags(argc, argv, "aHkLsx" "d:" "lc" "hm", &smax_print_depth); if((opt & (1 << 9))) { /* -h opt */ @@ -206,7 +206,7 @@ int du_main(int argc, char **argv) disp_hr = KILOBYTE; } #else - bb_opt_complementaly = "H-L:L-H:s-d:d-s"; + bb_opt_complementally = "H-L:L-H:s-d:d-s"; opt = bb_getopt_ulflags(argc, argv, "aHkLsx" "d:" "lc", &smax_print_depth); #if !defined CONFIG_FEATURE_DU_DEFALT_BLOCKSIZE_1K if((opt & (1 << 2))) { diff --git a/coreutils/env.c b/coreutils/env.c index 87ab30cdd..70cef6588 100644 --- a/coreutils/env.c +++ b/coreutils/env.c @@ -65,7 +65,7 @@ extern int env_main(int argc, char** argv) llist_t *unset_env = NULL; extern char **environ; - bb_opt_complementaly = "u*"; + bb_opt_complementally = "u*"; bb_applet_long_options = env_long_options; opt = bb_getopt_ulflags(argc, argv, "+iu:", &unset_env); diff --git a/coreutils/id.c b/coreutils/id.c index 636049168..03c6a6d2a 100644 --- a/coreutils/id.c +++ b/coreutils/id.c @@ -61,12 +61,11 @@ extern int id_main(int argc, char **argv) unsigned long flags; short status; - bb_opt_complementaly = "u~g:g~u"; + bb_opt_complementally = "!u~g:g~u"; flags = bb_getopt_ulflags(argc, argv, "rnug"); - if ((flags & BB_GETOPT_ERROR) /* Don't allow -n -r -nr */ - || (flags <= 3 && flags > 0) + if ((flags <= 3 && flags > 0) /* Don't allow more than one username */ || (argc > optind + 1)) bb_show_usage(); diff --git a/coreutils/install.c b/coreutils/install.c index 345e75af0..e22dda6f9 100644 --- a/coreutils/install.c +++ b/coreutils/install.c @@ -64,15 +64,10 @@ extern int install_main(int argc, char **argv) int i; bb_applet_long_options = install_long_options; - bb_opt_complementaly = "s~d:d~s"; + bb_opt_complementally = "!s~d:d~s"; /* -c exists for backwards compatability, its needed */ flags = bb_getopt_ulflags(argc, argv, "cdpsg:m:o:", &gid_str, &mode_str, &uid_str); /* 'a' must be 2nd */ - /* Check valid options were given */ - if(flags & BB_GETOPT_ERROR) { - bb_show_usage(); - } - /* preserve access and modification time, this is GNU behaviour, BSD only preserves modification time */ if (flags & INSTALL_OPT_PRESERVE_TIME) { copy_flags |= FILEUTILS_PRESERVE_STATUS; diff --git a/coreutils/mv.c b/coreutils/mv.c index e1c4529ad..43a8e6d7d 100644 --- a/coreutils/mv.c +++ b/coreutils/mv.c @@ -56,7 +56,7 @@ extern int mv_main(int argc, char **argv) int status = 0; bb_applet_long_options = mv_long_options; - bb_opt_complementaly = "f-i:i-f"; + bb_opt_complementally = "f-i:i-f"; flags = bb_getopt_ulflags(argc, argv, "fi"); if (optind + 2 > argc) { bb_show_usage(); diff --git a/coreutils/rm.c b/coreutils/rm.c index 39609e7b8..e4e9bb0be 100644 --- a/coreutils/rm.c +++ b/coreutils/rm.c @@ -38,7 +38,7 @@ extern int rm_main(int argc, char **argv) int flags = 0; unsigned long opt; - bb_opt_complementaly = "f-i:i-f"; + bb_opt_complementally = "f-i:i-f"; opt = bb_getopt_ulflags(argc, argv, "fiRr"); if(opt & 1) flags |= FILEUTILS_FORCE; diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 03f49165c..4fce80dbb 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c @@ -233,12 +233,12 @@ start_stop_daemon_main(int argc, char **argv) bb_applet_long_options = ssd_long_options; - bb_opt_complementaly = "K~S:S~K"; + bb_opt_complementally = "!K~S:S~K"; opt = bb_getopt_ulflags(argc, argv, "KSbqma:n:s:u:x:p:", &startas, &cmdname, &signame, &userspec, &execname, &pidfile); - /* Check one and only one context option was given */ - if ((opt & BB_GETOPT_ERROR) || (opt & (SSD_CTX_STOP | SSD_CTX_START)) == 0) { + /* Check required one context option was given */ + if ((opt & (SSD_CTX_STOP | SSD_CTX_START)) == 0) { bb_show_usage(); } diff --git a/findutils/grep.c b/findutils/grep.c index a8fd2d41a..2a667e37f 100644 --- a/findutils/grep.c +++ b/findutils/grep.c @@ -271,7 +271,7 @@ extern int grep_main(int argc, char **argv) char *slines_before; char *Copt; - bb_opt_complementaly = "H-h:e*:f*:C-AB"; + bb_opt_complementally = "H-h:e*:f*:C-AB"; opt = bb_getopt_ulflags(argc, argv, GREP_OPTS GREP_OPT_CONTEXT OPT_EGREP, &pattern_head, &fopt, @@ -306,7 +306,7 @@ extern int grep_main(int argc, char **argv) } #else /* with auto sanity checks */ - bb_opt_complementaly = "H-h:e*:f*:c-n:q-n:l-n"; + bb_opt_complementally = "H-h:e*:f*:c-n:q-n:l-n"; opt = bb_getopt_ulflags(argc, argv, GREP_OPTS OPT_EGREP, &pattern_head, &fopt); diff --git a/findutils/xargs.c b/findutils/xargs.c index 1a4347828..eef7c6909 100644 --- a/findutils/xargs.c +++ b/findutils/xargs.c @@ -438,7 +438,7 @@ int xargs_main(int argc, char **argv) #endif #ifdef CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION - bb_opt_complementaly = "pt"; + bb_opt_complementally = "pt"; #endif opt = bb_getopt_ulflags(argc, argv, "+trn:s:e::" diff --git a/include/libbb.h b/include/libbb.h index 077b310b6..15af6c463 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -152,7 +152,7 @@ extern int bb_fclose_nonstdin(FILE *f); extern void bb_fflush_stdout_and_exit(int retval) __attribute__ ((noreturn)); #define BB_GETOPT_ERROR 0x80000000UL -extern const char *bb_opt_complementaly; +extern const char *bb_opt_complementally; extern const struct option *bb_applet_long_options; extern unsigned long bb_getopt_ulflags(int argc, char **argv, const char *applet_opts, ...); diff --git a/libbb/getopt_ulflags.c b/libbb/getopt_ulflags.c index 6197e8d9f..44c8e1a76 100644 --- a/libbb/getopt_ulflags.c +++ b/libbb/getopt_ulflags.c @@ -2,7 +2,7 @@ /* * universal getopt_ulflags implementation for busybox * - * Copyright (C) 2003 Vladimir Oleynik + * Copyright (C) 2003-2005 Vladimir Oleynik * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,158 +31,152 @@ unsigned long bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) - The command line options must be declared in const char - *applet_opts as a string of chars, for example: + The command line options must be declared in const char + *applet_opts as a string of chars, for example: - flags = bb_getopt_ulflags(argc, argv, "rnug"); + flags = bb_getopt_ulflags(argc, argv, "rnug"); - If one of the given options is found, a flag value is added to - the return value (an unsigned long). + If one of the given options is found, a flag value is added to + the return value (an unsigned long). - The flag value is determined by the position of the char in - applet_opts string. For example, in the above case: + The flag value is determined by the position of the char in + applet_opts string. For example, in the above case: - flags = bb_getopt_ulflags(argc, argv, "rnug"); + flags = bb_getopt_ulflags(argc, argv, "rnug"); - "r" will add 1 (bit 1 : 0x01) - "n" will add 2 (bit 2 : 0x02) - "u will add 4 (bit 3 : 0x03) - "g" will add 8 (bit 4 : 0x04) + "r" will add 1 (bit 1 : 0x01) + "n" will add 2 (bit 2 : 0x02) + "u will add 4 (bit 3 : 0x03) + "g" will add 8 (bit 4 : 0x04) - and so on. You can also look at the return value as a bit - field and each option sets one of bits. + and so on. You can also look at the return value as a bit + field and each option sets one of bits. - ":" If one of the options requires an argument, then add a ":" - after the char in applet_opts and provide a pointer to store - the argument. For example: + ":" If one of the options requires an argument, then add a ":" + after the char in applet_opts and provide a pointer to store + the argument. For example: - char *pointer_to_arg_for_a; - char *pointer_to_arg_for_b; - char *pointer_to_arg_for_c; - char *pointer_to_arg_for_d; + char *pointer_to_arg_for_a; + char *pointer_to_arg_for_b; + char *pointer_to_arg_for_c; + char *pointer_to_arg_for_d; - flags = bb_getopt_ulflags(argc, argv, "a:b:c:d:", - &pointer_to_arg_for_a, &pointer_to_arg_for_b, - &pointer_to_arg_for_c, &pointer_to_arg_for_d); + flags = bb_getopt_ulflags(argc, argv, "a:b:c:d:", + &pointer_to_arg_for_a, &pointer_to_arg_for_b, + &pointer_to_arg_for_c, &pointer_to_arg_for_d); - The type of the pointer (char* or llist_t *) may be controlled - by the "*" special character that is set in the external string - bb_opt_complementaly (see below for more info). + The type of the pointer (char* or llist_t *) may be controlled + by the "*" special character that is set in the external string + bb_opt_complementally (see below for more info). static const struct option bb_default_long_options[] - This struct allows you to define long options. The syntax for - declaring the array is just like that of getopt's longopts. + This struct allows you to define long options. The syntax for + declaring the array is just like that of getopt's longopts. + (see getopt(3)) - static const struct option applet_long_options[] = { - { "verbose", 0, 0, "v" }, - { 0, 0, 0, 0 } - }; - bb_applet_long_options = applet_long_options; + static const struct option applet_long_options[] = { + { "verbose", 0, 0, v }, + { 0, 0, 0, 0 } + }; + bb_applet_long_options = applet_long_options; - The first parameter is the long option name that you would pass - to the applet (without the dashes). + The last argument (val) can undefined from applet_opts. + If you use this, then: + - return bit have next position after short options + - if has_arg is not "no_argument", use ptr for arg also + - bb_opt_complementally have effects for this too - The second field determines whether the option has an argument. - You can set this to 0, 1, or 2, or you can use the long named - defines of no_argument, required_argument, and optional_argument. + Note: a good applet will make long options configurable via the + config process and not a required feature. The current standard + is to name the config option CONFIG_FEATURE__LONG_OPTIONS. - The third argument is used only when the long option does not - have a corresponding short option. In that case, it should be - an integer pointer. Otherwise (and normally), it should just - bet set to NULL. +const char *bb_opt_complementally - The last argument is the corresponding short option (if there - is one of course). + ":" The colon (":") is used to separate groups of two or more chars + and/or groups of chars and special characters (stating some + conditions to be checked). - Note: a good applet will make long options configurable via the - config process and not a required feature. The current standard - is to name the config option CONFIG_FEATURE__LONG_OPTIONS. + "abc" If groups of two or more chars are specified, the first char + is the main option and the other chars are secondary options. + Their flags will be turned on if the main option is found even + if they are not specifed on the command line. For example: -const char *bb_opt_complementaly + bb_opt_complementally = "abc"; - ":" The colon (":") is used to separate groups of two or more chars - and/or groups of chars and special characters (stating some - conditions to be checked). + flags = bb_getopt_ulflags(argc, argv, "abcd") - "abc" If groups of two or more chars are specified, the first char - is the main option and the other chars are secondary options. - Their flags will be turned on if the main option is found even - if they are not specifed on the command line. For example: - - bb_opt_complementaly = "abc"; - - flags = bb_getopt_ulflags(argc, argv, "abcd") - - If getopt() finds "-a" on the command line, then - bb_getopt_ulflags's return value will be as if "-a -b -c" were - found. + If getopt() finds "-a" on the command line, then + bb_getopt_ulflags's return value will be as if "-a -b -c" were + found. Special characters: - "-" A dash between two options causes the second of the two - to be unset (and ignored) if it is given on the command line. + "-" A dash between two options causes the second of the two + to be unset (and ignored) if it is given on the command line. - For example: - The du applet has the options "-s" and "-d depth". If - bb_getopt_ulflags finds -s, then -d is unset or if it finds -d - then -s is unset. (Note: busybox implements the GNU - "--max-depth" option as "-d".) To obtain this behavior, you - set bb_opt_complementaly = "s-d:d-s". Only one flag value is - added to bb_getopt_ulflags's return value depending on the - position of the options on the command line. If one of the - two options requires an argument pointer (":" in applet_opts - as in "d:") optarg is set accordingly. + For example: + The du applet has the options "-s" and "-d depth". If + bb_getopt_ulflags finds -s, then -d is unset or if it finds -d + then -s is unset. (Note: busybox implements the GNU + "--max-depth" option as "-d".) To obtain this behavior, you + set bb_opt_complementally = "s-d:d-s". Only one flag value is + added to bb_getopt_ulflags's return value depending on the + position of the options on the command line. If one of the + two options requires an argument pointer (":" in applet_opts + as in "d:") optarg is set accordingly. - char *smax_print_depth; + char *smax_print_depth; - bb_opt_complementaly = "s-d:d-s"; - opt = bb_getopt_ulflags(argc, argv, "sd:", &smax_print_depth); + bb_opt_complementally = "s-d:d-s"; + opt = bb_getopt_ulflags(argc, argv, "sd:", &smax_print_depth); - if (opt & 2) { - max_print_depth = bb_xgetularg10_bnd(smax_print_depth, - 0, INT_MAX); - } + if (opt & 2) { + max_print_depth = bb_xgetularg10_bnd(smax_print_depth, + 0, INT_MAX); + } - "~" A tilde between two options, or between an option and a group - of options, means that they are mutually exclusive. Unlike - the "-" case above, an error will be forced if the options - are used together. + "~" A tilde between two options, or between an option and a group + of options, means that they are mutually exclusive. Unlike + the "-" case above, an error will be forced if the options + are used together. - For example: - The cut applet must have only one type of list specified, so - -b, -c and -f are mutally exclusive and should raise an error - if specified together. In this case you must set - bb_opt_complementaly = "b~cf:c~bf:f~bc". If two of the - mutually exclusive options are found, bb_getopt_ulflags's - return value will have the error flag set (BB_GETOPT_ERROR) so - that we can check for it: + For example: + The cut applet must have only one type of list specified, so + -b, -c and -f are mutally exclusive and should raise an error + if specified together. In this case you must set + bb_opt_complementally = "b~cf:c~bf:f~bc". If two of the + mutually exclusive options are found, bb_getopt_ulflags's + return value will have the error flag set (BB_GETOPT_ERROR) so + that we can check for it: - if (flags & BB_GETOPT_ERROR) - bb_show_usage(); + if (flags & BB_GETOPT_ERROR) + bb_show_usage(); - "*" A star after a char in bb_opt_complementaly means that the - option can occur multiple times: + "!" If previous point set BB_GETOPT_ERROR, don`t return and call + previous example internally - For example: - The grep applet can have one or more "-e pattern" arguments. - In this case you should use bb_getopt_ulflags() as follows: + "*" A star after a char in bb_opt_complementally means that the + option can occur multiple times: - llist_t *patterns = NULL; + For example: + The grep applet can have one or more "-e pattern" arguments. + In this case you should use bb_getopt_ulflags() as follows: - (this pointer must be initializated to NULL if the list is empty - as required by *llist_add_to(llist_t *old_head, char *new_item).) + llist_t *patterns = NULL; - bb_opt_complementaly = "e*"; + (this pointer must be initializated to NULL if the list is empty + as required by *llist_add_to(llist_t *old_head, char *new_item).) - bb_getopt_ulflags(argc, argv, "e:", &patterns); - $ grep -e user -e root /etc/passwd - root:x:0:0:root:/root:/bin/bash - user:x:500:500::/home/user:/bin/bash + bb_opt_complementally = "e*"; + bb_getopt_ulflags(argc, argv, "e:", &patterns); + $ grep -e user -e root /etc/passwd + root:x:0:0:root:/root:/bin/bash + user:x:500:500::/home/user:/bin/bash */ -const char *bb_opt_complementaly; +const char *bb_opt_complementally; typedef struct { unsigned char opt; @@ -191,12 +185,12 @@ typedef struct { unsigned long switch_off; unsigned long incongruously; void **optarg; /* char **optarg or llist_t **optarg */ -} t_complementaly; +} t_complementally; /* You can set bb_applet_long_options for parse called long options */ static const struct option bb_default_long_options[] = { -/* { "help", 0, NULL, '?' }, */ +/* { "help", 0, NULL, '?' }, */ { 0, 0, 0, 0 } }; @@ -206,11 +200,13 @@ unsigned long bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) { unsigned long flags = 0; - t_complementaly complementaly[sizeof(flags) * 8 + 1]; + t_complementally complementally[sizeof(flags) * 8 + 1]; int c; const unsigned char *s; - t_complementaly *on_off; + t_complementally *on_off; va_list p; + const struct option *l_o; + char flg_show_usage_if_error = 0; va_start (p, applet_opts); @@ -220,7 +216,7 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) s++; c = 0; - on_off = complementaly; + on_off = complementally; for (; *s; s++) { if(c >= (sizeof(flags)*8)) break; @@ -240,9 +236,31 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) c++; } on_off->opt = 0; + + for(l_o = bb_applet_long_options; l_o->name; l_o++) { + for(on_off = complementally; on_off->opt != 0; on_off++) + if(on_off->opt == l_o->val) + break; + if(on_off->opt == 0) { + if(c >= (sizeof(flags)*8)) + break; + on_off->opt = l_o->val; + on_off->switch_on = (1 << c); + on_off->list_flg = 0; + on_off->switch_off = 0; + on_off->incongruously = 0; + if(l_o->has_arg != no_argument) + on_off->optarg = va_arg (p, void **); + else + on_off->optarg = NULL; + on_off++; + on_off->opt = 0; + c++; + } + } c = 0; - for (s = bb_opt_complementaly; s && *s; s++) { - t_complementaly *pair; + for (s = bb_opt_complementally; s && *s; s++) { + t_complementally *pair; if (*s == ':') { c = 0; @@ -250,7 +268,11 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) } if (c) continue; - for (on_off = complementaly; on_off->opt; on_off++) + if(*s == '!') { + flg_show_usage_if_error = '!'; + continue; + } + for (on_off = complementally; on_off->opt; on_off++) if (on_off->opt == *s) break; pair = on_off; @@ -263,7 +285,7 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) unsigned long *pair_switch = &(pair->switch_on); if(c) pair_switch = c == '-' ? &(pair->switch_off) : &(pair->incongruously); - for (on_off = complementaly; on_off->opt; on_off++) + for (on_off = complementally; on_off->opt; on_off++) if (on_off->opt == *s) { *pair_switch |= on_off->switch_on; break; @@ -274,13 +296,16 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...) } while ((c = getopt_long (argc, argv, applet_opts, - bb_applet_long_options, NULL)) > 0) { - for (on_off = complementaly; on_off->opt != c; on_off++) { + bb_applet_long_options, NULL)) > 0) { + for (on_off = complementally; on_off->opt != c; on_off++) { if(!on_off->opt) bb_show_usage (); } - if(flags & on_off->incongruously) + if(flags & on_off->incongruously) { + if(flg_show_usage_if_error) + bb_show_usage (); flags |= BB_GETOPT_ERROR; + } flags &= ~on_off->switch_off; flags |= on_off->switch_on; if(on_off->list_flg) { diff --git a/miscutils/crond.c b/miscutils/crond.c index 53c255fef..257632f8f 100644 --- a/miscutils/crond.c +++ b/miscutils/crond.c @@ -157,9 +157,9 @@ int crond_main(int ac, char **av) #ifdef FEATURE_DEBUG_OPT char *dopt; - bb_opt_complementaly = "f-b:b-f:S-L:L-S:d-l"; + bb_opt_complementally = "f-b:b-f:S-L:L-S:d-l"; #else - bb_opt_complementaly = "f-b:b-f:S-L:L-S"; + bb_opt_complementally = "f-b:b-f:S-L:L-S"; #endif opterr = 0; /* disable getopt 'errors' message. */ diff --git a/networking/wget.c b/networking/wget.c index 59f30c06d..0a4ccaddd 100644 --- a/networking/wget.c +++ b/networking/wget.c @@ -191,7 +191,7 @@ int wget_main(int argc, char **argv) /* * Crack command line. */ - bb_opt_complementaly = "\203*"; + bb_opt_complementally = "\203*"; bb_applet_long_options = wget_long_options; opt = bb_getopt_ulflags(argc, argv, "cq\213O:\203:P:Y:", &fname_out, &headers_llist, &dir_prefix, &proxy_flag); if (opt & WGET_OPT_CONTINUE) { diff --git a/util-linux/hwclock.c b/util-linux/hwclock.c index 3c2683953..11261f47d 100644 --- a/util-linux/hwclock.c +++ b/util-linux/hwclock.c @@ -205,12 +205,8 @@ static const struct option hwclock_long_options[] = { bb_applet_long_options = hwclock_long_options; #endif - bb_opt_complementaly = "r~ws:w~rs:s~wr:l~u:u~l"; + bb_opt_complementally = "!r~ws:w~rs:s~wr:l~u:u~l"; opt = bb_getopt_ulflags(argc, argv, "lursw"); - /* Check only one mode was given */ - if(opt & BB_GETOPT_ERROR) { - bb_show_usage(); - } /* If -u or -l wasn't given check if we are using utc */ if (opt & (HWCLOCK_OPT_UTC | HWCLOCK_OPT_LOCALTIME))