From 3fa85f0f5e9480d9ded4f7ebc535634d79389987 Mon Sep 17 00:00:00 2001 From: FRIGN Date: Fri, 13 Mar 2015 23:43:13 +0100 Subject: [PATCH] Fix argument parsing in test(1) and chmod(1) We just take the raw argument list as is. Using arg.h, arguments beginning with - would have been "eaten up". Writing a special "bailout" for arg.h was not a good option, not because it's not impossible (done in 6 LOC), but because it is a shoehorning around a corner case present for a few programs which are broken by design by POSIX. --- chmod.c | 4 ++-- chown.c | 1 - test.c | 5 +---- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/chmod.c b/chmod.c index f93fc16..1cfa6b3 100644 --- a/chmod.c +++ b/chmod.c @@ -41,8 +41,8 @@ main(int argc, char *argv[]) struct recursor r = { .fn = chmodr, .hist = NULL, .depth = 0, .follow = 'P', .flags = 0}; size_t i; - argv0 = *(argv++); - argc--; + argv0 = argv[0], argc--, argv++; + for (; *argv && (*argv)[0] == '-'; argc--, argv++) { if (!(*argv)[1]) usage(); diff --git a/chown.c b/chown.c index 290ac11..bc2bb1f 100644 --- a/chown.c +++ b/chown.c @@ -52,7 +52,6 @@ main(int argc, char *argv[]) struct recursor r = { .fn = chownpwgr, .hist = NULL, .depth = 0, .follow = 'P', .flags = 0}; char *owner, *group; - ARGBEGIN { case 'h': hflag = 1; diff --git a/test.c b/test.c index b9d4834..52e2275 100644 --- a/test.c +++ b/test.c @@ -148,10 +148,7 @@ main(int argc, char *argv[]) int (*narg[])(char *[]) = { noarg, onearg, twoarg, threearg, fourarg }; size_t len; - ARGBEGIN { - default: - break; - } ARGEND; + argv0 = argv[0], argc--, argv++; len = strlen(argv0); if (len && argv0[--len] == '[' && (!len || argv0[--len] == '/') && strcmp(argv[--argc], "]"))