diff options
author | Matt Kraai <kraai@debian.org> | 2001-04-26 18:55:29 +0000 |
---|---|---|
committer | Matt Kraai <kraai@debian.org> | 2001-04-26 18:55:29 +0000 |
commit | 6aabfd5e30087bb0ffdb6404aa6d650014de2dc0 (patch) | |
tree | 12ef0086ec67d48f835567c56e94ef9f749e5e7a /coreutils | |
parent | ca85cdbe4c414f5892b57a3c0fb2439f3061496c (diff) |
Fix handling of permission addition and removal (e.g., o-r).
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/chmod.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/coreutils/chmod.c b/coreutils/chmod.c index 742770e90..9139b3f4d 100644 --- a/coreutils/chmod.c +++ b/coreutils/chmod.c @@ -29,13 +29,11 @@ #include <getopt.h> #include "busybox.h" - -struct stat theMode; - - static int fileAction(const char *fileName, struct stat *statbuf, void* junk) { - if (chmod(fileName, theMode.st_mode) == 0) + if (!parse_mode((char *)junk, &(statbuf->st_mode))) + error_msg_and_die("internal error"); + if (chmod(fileName, statbuf->st_mode) == 0) return (TRUE); perror(fileName); return (FALSE); @@ -43,6 +41,7 @@ static int fileAction(const char *fileName, struct stat *statbuf, void* junk) int chmod_main(int argc, char **argv) { + int i; int opt; int recursiveFlag = FALSE; @@ -59,7 +58,8 @@ int chmod_main(int argc, char **argv) if (argc > optind && argc > 2 && argv[optind]) { /* Parse the specified mode */ - if (parse_mode(argv[optind], &(theMode.st_mode)) == FALSE) { + mode_t mode; + if (parse_mode(argv[optind], &mode) == FALSE) { error_msg_and_die( "unknown mode: %s", argv[optind]); } } else { @@ -67,9 +67,9 @@ int chmod_main(int argc, char **argv) } /* Ok, ready to do the deed now */ - while (++optind < argc) { - if (recursive_action (argv[optind], recursiveFlag, FALSE, FALSE, - fileAction, fileAction, NULL) == FALSE) { + for (i = optind + 1; i < argc; i++) { + if (recursive_action (argv[i], recursiveFlag, FALSE, FALSE, fileAction, + fileAction, argv[optind]) == FALSE) { return EXIT_FAILURE; } } |