summaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
authorMatt Kraai2001-04-26 18:55:29 +0000
committerMatt Kraai2001-04-26 18:55:29 +0000
commit6aabfd5e30087bb0ffdb6404aa6d650014de2dc0 (patch)
tree12ef0086ec67d48f835567c56e94ef9f749e5e7a /coreutils
parentca85cdbe4c414f5892b57a3c0fb2439f3061496c (diff)
downloadbusybox-6aabfd5e30087bb0ffdb6404aa6d650014de2dc0.zip
busybox-6aabfd5e30087bb0ffdb6404aa6d650014de2dc0.tar.gz
Fix handling of permission addition and removal (e.g., o-r).
Diffstat (limited to 'coreutils')
-rw-r--r--coreutils/chmod.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/coreutils/chmod.c b/coreutils/chmod.c
index 742770e..9139b3f 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;
}
}