simplify mode parsing in chmod(1)

Anton Berezin tobez at tobez.org
Wed Oct 22 04:47:00 PDT 2003


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


More information about the freebsd-audit mailing list