This patch from Lars Kellogg-Stedman, fixes the behavior of
authorEric Andersen <andersen@codepoet.org>
Fri, 11 May 2001 15:55:41 +0000 (15:55 -0000)
committerEric Andersen <andersen@codepoet.org>
Fri, 11 May 2001 15:55:41 +0000 (15:55 -0000)
chown to be consistant with GNU chown, so that it follows
symlinks (who cares about the perms on a link anyways?) unless
the -h option is supplied.
 -Erik

chown.c
coreutils/chown.c

diff --git a/chown.c b/chown.c
index 0114033789078b7779ad4e299c5b1aaf061d582f..a656072041b9b2bc58dfee138fb6ca69debaad64 100644 (file)
--- a/chown.c
+++ b/chown.c
 static long uid;
 static long gid;
 
+static int (*chown_func)() = chown;
+
 static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
 {
-       if (lchown(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
+       if (chown_func(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
                return (TRUE);
        }
        perror(fileName);
@@ -48,21 +50,27 @@ static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
 int chown_main(int argc, char **argv)
 {
        int opt;
-       int recursiveFlag = FALSE;
+       int recursiveFlag = FALSE,
+               noderefFlag = FALSE;
        char *groupName=NULL;
        char *p=NULL;
 
        /* do normal option parsing */
-       while ((opt = getopt(argc, argv, "R")) > 0) {
+       while ((opt = getopt(argc, argv, "Rh")) > 0) {
                switch (opt) {
                        case 'R':
                                recursiveFlag = TRUE;
                                break;
+                       case 'h':
+                               noderefFlag = TRUE;
+                               break;
                        default:
                                show_usage();
                }
        }
 
+       if (noderefFlag) chown_func = lchown;
+
        if (argc > optind && argc > 2 && argv[optind]) {
                /* First, check if there is a group name here */
                groupName = strchr(argv[optind], '.');
index 0114033789078b7779ad4e299c5b1aaf061d582f..a656072041b9b2bc58dfee138fb6ca69debaad64 100644 (file)
 static long uid;
 static long gid;
 
+static int (*chown_func)() = chown;
+
 static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
 {
-       if (lchown(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
+       if (chown_func(fileName, uid, (gid == -1) ? statbuf->st_gid : gid) == 0) {
                return (TRUE);
        }
        perror(fileName);
@@ -48,21 +50,27 @@ static int fileAction(const char *fileName, struct stat *statbuf, void* junk)
 int chown_main(int argc, char **argv)
 {
        int opt;
-       int recursiveFlag = FALSE;
+       int recursiveFlag = FALSE,
+               noderefFlag = FALSE;
        char *groupName=NULL;
        char *p=NULL;
 
        /* do normal option parsing */
-       while ((opt = getopt(argc, argv, "R")) > 0) {
+       while ((opt = getopt(argc, argv, "Rh")) > 0) {
                switch (opt) {
                        case 'R':
                                recursiveFlag = TRUE;
                                break;
+                       case 'h':
+                               noderefFlag = TRUE;
+                               break;
                        default:
                                show_usage();
                }
        }
 
+       if (noderefFlag) chown_func = lchown;
+
        if (argc > optind && argc > 2 && argv[optind]) {
                /* First, check if there is a group name here */
                groupName = strchr(argv[optind], '.');