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
1 changed files with 43 additions and 0 deletions
|
@ -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 a new issue