cp: make POSIX-me-harder mode complain with a bit less insane message
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 24 Aug 2007 14:23:57 +0000 (14:23 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 24 Aug 2007 14:23:57 +0000 (14:23 -0000)
libbb/copy_file.c

index b68a257b518d0c518e7f7d566bb2d7384ab4a3e5..8a7db77e68c9acc57e65f053aaa3894c9e4f081d 100644 (file)
 
 #define DO_POSIX_CP 0  /* 1 - POSIX behavior, 0 - safe behavior */
 
-
+// errno must be set to relevant value ("why we cannot create dest?")
+// for POSIX mode to give reasonable error message
 static int ask_and_unlink(const char *dest, int flags)
 {
-       // If !DO_POSIX_CP, act as if -f is always in effect - we don't want
-       // "'file' exists" msg, we want unlink to be done (silently unless -i
-       // is also in effect).
-       // This prevents safe way from asking more questions than POSIX does.
 #if DO_POSIX_CP
        if (!(flags & (FILEUTILS_FORCE|FILEUTILS_INTERACTIVE))) {
-               fprintf(stderr, "'%s' exists\n", dest);
+               // Either it exists, or the *path* doesnt exist
+               bb_perror_msg("cannot create '%s'", dest);
                return -1;
        }
 #endif
+       // If !DO_POSIX_CP, act as if -f is always in effect - we don't want
+       // "cannot create" msg, we want unlink to be done (silently unless -i).
 
        // TODO: maybe we should do it only if ctty is present?
        if (flags & FILEUTILS_INTERACTIVE) {
                // We would not do POSIX insanity. -i asks,
                // then _unlinks_ the offender. Presto.
-               // (No opening without O_EXCL, no unlinks only if -f)
+               // (No "opening without O_EXCL", no "unlink only if -f")
                // Or else we will end up having 3 open()s!
                fprintf(stderr, "%s: overwrite '%s'? ", applet_name, dest);
                if (!bb_ask_confirmation())
@@ -280,6 +280,7 @@ int copy_file(const char *source, const char *dest, int flags)
        ) {
                // We are lazy here, a bit lax with races...
                if (dest_exists) {
+                       errno = EEXIST;
                        ovr = ask_and_unlink(dest, flags);
                        if (ovr <= 0)
                                return ovr;