From 45a8ed89c69f95fa35f139a7c9ddb3874b13de46 Mon Sep 17 00:00:00 2001
From: "\"Vladimir N. Oleynik\"" <dzo@simtreas.ru>
Date: Tue, 6 Sep 2005 16:08:33 +0000
Subject: - sync traceroute with Slackware-10.1   (support -FIl -g gw -i if -z
 pt now). - libbb/getopt_ulflags.c support bb_opt_complementally="x-x" as
 trigger now

---
 libbb/getopt_ulflags.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

(limited to 'libbb')

diff --git a/libbb/getopt_ulflags.c b/libbb/getopt_ulflags.c
index 44c8e1a76..58077c55f 100644
--- a/libbb/getopt_ulflags.c
+++ b/libbb/getopt_ulflags.c
@@ -113,7 +113,8 @@ const char *bb_opt_complementally
 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.
+	to be unset (and ignored or triggered) if it is given on
+	the command line.
 
 	For example:
 	The du applet has the options "-s" and "-d depth".  If
@@ -128,13 +129,15 @@ Special characters:
 
 	char *smax_print_depth;
 
-	bb_opt_complementally = "s-d:d-s";
-	opt = bb_getopt_ulflags(argc, argv, "sd:", &smax_print_depth);
+	bb_opt_complementally = "s-d:d-s:x-x";
+	opt = bb_getopt_ulflags(argc, argv, "sd:x", &smax_print_depth);
 
 	if (opt & 2) {
 		 max_print_depth = bb_xgetularg10_bnd(smax_print_depth,
 			     0, INT_MAX);
 	}
+	if(opt & 4)
+		printf("Detected odd -x usaging\n");
 
  "~"    A tilde between two options, or between an option and a group
 	of options, means that they are mutually exclusive.  Unlike
@@ -297,6 +300,8 @@ 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) {
+		unsigned long trigger;
+
 		for (on_off = complementally; on_off->opt != c; on_off++) {
 			if(!on_off->opt)
 				bb_show_usage ();
@@ -306,8 +311,10 @@ bb_getopt_ulflags (int argc, char **argv, const char *applet_opts, ...)
 				bb_show_usage ();
 			flags |= BB_GETOPT_ERROR;
 		}
-		flags &= ~on_off->switch_off;
-		flags |= on_off->switch_on;
+		trigger = on_off->switch_on & on_off->switch_off;
+		flags &= ~(on_off->switch_off ^ trigger);
+		flags |= on_off->switch_on ^ trigger;
+		flags ^= trigger;
 		if(on_off->list_flg) {
 			*(llist_t **)(on_off->optarg) =
 				llist_add_to(*(llist_t **)(on_off->optarg), optarg);
-- 
cgit v1.2.3-55-g6feb