simplify mode parsing in chmod(1)

Anton Berezin <[email protected]> Wed, 22 Oct 2003 13:46:56 +0200
Newsgroups gmane.os.freebsd.devel.audit
Message-ID <[email protected]>
Hi,

Any objections to this patch (yes, setmode(3) handles octal modes)?

Index: chmod.c
===================================================================
RCS file: /home/ncvs/src/bin/chmod/chmod.c,v
retrieving revision 1.29
diff -u -r1.29 chmod.c
--- chmod.c	1 May 2003 16:58:54 -0000	1.29
+++ chmod.c	22 Oct 2003 11:14:49 -0000
@@ -65,16 +65,13 @@
 	FTS *ftsp;
 	FTSENT *p;
 	mode_t *set;
-	long val;
-	int oct;
 	int Hflag, Lflag, Rflag, ch, fflag, fts_options, hflag, rval;
 	int vflag;
-	char *ep, *mode;
-	mode_t newmode, omode;
+	char *mode;
+	mode_t newmode;
 	int (*change_mode)(const char *, mode_t);
 
 	set = NULL;
-	omode = 0;
 	Hflag = Lflag = Rflag = fflag = hflag = vflag = 0;
 	while ((ch = getopt(argc, argv, "HLPRXfghorstuvwx")) != -1)
 		switch (ch) {
@@ -152,22 +149,8 @@
 		change_mode = chmod;
 
 	mode = *argv;
-	if (*mode >= '0' && *mode <= '7') {
-		errno = 0;
-		val = strtol(mode, &ep, 8);
-		if (val > USHRT_MAX || val < 0)
-			errno = ERANGE;
-		if (errno)
-			err(1, "invalid file mode: %s", mode);
-		if (*ep)
-			errx(1, "invalid file mode: %s", mode);
-		omode = (mode_t)val;
-		oct = 1;
-	} else {
-		if ((set = setmode(mode)) == NULL)
-			errx(1, "invalid file mode: %s", mode);
-		oct = 0;
-	}
+	if ((set = setmode(mode)) == NULL)
+		errx(1, "invalid file mode: %s", mode);
 
 	if ((ftsp = fts_open(++argv, fts_options, 0)) == NULL)
 		err(1, "fts_open");
@@ -200,7 +183,7 @@
 		default:
 			break;
 		}
-		newmode = oct ? omode : getmode(set, p->fts_statp->st_mode);
+		newmode = getmode(set, p->fts_statp->st_mode);
 		if ((newmode & ALLPERMS) == (p->fts_statp->st_mode & ALLPERMS))
 			continue;
 		if ((*change_mode)(p->fts_accpath, newmode) && !fflag) {

Cheers,
\Anton.
-- 
If I did know the future of Perl, and if I told you, you'd probably run
away screaming.  -- Larry Wall
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-audit
To unsubscribe, send any mail to "[email protected]"