commit 9da1deaab920e2b2635079729aa816822f324eab
parent 1d05b293e1b7a460d7804d20e0cf1026bdf70bce
Author: sin <sin@2f30.org>
Date: Mon, 16 Feb 2015 16:47:07 +0000
chmod: Add -HLP flags and update manpage
Diffstat:
2 files changed, 27 insertions(+), 10 deletions(-)
diff --git a/chmod.1 b/chmod.1
@@ -6,9 +6,12 @@
.Nd change file mode
.Sh SYNOPSIS
.Nm
-.Op Fl R
+.Oo
+.Fl R
+.Op Fl H | L | P
+.Oc
.Ar mode
-.Op Ar file ...
+.Ar file ...
.Sh DESCRIPTION
.Nm
changes the file mode of the given
@@ -54,9 +57,17 @@ read | write | execute | setuid and setgid | sticky
.Sh OPTIONS
.Bl -tag -width Ds
.It Fl R
-Change modes recursively
+Change modes recursively.
+.It Fl H
+Only dereference symbolic links that are passed as command line arguments when
+recursively traversing directories.
+.It Fl L
+Always dereference symbolic links while recursively traversing directories.
+.It Fl P
+Don't dereference symbolic links (default).
.El
.Sh SEE ALSO
+.Xr chgrp 1 ,
.Xr umask 1
.Sh STANDARDS
The
@@ -66,5 +77,5 @@ utility is compliant with the
specification.
.Pp
The
-.Op Fl R
-flag is an extension to that specification.
+.Op Fl HLP
+flags are an extension to that specification.
diff --git a/chmod.c b/chmod.c
@@ -3,7 +3,8 @@
#include "util.h"
-static int rflag = 0;
+static int Rflag = 0;
+static int fflag = 'P';
static char *modestr = "";
static mode_t mask = 0;
static int ret = 0;
@@ -25,14 +26,14 @@ chmodr(const char *path, int fflag)
weprintf("chmod %s:", path);
ret = 1;
}
- if (rflag)
+ if (Rflag)
recurse(path, chmodr, fflag);
}
static void
usage(void)
{
- eprintf("usage: %s [-R] mode [file ...]\n", argv0);
+ eprintf("usage: %s [-R [-H | -L | -P]] mode file ...\n", argv0);
}
int
@@ -44,7 +45,12 @@ main(int argc, char *argv[])
for (i = 1; i < argc && argv[i][0] == '-'; i++) {
switch (argv[i][1]) {
case 'R':
- rflag = 1;
+ Rflag = 1;
+ break;
+ case 'H':
+ case 'L':
+ case 'P':
+ fflag = argv[i][1];
break;
case 'r': case 'w': case 'x': case 's': case 't':
/*
@@ -65,7 +71,7 @@ done:
usage();
for (++i; i < argc; i++)
- chmodr(argv[i], 'P');
+ chmodr(argv[i], fflag);
return ret;
}