Date: Mon, 15 Apr 2002 20:20:02 -0700 (PDT) From: Joshua Goodall <joshua@roughtrade.net> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/36473: Overdue MFC's in chmod/chown/chflags Message-ID: <200204160320.g3G3K2L41987@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/36473; it has been noted by GNATS.
From: Joshua Goodall <joshua@roughtrade.net>
To: freebsd-gnats-submit@FreeBSD.org
Cc:
Subject: Re: bin/36473: Overdue MFC's in chmod/chown/chflags
Date: Tue, 16 Apr 2002 13:15:35 +1000
On Fri, Mar 29, 2002 at 01:25:28AM -0800, Joshua Goodall wrote:
> The following are now very overdue MFC's:
[snip]
This is a (tested) diff against -stable:
Index: src/bin/chmod/chmod.c
===================================================================
RCS file: /cvs/src/bin/chmod/chmod.c,v
retrieving revision 1.16.2.3
diff -u -r1.16.2.3 chmod.c
--- src/bin/chmod/chmod.c 1 Aug 2001 01:21:09 -0000 1.16.2.3
+++ src/bin/chmod/chmod.c 15 Apr 2002 15:13:10 -0000
@@ -74,11 +74,12 @@
int vflag;
char *ep, *mode;
int newmode;
+ int (*change_mode) __P((const char *, mode_t));
set = NULL;
omode = 0;
Hflag = Lflag = Pflag = Rflag = fflag = hflag = vflag = 0;
- while ((ch = getopt(argc, argv, "HLPRXfgorstuvwx")) != -1)
+ while ((ch = getopt(argc, argv, "HLPRXfghorstuvwx")) != -1)
switch (ch) {
case 'H':
Hflag = 1;
@@ -102,9 +103,10 @@
/*
* In System V (and probably POSIX.2) the -h option
* causes chmod to change the mode of the symbolic
- * link. 4.4BSD's symbolic links don't have modes,
- * so it's an undocumented noop. Do syntax checking,
- * though.
+ * link. 4.4BSD's symbolic links didn't have modes,
+ * so it was an undocumented noop. In FreeBSD 3.0,
+ * lchmod(2) is introduced and this option does real
+ * work.
*/
hflag = 1;
break;
@@ -134,8 +136,8 @@
if (argc < 2)
usage();
- fts_options = FTS_PHYSICAL;
if (Rflag) {
+ fts_options = FTS_PHYSICAL;
if (hflag)
errx(1,
"the -R and -h options may not be specified together.");
@@ -145,7 +147,13 @@
fts_options &= ~FTS_PHYSICAL;
fts_options |= FTS_LOGICAL;
}
- }
+ } else
+ fts_options = hflag ? FTS_PHYSICAL : FTS_LOGICAL;
+
+ if (hflag)
+ change_mode = lchmod;
+ else
+ change_mode = chmod;
mode = *argv;
if (*mode >= '0' && *mode <= '7') {
@@ -189,14 +197,17 @@
* don't point to anything and ones that we found
* doing a physical walk.
*/
- continue;
+ if (!hflag)
+ continue;
+ /* else */
+ /* FALLTHROUGH */
default:
break;
}
newmode = oct ? omode : getmode(set, p->fts_statp->st_mode);
if ((newmode & ALLPERMS) == (p->fts_statp->st_mode & ALLPERMS))
continue;
- if (chmod(p->fts_accpath, newmode) && !fflag) {
+ if ((*change_mode)(p->fts_accpath, newmode) && !fflag) {
warn("%s", p->fts_path);
rval = 1;
} else {
@@ -214,6 +225,6 @@
usage()
{
(void)fprintf(stderr,
- "usage: chmod [-fv] [-R [-H | -L | -P]] mode file ...\n");
+ "usage: chmod [-fhv] [-R [-H | -L | -P]] mode file ...\n");
exit(1);
}
Index: src/usr.bin/chflags/chflags.c
===================================================================
RCS file: /cvs/src/usr.bin/chflags/chflags.c,v
retrieving revision 1.7.2.3
diff -u -r1.7.2.3 chflags.c
--- src/usr.bin/chflags/chflags.c 1 Aug 2001 23:09:18 -0000 1.7.2.3
+++ src/usr.bin/chflags/chflags.c 15 Apr 2002 15:03:40 -0000
@@ -99,15 +99,16 @@
if (argc < 2)
usage();
- fts_options = FTS_PHYSICAL;
if (Rflag) {
+ fts_options = FTS_PHYSICAL;
if (Hflag)
fts_options |= FTS_COMFOLLOW;
if (Lflag) {
fts_options &= ~FTS_PHYSICAL;
fts_options |= FTS_LOGICAL;
}
- }
+ } else
+ fts_options = FTS_LOGICAL;
flags = *argv;
if (*flags >= '0' && *flags <= '7') {
Index: src/usr.sbin/chown/chown.c
===================================================================
RCS file: /cvs/src/usr.sbin/chown/chown.c,v
retrieving revision 1.15.2.1
diff -u -r1.15.2.1 chown.c
--- src/usr.sbin/chown/chown.c 7 Aug 2000 02:03:09 -0000 1.15.2.1
+++ src/usr.sbin/chown/chown.c 15 Apr 2002 15:07:45 -0000
@@ -122,8 +122,8 @@
if (argc < 2)
usage();
- fts_options = FTS_PHYSICAL;
if (Rflag) {
+ fts_options = FTS_PHYSICAL;
if (hflag && (Lflag || Hflag))
errx(1, "the -R and -h options may not be specified together");
if (Hflag)
@@ -132,7 +132,8 @@
fts_options &= ~FTS_PHYSICAL;
fts_options |= FTS_LOGICAL;
}
- }
+ } else
+ fts_options = hflag ? FTS_PHYSICAL : FTS_LOGICAL;
uid = gid = -1;
if (ischown) {
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200204160320.g3G3K2L41987>
