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>

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@43309 3c298f89-4303-0410-b956-a3cf2f4a3e73
master
John Crispin 2014-11-19 09:21:02 +00:00
parent c3e4dee757
commit 013b2bcd25
1 changed files with 43 additions and 0 deletions

View File

@ -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]))
{