summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/chgrp.c18
-rw-r--r--src/cp.c10
-rw-r--r--src/mv.c2
-rw-r--r--src/rm.c2
4 files changed, 24 insertions, 8 deletions
diff --git a/src/chgrp.c b/src/chgrp.c
index 74438ef93..cac9383d5 100644
--- a/src/chgrp.c
+++ b/src/chgrp.c
@@ -53,6 +53,7 @@ struct group *getgrnam ();
int lstat ();
+char *group_member ();
char *savedir ();
char *xmalloc ();
char *xrealloc ();
@@ -208,9 +209,22 @@ change_file_group (file, group)
describe_change (file, 1);
if (chown (file, file_stats.st_uid, group))
{
- if (force_silent == 0)
- error (0, errno, "%s", file);
errors = 1;
+ if (force_silent == 0)
+ {
+ /* Give a more specific message. Some systems set errno
+ to EPERM for both `inaccessible file' and `user not a member
+ of the specified group' errors. */
+ if (errno == EPERM && !group_member (group))
+ {
+ error (0, errno, "you are not a member of group `%s'",
+ groupname);
+ }
+ else
+ {
+ error (0, errno, "%s", file);
+ }
+ }
}
}
else if (verbose && changes_only == 0)
diff --git a/src/cp.c b/src/cp.c
index b190c6416..3fb200bd1 100644
--- a/src/cp.c
+++ b/src/cp.c
@@ -78,8 +78,8 @@ char *program_name;
whether dereferencing of symlinks is done. */
static int (*xstat) ();
-/* If nonzero, copy all files except directories and, if not dereferencing
- them, symbolic links, as if they were regular files. */
+/* If nonzero, copy all files except (directories and, if not dereferencing
+ them, symbolic links,) as if they were regular files. */
static int flag_copy_as_regular = 1;
/* If nonzero, dereference symbolic links (copy the files they point to). */
@@ -563,7 +563,7 @@ copy (src_path, dst_path, new_dst, device, ancestors)
{
if (flag_interactive)
{
- if (eaccess_stat (&dst_sb, W_OK) != 0)
+ if (eaccess_stat (&dst_sb, W_OK, dst_path) != 0)
fprintf (stderr,
"%s: overwrite `%s', overriding mode %04o? ",
program_name, dst_path,
@@ -808,7 +808,9 @@ copy (src_path, dst_path, new_dst, device, ancestors)
/* If non-root uses -p, it's ok if we can't preserve ownership.
But root probably wants to know, e.g. if NFS disallows it. */
- if (chown (dst_path, src_sb.st_uid, src_sb.st_gid)
+ if (chown (dst_path,
+ (myeuid == 0 ? src_sb.st_uid : myeuid),
+ src_sb.st_gid)
&& (errno != EPERM || myeuid == 0))
{
error (0, errno, "%s", dst_path);
diff --git a/src/mv.c b/src/mv.c
index 3525c53aa..e56a6eb23 100644
--- a/src/mv.c
+++ b/src/mv.c
@@ -282,7 +282,7 @@ do_move (source, dest)
return 0;
if (!override_mode && (interactive || stdin_tty)
- && eaccess_stat (&dest_stats, W_OK))
+ && eaccess_stat (&dest_stats, W_OK, dest))
{
fprintf (stderr, "%s: replace `%s', overriding mode %04o? ",
program_name, dest,
diff --git a/src/rm.c b/src/rm.c
index 722994735..1365e6656 100644
--- a/src/rm.c
+++ b/src/rm.c
@@ -228,7 +228,7 @@ remove_file (statp)
struct stat *statp;
{
if (!ignore_missing_files && (interactive || stdin_tty)
- && eaccess_stat (statp, W_OK)
+ && eaccess_stat (statp, W_OK, pathname)
#ifdef S_ISLNK
&& !S_ISLNK (statp->st_mode)
#endif