]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
When chown or chgrp is modifying the referent of a symlink,
authorJim Meyering <jim@meyering.net>
Sat, 1 May 2004 14:33:41 +0000 (14:33 +0000)
committerJim Meyering <jim@meyering.net>
Sat, 1 May 2004 14:33:41 +0000 (14:33 +0000)
use the chown(2) function, if possible.

(change_file_owner): Don't hard-code the
open/fchown/close kludge here.  Use `chown' instead.
The chown function works just fine on conforming systems.
Other systems now go through the new chown wrapper that
resorts to the old kludge.

src/chown-core.c

index 821adfe76fabe57480a2d51c3d465eaaf9f8859b..82fb4de0fddabd302b55c98a161db29c433ba3dd 100644 (file)
@@ -224,22 +224,9 @@ change_file_owner (FTS *fts, FTSENT *ent,
              if (chopt->affect_symlink_referent)
                {
                  /* Applying chown to a symlink and expecting it to affect
-                    the referent is not portable.  So instead, open the
-                    file and use fchown on the resulting descriptor.  */
-                 /* FIXME: but on some systems (e.g. Linux-2.1.81 and newer),
-                    using chown is much better, since it *does* follow
-                    symlinks, and the open/fchown approach fails when
-                    the file is not readable.  This looks like a fine case
-                    for another chown wrapper.  In any case, this code can
-                    clobber errno, so fix it or remove it.
-                    Related: with a proper autoconf test -- is this possible,
-                    without root permissions or a guarantee of more than
-                    one group? -- the lchown wrapper may just end up
-                    calling chown on some systems.  */
-                 int fd = open (file, O_RDONLY | O_NONBLOCK | O_NOCTTY);
-                 fail = (fd == -1 ? 1 : fchown (fd, new_uid, new_gid));
-                 if (fd != -1)
-                   close (fd);
+                    the referent is not portable, but here we may be using a
+                    wrapper that tries to correct for unconforming chown.  */
+                 fail = chown (file, new_uid, new_gid);
                }
              else
                {