musl libc doesn't support the GNU getopt extension to parse non-option arguments when the optstring starts with '-'. This extension is used by some utilities, notably iptables, that currently return with errors even with perfectly valid invocations. The patch adds the code needed by getopt.c and getopt_long.c to implement that extension. Signed-off-by: Gianluca Anzolin <gianluca@sottospazio.it> SVN-Revision: 43309
		
			
				
	
	
		
			44 lines
		
	
	
		
			1000 B
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			1000 B
		
	
	
	
		
			Diff
		
	
	
	
	
	
--- a/src/misc/getopt.c
 | 
						|
+++ b/src/misc/getopt.c
 | 
						|
@@ -24,8 +24,23 @@ int getopt(int argc, char * const argv[]
 | 
						|
 		optind = 1;
 | 
						|
 	}
 | 
						|
 
 | 
						|
-	if (optind >= argc || !argv[optind] || argv[optind][0] != '-' || !argv[optind][1])
 | 
						|
+	if (optind >= argc || !argv[optind])
 | 
						|
 		return -1;
 | 
						|
+
 | 
						|
+	if (argv[optind][0] != '-') {
 | 
						|
+		/* GNU extension */
 | 
						|
+		if (optstring[0] == '-') {
 | 
						|
+			optarg = argv[optind];
 | 
						|
+			optind++;
 | 
						|
+			return 1;
 | 
						|
+		}
 | 
						|
+
 | 
						|
+		return -1;
 | 
						|
+	}
 | 
						|
+
 | 
						|
+	if (!argv[optind][1])
 | 
						|
+		return -1;
 | 
						|
+
 | 
						|
 	if (argv[optind][1] == '-' && !argv[optind][2])
 | 
						|
 		return optind++, -1;
 | 
						|
 
 | 
						|
--- a/src/misc/getopt_long.c
 | 
						|
+++ b/src/misc/getopt_long.c
 | 
						|
@@ -12,7 +12,12 @@ static int __getopt_long(int argc, char
 | 
						|
 		__optpos = 0;
 | 
						|
 		optind = 1;
 | 
						|
 	}
 | 
						|
-	if (optind >= argc || !argv[optind] || argv[optind][0] != '-') return -1;
 | 
						|
+	if (optind >= argc || !argv[optind])
 | 
						|
+		return -1;
 | 
						|
+
 | 
						|
+	if (argv[optind][0] != '-')
 | 
						|
+		return getopt(argc, argv, optstring);
 | 
						|
+
 | 
						|
 	if ((longonly && argv[optind][1]) ||
 | 
						|
 		(argv[optind][1] == '-' && argv[optind][2]))
 | 
						|
 	{
 |