commit 3fa85f0f5e9480d9ded4f7ebc535634d79389987
parent ad6da18ca683305011113ca2f29dc474ee7e8a66
Author: FRIGN <dev@frign.de>
Date: Fri, 13 Mar 2015 23:43:13 +0100
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.
Diffstat:
3 files changed, 3 insertions(+), 7 deletions(-)
diff --git 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
@@ -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
@@ -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], "]"))