chmod: Add -HLP flags and update manpage

This commit is contained in:
sin 2015-02-16 16:47:07 +00:00
parent 1d05b293e1
commit 9da1deaab9
2 changed files with 27 additions and 10 deletions

21
chmod.1
View File

@ -6,9 +6,12 @@
.Nd change file mode .Nd change file mode
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl R .Oo
.Fl R
.Op Fl H | L | P
.Oc
.Ar mode .Ar mode
.Op Ar file ... .Ar file ...
.Sh DESCRIPTION .Sh DESCRIPTION
.Nm .Nm
changes the file mode of the given changes the file mode of the given
@ -54,9 +57,17 @@ read | write | execute | setuid and setgid | sticky
.Sh OPTIONS .Sh OPTIONS
.Bl -tag -width Ds .Bl -tag -width Ds
.It Fl R .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 .El
.Sh SEE ALSO .Sh SEE ALSO
.Xr chgrp 1 ,
.Xr umask 1 .Xr umask 1
.Sh STANDARDS .Sh STANDARDS
The The
@ -66,5 +77,5 @@ utility is compliant with the
specification. specification.
.Pp .Pp
The The
.Op Fl R .Op Fl HLP
flag is an extension to that specification. flags are an extension to that specification.

16
chmod.c
View File

@ -3,7 +3,8 @@
#include "util.h" #include "util.h"
static int rflag = 0; static int Rflag = 0;
static int fflag = 'P';
static char *modestr = ""; static char *modestr = "";
static mode_t mask = 0; static mode_t mask = 0;
static int ret = 0; static int ret = 0;
@ -25,14 +26,14 @@ chmodr(const char *path, int fflag)
weprintf("chmod %s:", path); weprintf("chmod %s:", path);
ret = 1; ret = 1;
} }
if (rflag) if (Rflag)
recurse(path, chmodr, fflag); recurse(path, chmodr, fflag);
} }
static void static void
usage(void) usage(void)
{ {
eprintf("usage: %s [-R] mode [file ...]\n", argv0); eprintf("usage: %s [-R [-H | -L | -P]] mode file ...\n", argv0);
} }
int int
@ -44,7 +45,12 @@ main(int argc, char *argv[])
for (i = 1; i < argc && argv[i][0] == '-'; i++) { for (i = 1; i < argc && argv[i][0] == '-'; i++) {
switch (argv[i][1]) { switch (argv[i][1]) {
case 'R': case 'R':
rflag = 1; Rflag = 1;
break;
case 'H':
case 'L':
case 'P':
fflag = argv[i][1];
break; break;
case 'r': case 'w': case 'x': case 's': case 't': case 'r': case 'w': case 'x': case 's': case 't':
/* /*
@ -65,7 +71,7 @@ done:
usage(); usage();
for (++i; i < argc; i++) for (++i; i < argc; i++)
chmodr(argv[i], 'P'); chmodr(argv[i], fflag);
return ret; return ret;
} }