svn commit: trunk/busybox: archival coreutils debianutils findutils etc...

vodz at busybox.net vodz at busybox.net
Mon Sep 5 14:46:12 UTC 2005


Author: vodz
Date: 2005-09-05 07:46:07 -0700 (Mon, 05 Sep 2005)
New Revision: 11332

Log:
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

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


Changeset:
Modified: trunk/busybox/archival/ar.c
===================================================================
--- trunk/busybox/archival/ar.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/archival/ar.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -67,10 +67,10 @@
 
 	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();
 	}
 

Modified: trunk/busybox/archival/dpkg_deb.c
===================================================================
--- trunk/busybox/archival/dpkg_deb.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/archival/dpkg_deb.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -56,7 +56,7 @@
 	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 @@
 		argcount = 2;
 	}
 
-	if ((optind + argcount != argc) || (opt & BB_GETOPT_ERROR)) {
+	if ((optind + argcount) != argc) {
 		bb_show_usage();
 	}
 

Modified: trunk/busybox/archival/tar.c
===================================================================
--- trunk/busybox/archival/tar.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/archival/tar.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -706,7 +706,7 @@
 	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 @@
 #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

Modified: trunk/busybox/coreutils/cut.c
===================================================================
--- trunk/busybox/coreutils/cut.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/coreutils/cut.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -295,7 +295,7 @@
 	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)

Modified: trunk/busybox/coreutils/date.c
===================================================================
--- trunk/busybox/coreutils/date.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/coreutils/date.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -152,7 +152,7 @@
 #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 @@
 		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) {

Modified: trunk/busybox/coreutils/df.c
===================================================================
--- trunk/busybox/coreutils/df.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/coreutils/df.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -62,7 +62,7 @@
 	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;

Modified: trunk/busybox/coreutils/du.c
===================================================================
--- trunk/busybox/coreutils/du.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/coreutils/du.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -191,7 +191,7 @@
 	 * 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 @@
 			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))) {

Modified: trunk/busybox/coreutils/env.c
===================================================================
--- trunk/busybox/coreutils/env.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/coreutils/env.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -65,7 +65,7 @@
 	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);

Modified: trunk/busybox/coreutils/id.c
===================================================================
--- trunk/busybox/coreutils/id.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/coreutils/id.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -61,12 +61,11 @@
 	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();

Modified: trunk/busybox/coreutils/install.c
===================================================================
--- trunk/busybox/coreutils/install.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/coreutils/install.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -64,15 +64,10 @@
 	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;

Modified: trunk/busybox/coreutils/mv.c
===================================================================
--- trunk/busybox/coreutils/mv.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/coreutils/mv.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -56,7 +56,7 @@
 	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();

Modified: trunk/busybox/coreutils/rm.c
===================================================================
--- trunk/busybox/coreutils/rm.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/coreutils/rm.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -38,7 +38,7 @@
 	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;

Modified: trunk/busybox/debianutils/start_stop_daemon.c
===================================================================
--- trunk/busybox/debianutils/start_stop_daemon.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/debianutils/start_stop_daemon.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -233,12 +233,12 @@
 
 	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();
 	}
 

Modified: trunk/busybox/findutils/grep.c
===================================================================
--- trunk/busybox/findutils/grep.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/findutils/grep.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -271,7 +271,7 @@
 	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 @@
 	}
 #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);
 

Modified: trunk/busybox/findutils/xargs.c
===================================================================
--- trunk/busybox/findutils/xargs.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/findutils/xargs.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -438,7 +438,7 @@
 #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::"

Modified: trunk/busybox/include/libbb.h
===================================================================
--- trunk/busybox/include/libbb.h	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/include/libbb.h	2005-09-05 14:46:07 UTC (rev 11332)
@@ -152,7 +152,7 @@
 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, ...);
 

Modified: trunk/busybox/libbb/getopt_ulflags.c
===================================================================
--- trunk/busybox/libbb/getopt_ulflags.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/libbb/getopt_ulflags.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -2,7 +2,7 @@
 /*
  * universal getopt_ulflags implementation for busybox
  *
- * Copyright (C) 2003  Vladimir Oleynik  <dzo at simtreas.ru>
+ * Copyright (C) 2003-2005  Vladimir Oleynik  <dzo at 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
@@ -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_<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:
+	If getopt() finds "-a" on the command line, then
+	bb_getopt_ulflags's return value will be as if "-a -b -c" were
+	found.
 
-           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.
-
 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 @@
 	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 @@
 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 @@
 		s++;
 
 	c = 0;
-	on_off = complementaly;
+	on_off = complementally;
 	for (; *s; s++) {
 		if(c >= (sizeof(flags)*8))
 			break;
@@ -240,9 +236,31 @@
 		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 @@
 		}
 		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 @@
 				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 @@
 	}
 
 	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) {

Modified: trunk/busybox/miscutils/crond.c
===================================================================
--- trunk/busybox/miscutils/crond.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/miscutils/crond.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -157,9 +157,9 @@
 #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. */

Modified: trunk/busybox/networking/wget.c
===================================================================
--- trunk/busybox/networking/wget.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/networking/wget.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -191,7 +191,7 @@
 	/*
 	 * 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) {

Modified: trunk/busybox/util-linux/hwclock.c
===================================================================
--- trunk/busybox/util-linux/hwclock.c	2005-09-05 13:25:11 UTC (rev 11331)
+++ trunk/busybox/util-linux/hwclock.c	2005-09-05 14:46:07 UTC (rev 11332)
@@ -205,12 +205,8 @@
 	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))




More information about the busybox-cvs mailing list