From 4eb8e70031e17d1d06f9670b2b06aaea08321e61 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Fri, 1 Jul 1994 16:53:29 +0000 Subject: [PATCH] . --- src/chgrp.c | 18 ++++++++++++++++-- src/cp.c | 10 ++++++---- src/mv.c | 2 +- src/rm.c | 2 +- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/chgrp.c b/src/chgrp.c index 74438ef93f..cac9383d58 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 b190c6416c..3fb200bd16 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 3525c53aae..e56a6eb231 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 722994735d..1365e66563 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 -- 2.47.3