* Re: Bug#439036: chgrp builtin from zsh/files does not dereference symlinks (non-POSIX)
@ 2007-08-21 22:57 Clint Adams
0 siblings, 0 replies; only message in thread
From: Clint Adams @ 2007-08-21 22:57 UTC (permalink / raw)
To: zsh-workers; +Cc: vincent, 439036-forwarded
On Tue, Aug 21, 2007 at 09:31:11PM +0200, Vincent Lefevre wrote:
> The chgrp builtin (and chown?) does not dereference symlinks, though
> POSIX requires symlinks to be dereferenced by default. Moreover, the
> behavior on symlinks is not documented in the zshmodules(1) man page.
>
> There are still missing features (options) compared to POSIX chgrp,
> but I think that at least the default behavior and supported options
> should be the same as in POSIX.
I think this sabotages -s . POSIX's -H, -L, -P options are still
missing.
Index: Doc/Zsh/mod_files.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/mod_files.yo,v
retrieving revision 1.2
diff -u -r1.2 mod_files.yo
--- Doc/Zsh/mod_files.yo 3 Jul 2007 17:06:04 -0000 1.2
+++ Doc/Zsh/mod_files.yo 21 Aug 2007 22:47:47 -0000
@@ -6,12 +6,12 @@
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 @@
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.
Index: Src/Modules/files.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Modules/files.c,v
retrieving revision 1.17
diff -u -r1.17 files.c
--- Src/Modules/files.c 6 Jul 2007 21:52:40 -0000 1.17
+++ Src/Modules/files.c 21 Aug 2007 22:47:48 -0000
@@ -593,6 +593,19 @@
{
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 @@
return 0;
}
+
/**/
static unsigned long getnumeric(char *p, int *errp)
{
@@ -684,7 +698,8 @@
}
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 @@
#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),
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-08-21 22:57 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-08-21 22:57 Bug#439036: chgrp builtin from zsh/files does not dereference symlinks (non-POSIX) Clint Adams
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).