From 4ad8baffe9a9644bf6073f56c90b8d3441dd3a1f Mon Sep 17 00:00:00 2001 From: Paul Ackersviller Date: Sun, 25 Nov 2007 00:47:32 +0000 Subject: Merge of 23788: add -h option to chown symlinks rather than targets, and change default behavior to do the opposite. --- Doc/Zsh/mod_files.yo | 7 +++++-- Src/Modules/files.c | 21 ++++++++++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Doc/Zsh/mod_files.yo b/Doc/Zsh/mod_files.yo index db45923c7..2bc83b5db 100644 --- a/Doc/Zsh/mod_files.yo +++ b/Doc/Zsh/mod_files.yo @@ -6,12 +6,12 @@ The tt(zsh/files) module makes some standard commands available as builtins: startitem() findex(chgrp) -item(tt(chgrp) [ tt(-Rs) ] var(group) var(filename) ...)( +item(tt(chgrp) [ tt(-hRs) ] var(group) var(filename) ...)( Changes group of files specified. This is equivalent to tt(chown) with a var(user-spec) argument of `tt(:)var(group)'. ) findex(chown) -item(tt(chown) [ tt(-Rs) ] var(user-spec) var(filename) ...)( +item(tt(chown) [ tt(-hRs) ] var(user-spec) var(filename) ...)( Changes ownership and group of files specified. The var(user-spec) can be in four forms: @@ -33,6 +33,9 @@ Each of var(user) and var(group) may be either a username (or group name, as appropriate) or a decimal user ID (group ID). Interpretation as a name takes precedence, if there is an all-numeric username (or group name). +If the target is a symbolic link, the tt(-h) option causes tt(chown) to set +the ownership of the link instead of its target. + The tt(-R) option causes tt(chown) to recursively descend into directories, changing the ownership of all files in the directory after changing the ownership of the directory itself. diff --git a/Src/Modules/files.c b/Src/Modules/files.c index bb1cc0065..09e54dc47 100644 --- a/Src/Modules/files.c +++ b/Src/Modules/files.c @@ -593,6 +593,19 @@ chown_dochown(char *arg, char *rp, UNUSED(struct stat const *sp), void *magic) { struct chownmagic *chm = magic; + if(chown(rp, chm->uid, chm->gid)) { + zwarnnam(chm->nam, "%s: %e", arg, errno); + return 1; + } + return 0; +} + +/**/ +static int +chown_dolchown(char *arg, char *rp, UNUSED(struct stat const *sp), void *magic) +{ + struct chownmagic *chm = magic; + if(lchown(rp, chm->uid, chm->gid)) { zwarnnam(chm->nam, "%s: %e", arg, errno); return 1; @@ -600,6 +613,7 @@ chown_dochown(char *arg, char *rp, UNUSED(struct stat const *sp), void *magic) return 0; } + /**/ static unsigned long getnumeric(char *p, int *errp) { @@ -684,7 +698,8 @@ bin_chown(char *nam, char **args, Options ops, int func) } free(uspec); return recursivecmd(nam, 0, OPT_ISSET(ops,'R'), OPT_ISSET(ops,'s'), - args + 1, chown_dochown, recurse_donothing, chown_dochown, &chm); + args + 1, OPT_ISSET(ops, 'h') ? chown_dolchown : chown_dochown, recurse_donothing, + OPT_ISSET(ops, 'h') ? chown_dolchown : chown_dochown, &chm); } /* module paraphernalia */ @@ -696,8 +711,8 @@ bin_chown(char *nam, char **args, Options ops, int func) #endif static struct builtin bintab[] = { - BUILTIN("chgrp", 0, bin_chown, 2, -1, BIN_CHGRP, "Rs", NULL), - BUILTIN("chown", 0, bin_chown, 2, -1, BIN_CHOWN, "Rs", NULL), + BUILTIN("chgrp", 0, bin_chown, 2, -1, BIN_CHGRP, "hRs", NULL), + BUILTIN("chown", 0, bin_chown, 2, -1, BIN_CHOWN, "hRs", NULL), BUILTIN("ln", 0, bin_ln, 1, -1, BIN_LN, LN_OPTS, NULL), BUILTIN("mkdir", 0, bin_mkdir, 1, -1, 0, "pm:", NULL), BUILTIN("mv", 0, bin_ln, 2, -1, BIN_MV, "fi", NULL), -- cgit 1.4.1