cp: add ENABLE_FEATURE_VERBOSE_CP_MESSAGE. Closes bug 1470
authorDenis Vlasenko <vda.linux@googlemail.com>
Wed, 13 Feb 2008 16:52:00 +0000 (16:52 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Wed, 13 Feb 2008 16:52:00 +0000 (16:52 -0000)
coreutils/libcoreutils/cp_mv_stat.c
libbb/Config.in
libbb/copy_file.c

index 43583d48b094b36f7ab26413bb6305853c65a780..ff7c27399e102157cca41592aed08de74f2666ea 100644 (file)
@@ -27,6 +27,12 @@ int cp_mv_stat2(const char *fn, struct stat *fn_stat, stat_func sf)
 {
        if (sf(fn, fn_stat) < 0) {
                if (errno != ENOENT) {
+#if ENABLE_FEATURE_VERBOSE_CP_MESSAGE
+                       if (errno == ENOTDIR) {
+                               bb_error_msg("cannot stat '%s': Path has non-directory component", fn);
+                               return -1;
+                       }
+#endif
                        bb_perror_msg("cannot stat '%s'", fn);
                        return -1;
                }
index 0ad4381d9098a1ca6c3404d682176e7b3e7e84f5..9389fe808b213aa189bd0f08ca89c972abf40325 100644 (file)
@@ -102,6 +102,21 @@ config FEATURE_EDITING_FANCY_PROMPT
          Setting this option allows for prompts to use things like \w and
          \$ and escape codes.
 
+config FEATURE_VERBOSE_CP_MESSAGE
+       bool "Give more precise messages when copy fails (cp, mv etc)"
+       default n
+       help
+         Error messages with this feature enabled:
+           $ cp file /does_not_exist/file
+           cp: cannot create '/does_not_exist/file': Path does not exist
+           $ cp file /vmlinuz/file
+           cp: cannot stat '/vmlinuz/file': Path has non-directory component
+         If this feature is not enabled, they will be, respectively:
+           cp: cannot remove '/does_not_exist/file': No such file or directory
+           cp: cannot stat '/vmlinuz/file': Not a directory
+         respectively.
+         This will cost you ~60 bytes.
+
 config FEATURE_COPYBUF_KB
        int "Copy buffer size, in kilobytes"
        range 1 1024
index 3da8a353195e6f812ba9b016a11934350f2f7ccd..d37d515627ed541bc5205ba747eb8d0b2410ef56 100644 (file)
@@ -29,6 +29,7 @@
 // for POSIX mode to give reasonable error message
 static int ask_and_unlink(const char *dest, int flags)
 {
+       int e = errno;
 #if DO_POSIX_CP
        if (!(flags & (FILEUTILS_FORCE|FILEUTILS_INTERACTIVE))) {
                // Either it exists, or the *path* doesnt exist
@@ -50,7 +51,16 @@ static int ask_and_unlink(const char *dest, int flags)
                        return 0; // not allowed to overwrite
        }
        if (unlink(dest) < 0) {
-               bb_perror_msg("cannot remove '%s'", dest);
+#if ENABLE_FEATURE_VERBOSE_CP_MESSAGE
+               if (e == errno && e == ENOENT) {
+                       /* e == ENOTDIR is similar: path has non-dir component,
+                        * but in this case we don't even reach copy_file() */
+                       bb_error_msg("cannot create '%s': Path does not exist", dest);
+                       return -1; // error
+               }
+#endif
+               errno = e;
+               bb_perror_msg("cannot create '%s'", dest);
                return -1; // error
        }
        return 1; // ok (to try again)