From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/6612 Path: news.gmane.org!not-for-mail From: Gianluca Anzolin Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH] getopt: add support for non-option arguments Date: Mon, 24 Nov 2014 19:39:05 +0100 Message-ID: <1416854345-5252-1-git-send-email-gianluca@sottospazio.it> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org X-Trace: ger.gmane.org 1416854369 7803 80.91.229.3 (24 Nov 2014 18:39:29 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 24 Nov 2014 18:39:29 +0000 (UTC) Cc: Gianluca Anzolin To: musl@lists.openwall.com Original-X-From: musl-return-6625-gllmg-musl=m.gmane.org@lists.openwall.com Mon Nov 24 19:39:23 2014 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1XsyXi-0001Rc-9A for gllmg-musl@m.gmane.org; Mon, 24 Nov 2014 19:39:22 +0100 Original-Received: (qmail 8072 invoked by uid 550); 24 Nov 2014 18:39:20 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 8057 invoked from network); 24 Nov 2014 18:39:20 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=sottospazio.it; h=x-mailer:message-id:date:date:subject:subject:from:from; s= mail; t=1416854347; x=1418668748; bh=k46620vLDLNeIpe+eFB0+zZr/ua WjeEKMqNc5qeLruk=; b=T/S8Yy1CsfbFcsIpodSTYmwcWqMELpUKWuhEWLQRtJj XUnvXxiUs7jARn8LhVgGtQzGoISf8UOQEQ+r5R0VoXkpW47umxfd9Ql/C+jnLU8j bR6K+6flZSTxy1CBAQNjweuJ3514xoyBYUTNmyXBKpWccs0dGg8dYDQJ2LY0fey4 = X-Mailer: git-send-email 1.7.10.4 Xref: news.gmane.org gmane.linux.lib.musl.general:6612 Archived-At: Currently getopt() doesn't handle the GNU getopt extension that allows to parse non-option arguments when optstring starts with '-'. This extensions is used by some common utilities, notably iptables, that currently return with errors even with perfectly valid invocations, for example: $ iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP The patch add the code needed to implement this extension to getopt.c and getopt_long.c Signed-off-by: Gianluca Anzolin --- src/misc/getopt.c | 17 ++++++++++++++++- src/misc/getopt_long.c | 6 +++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/misc/getopt.c b/src/misc/getopt.c index f94c4f7..a698c8d 100644 --- a/src/misc/getopt.c +++ b/src/misc/getopt.c @@ -24,8 +24,20 @@ int getopt(int argc, char * const argv[], const char *optstring) optind = 1; } - if (optind >= argc || !argv[optind] || argv[optind][0] != '-' || !argv[optind][1]) + if (optind >= argc || !argv[optind]) return -1; + + if (argv[optind][0] != '-') { + if (optstring[0] == '-') { + optarg = argv[optind++]; + return 1; + } + return -1; + } + + if (!argv[optind][1]) + return -1; + if (argv[optind][1] == '-' && !argv[optind][2]) return optind++, -1; @@ -43,6 +55,9 @@ int getopt(int argc, char * const argv[], const char *optstring) optpos = 0; } + if (optstring[0] == '-') + optstring++; + for (i=0; (l = mbtowc(&d, optstring+i, MB_LEN_MAX)) && d!=c; i+=l>0?l:1); if (d != c) { diff --git a/src/misc/getopt_long.c b/src/misc/getopt_long.c index 4ef5a5c..d8b2b66 100644 --- a/src/misc/getopt_long.c +++ b/src/misc/getopt_long.c @@ -12,7 +12,11 @@ static int __getopt_long(int argc, char *const *argv, const char *optstring, con __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])) { -- 2.1.3