[PATCH] v2 - lib: fwts_args: handle cases to set optarg_handler for long options.

Deb McLemore debmc at linux.vnet.ibm.com
Wed Mar 23 20:09:49 UTC 2016


This fix properly searches the options tables based on the number of
options in each option table iteration to find the proper optarg_handler
to be called to handle the long option from getopt_long.

Signed-off-by: Deb McLemore <debmc at linux.vnet.ibm.com>
---
 src/lib/src/fwts_args.c | 33 ++++++++++++++++++---------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/lib/src/fwts_args.c b/src/lib/src/fwts_args.c
index 43c8ee8..d4fa46a 100644
--- a/src/lib/src/fwts_args.c
+++ b/src/lib/src/fwts_args.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2011-2016 Canonical
+ * Some of this work - Copyright (C) 2016 IBM
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -102,6 +103,8 @@ int fwts_args_parse(fwts_framework *fw, const int argc, char * const argv[])
 	int i;
 	int c;
 	int option_index;
+	int master_option_index;
+	int translated_long_option_index;
 	int ret = FWTS_OK;
 	char *short_options = NULL;
 	size_t short_options_len = 0;
@@ -162,6 +165,8 @@ int fwts_args_parse(fwts_framework *fw, const int argc, char * const argv[])
 	}
 
 	for (;;) {
+		master_option_index = total_options;
+		translated_long_option_index = 0;
 		c = getopt_long(argc, argv, short_options, long_options, &option_index);
 		if (c == -1)
 			break;
@@ -170,38 +175,36 @@ int fwts_args_parse(fwts_framework *fw, const int argc, char * const argv[])
 			bool found = false;
 
 			if (c != 0) {
-				for (i=0; i<options_table->num_options; i++, n++) {
+				for (i=0; i<options_table->num_options; i++) {
 					char *short_name = options_table->options[i].short_name;
 					if (index(short_name, c) != NULL) {
 						found = true;
 						break;
 					}
 				}
-			} else if (options_table->num_options > option_index)
-				found = true;
+			} else {  /* c is zero for long option cases but we need the right optarg_handler set */
+				for (i=0; i<options_table->num_options; i++) {
+					if (strcmp(options_table->options[i].long_name,long_options[option_index].name) == 0) {
+						translated_long_option_index = i;
+						found = true;
+						break;
+					}
+				}
+			}
 
 			/*  Found an option, then run the appropriate handler */
 			if (found) {
-				ret = options_table->optarg_handler(fw, argc, argv, c, option_index);
+				ret = options_table->optarg_handler(fw, argc, argv, c, translated_long_option_index);
 				if (ret != FWTS_OK)
 					goto exit;
 				break;
 			} else {
-				option_index -= options_table->num_options;
+				master_option_index -= options_table->num_options;
 			}
-		}
-	}
-
-	/* We've collected all the args, now sanity check the values */
 
-	fwts_list_foreach(item, &options_list) {
-		options_table = fwts_list_data(fwts_options_table *, item);
-		if (options_table->optarg_check != NULL) {
-			ret = options_table->optarg_check(fw);
-			if (ret != FWTS_OK)
-				break;
 		}
 	}
+
 exit:
 	free(short_options);
 	free(long_options);
-- 
1.8.3.1




More information about the fwts-devel mailing list