OSDN Git Service

1) bb_opt_complementaly -> bb_opt_complementally
author"Vladimir N. Oleynik" <dzo@simtreas.ru>
Mon, 5 Sep 2005 14:46:07 +0000 (14:46 -0000)
committer"Vladimir N. Oleynik" <dzo@simtreas.ru>
Mon, 5 Sep 2005 14:46:07 +0000 (14:46 -0000)
2) better support long options
3) new flag '!' for bb_opt_complementally: produce bb_show_usage() if BB_GETOPT_ERROR internally

20 files changed:
archival/ar.c
archival/dpkg_deb.c
archival/tar.c
coreutils/cut.c
coreutils/date.c
coreutils/df.c
coreutils/du.c
coreutils/env.c
coreutils/id.c
coreutils/install.c
coreutils/mv.c
coreutils/rm.c
debianutils/start_stop_daemon.c
findutils/grep.c
findutils/xargs.c
include/libbb.h
libbb/getopt_ulflags.c
miscutils/crond.c
networking/wget.c
util-linux/hwclock.c

index 8326aa6..21096d7 100644 (file)
@@ -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();
        }
 
index b95ec2d..6c665e5 100644 (file)
@@ -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();
        }
 
index 585f062..a262386 100644 (file)
@@ -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
index e5fb5af..f65754e 100644 (file)
@@ -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)
index 70484e2..0488b2d 100644 (file)
@@ -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) {
index 9233fbb..51d3cc6 100644 (file)
@@ -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;
index bfa4403..3778f08 100644 (file)
@@ -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))) {
index 87ab30c..70cef65 100644 (file)
@@ -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);
index 6360491..03c6a6d 100644 (file)
@@ -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();
index 345e75a..e22dda6 100644 (file)
@@ -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;
index e1c4529..43a8e6d 100644 (file)
@@ -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();
index 39609e7..e4e9bb0 100644 (file)
@@ -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;
index 03f4916..4fce80d 100644 (file)
@@ -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();
        }
 
index a8fd2d4..2a667e3 100644 (file)
@@ -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);
 
index 1a43478..eef7c69 100644 (file)
@@ -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::"
index 077b310..15af6c4 100644 (file)
@@ -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, ...);
 
index 6197e8d..44c8e1a 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * universal getopt_ulflags implementation for busybox
  *
- * Copyright (C) 2003  Vladimir Oleynik  <dzo@simtreas.ru>
+ * Copyright (C) 2003-2005  Vladimir Oleynik  <dzo@simtreas.ru>
  *
  * 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
 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_<applet>_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_<applet>_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) {
index 53c255f..257632f 100644 (file)
@@ -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. */
index 59f30c0..0a4ccad 100644 (file)
@@ -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) {
index 3c26839..11261f4 100644 (file)
@@ -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))