summaryrefslogtreecommitdiffstats
path: root/bin/chflags/chflags.c
diff options
context:
space:
mode:
Diffstat (limited to 'bin/chflags/chflags.c')
-rw-r--r--bin/chflags/chflags.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/bin/chflags/chflags.c b/bin/chflags/chflags.c
index 18c3cf6..273ba4c 100644
--- a/bin/chflags/chflags.c
+++ b/bin/chflags/chflags.c
@@ -62,11 +62,12 @@ main(int argc, char *argv[])
FTSENT *p;
u_long clear, set;
long val;
- int Hflag, Lflag, Rflag, ch, fts_options, oct, rval;
+ int Hflag, Lflag, Rflag, hflag, ch, fts_options, oct, rval;
char *flags, *ep;
+ int (*change_flags)(const char *, unsigned long);
- Hflag = Lflag = Rflag = 0;
- while ((ch = getopt(argc, argv, "HLPR")) != -1)
+ Hflag = Lflag = Rflag = hflag = 0;
+ while ((ch = getopt(argc, argv, "HLPRh")) != -1)
switch (ch) {
case 'H':
Hflag = 1;
@@ -82,6 +83,9 @@ main(int argc, char *argv[])
case 'R':
Rflag = 1;
break;
+ case 'h':
+ hflag = 1;
+ break;
case '?':
default:
usage();
@@ -94,6 +98,9 @@ main(int argc, char *argv[])
if (Rflag) {
fts_options = FTS_PHYSICAL;
+ if (hflag)
+ errx(1, "the -R and -h options "
+ "may not be specified together");
if (Hflag)
fts_options |= FTS_COMFOLLOW;
if (Lflag) {
@@ -103,6 +110,12 @@ main(int argc, char *argv[])
} else
fts_options = FTS_LOGICAL;
+ /* XXX: Why don't chflags and lchflags have compatible prototypes? */
+ if (hflag)
+ change_flags = (int (*)(const char *, unsigned long))lchflags;
+ else
+ change_flags = chflags;
+
flags = *argv;
if (*flags >= '0' && *flags <= '7') {
errno = 0;
@@ -147,17 +160,20 @@ main(int argc, char *argv[])
* don't point to anything and ones that we found
* doing a physical walk.
*/
- continue;
+ if (!hflag)
+ continue;
+ /* FALLTHROUGH */
default:
break;
}
if (oct) {
- if (!chflags(p->fts_accpath, set))
+ if (!(*change_flags)(p->fts_accpath, set))
continue;
} else {
p->fts_statp->st_flags |= set;
p->fts_statp->st_flags &= clear;
- if (!chflags(p->fts_accpath, (u_long)p->fts_statp->st_flags))
+ if (!(*change_flags)(p->fts_accpath,
+ (u_long)p->fts_statp->st_flags))
continue;
}
warn("%s", p->fts_path);
@@ -172,6 +188,6 @@ void
usage(void)
{
(void)fprintf(stderr,
- "usage: chflags [-R [-H | -L | -P]] flags file ...\n");
+ "usage: chflags [-h] [-R [-H | -L | -P]] flags file ...\n");
exit(1);
}
OpenPOWER on IntegriCloud