[prev in list] [next in list] [prev in thread] [next in thread] 

List:       coreutils
Subject:    Re: [patch] chmod -[cv]: be verbose about the old mode
From:       Pádraig_Brady <P () draigBrady ! com>
Date:       2011-05-26 10:21:07
Message-ID: 4DDE2993.8060809 () draigBrady ! com
[Download RAW message or body]

On 25/05/11 15:56, Pádraig Brady wrote:
> On 25/05/11 09:15, Bernhard Voelker wrote:
>> Hi GNU,
>>
>> what about having `chmod -[cv]` also print the old mode?

> I like it.
> I'll apply that later.

Done with http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h=e89c998a
For consistency I'll also do this for chown and chgrp
as it's fairly easy, and useful too.

But first I'm applying the attached fix.

cheers,
Pádraig.

["chown-chgrp-v-fix.diff" (text/x-patch)]

>From f32f88edee862f858efff6cff70d287a5d42308d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pádraig Brady?= <P@draigBrady.com>
Date: Thu, 26 May 2011 11:15:11 +0100
Subject: [PATCH] chown,chgrp: output the correct ownership in -v messages

* src/chown_core (describe_change): Accept the ownership of
the original file and output that when not changing.
This is significant when --from is specified as then
the original and specified ownership may be different.
(user_group_str): A new helper function refactored from
describe_change().
(change_owner_file): Pass the original user and group
strings to describe_change().
* test/chown/basic: Add a test case.
* NEWS: Mention the fix.
---
 NEWS              |    4 +++
 src/chown-core.c  |   59 ++++++++++++++++++++++++++++++++++------------------
 tests/chown/basic |    5 ++++
 3 files changed, 47 insertions(+), 21 deletions(-)

diff --git a/NEWS b/NEWS
index 88593ab..fc8ee0e 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,10 @@ GNU coreutils NEWS                                    -*- outline -*-
   printf '%d' '"' no longer accesses out-of-bounds memory in the diagnostic.
   [bug introduced in sh-utils-1.16]

+  chown and chgrp with the -v --from= options, now output the correct owner.
+  I.E. for skipped files, the original ownership is output, not the new one.
+  [bug introduced in sh-utils-2.0g]
+
 ** New features

   split accepts a new --filter=CMD option.  With it, split filters output
diff --git a/src/chown-core.c b/src/chown-core.c
index 82f7341..d8c0728 100644
--- a/src/chown-core.c
+++ b/src/chown-core.c
@@ -102,17 +102,44 @@ uid_to_name (uid_t uid)
                   : umaxtostr (uid, buf));
 }

+/* Allocate a string representing USER and GROUP.  */
+
+static char *
+user_group_str (char const *user, char const *group)
+{
+  char *spec;
+
+  if (user)
+    {
+      if (group)
+        {
+          spec = xmalloc (strlen (user) + 1 + strlen (group) + 1);
+          stpcpy (stpcpy (stpcpy (spec, user), ":"), group);
+        }
+      else
+        {
+          spec = xstrdup (user);
+        }
+    }
+  else
+    {
+      spec = xstrdup (group);
+    }
+
+  return spec;
+}
+
 /* Tell the user how/if the user and group of FILE have been changed.
    If USER is NULL, give the group-oriented messages.
    CHANGED describes what (if anything) has happened. */

 static void
 describe_change (const char *file, enum Change_status changed,
+                 char const *old_user, char const *old_group,
                  char const *user, char const *group)
 {
   const char *fmt;
-  char const *spec;
-  char *spec_allocated = NULL;
+  char *spec;

   if (changed == CH_NOT_APPLIED)
     {
@@ -121,40 +148,25 @@ describe_change (const char *file, enum Change_status changed,
       return;
     }

-  if (user)
-    {
-      if (group)
-        {
-          spec_allocated = xmalloc (strlen (user) + 1 + strlen (group) + 1);
-          stpcpy (stpcpy (stpcpy (spec_allocated, user), ":"), group);
-          spec = spec_allocated;
-        }
-      else
-        {
-          spec = user;
-        }
-    }
-  else
-    {
-      spec = group;
-    }
-
   switch (changed)
     {
     case CH_SUCCEEDED:
       fmt = (user ? _("changed ownership of %s to %s\n")
              : group ? _("changed group of %s to %s\n")
              : _("no change to ownership of %s\n"));
+      spec = user_group_str (user, group);
       break;
     case CH_FAILED:
       fmt = (user ? _("failed to change ownership of %s to %s\n")
              : group ? _("failed to change group of %s to %s\n")
              : _("failed to change ownership of %s\n"));
+      spec = user_group_str (user, group);
       break;
     case CH_NO_CHANGE_REQUESTED:
       fmt = (user ? _("ownership of %s retained as %s\n")
              : group ? _("group of %s retained as %s\n")
              : _("ownership of %s retained\n"));
+      spec = user_group_str (user ? old_user : NULL, group ? old_group : NULL);
       break;
     default:
       abort ();
@@ -162,7 +174,7 @@ describe_change (const char *file, enum Change_status changed,

   printf (fmt, quote (file), spec);

-  free (spec_allocated);
+  free (spec);
 }

 /* Change the owner and/or group of the FILE to UID and/or GID (safely)
@@ -459,8 +471,13 @@ change_file_owner (FTS *fts, FTSENT *ent,
              : !symlink_changed ? CH_NOT_APPLIED
              : !changed ? CH_NO_CHANGE_REQUESTED
              : CH_SUCCEEDED);
+          char *old_user = uid_to_name (file_stats->st_uid);
+          char *old_group = gid_to_name (file_stats->st_gid);
           describe_change (file_full_name, ch_status,
+                           old_user, old_group,
                            chopt->user_name, chopt->group_name);
+          free (old_user);
+          free (old_group);
         }
     }

diff --git a/tests/chown/basic b/tests/chown/basic
index 0614f70..0b01ced 100755
--- a/tests/chown/basic
+++ b/tests/chown/basic
@@ -27,6 +27,11 @@ chown -R --preserve-root 0:1 f
 # Make sure the owner and group are 0 and 1 respectively.
 set _ `ls -n f`; shift; test "$3:$4" = 0:1 || fail=1

+# Make sure correct diagnostic is output
+chown -v --fromB 43 f > out || fail=1
+printf "ownership of \`f' retained as `id -nu`\n" > exp
+compare out exp || fail=1
+
 chown --from=0:1 2:010 f || fail=1

 # And now they should be 2 and 10 respectively.
--
1.7.5.1



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic