musl: add getopt support for non-option arguments
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
This commit is contained in:
		
							parent
							
								
									bd164f233c
								
							
						
					
					
						commit
						d49f9039f7
					
				| @ -0,0 +1,43 @@ | ||||
| --- 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])) | ||||
|  	{ | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user