last_patch56 from vodz to simplify copy_file logic
authorEric Andersen <andersen@codepoet.org>
Tue, 17 Sep 2002 08:42:21 +0000 (08:42 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 17 Sep 2002 08:42:21 +0000 (08:42 -0000)
libbb/copy_file.c

index d71dbf47d5c6cbe2dd95e9f73453847204a03780..5f667cf4f79d9683c33c2509faf3d99152b9e05a 100644 (file)
@@ -36,7 +36,7 @@ int copy_file(const char *source, const char *dest, int flags)
 {
        struct stat source_stat;
        struct stat dest_stat;
-       int dest_exists = 1;
+       int dest_exists = 0;
        int status = 0;
 
        if ((!(flags & FILEUTILS_DEREFERENCE) &&
@@ -52,14 +52,14 @@ int copy_file(const char *source, const char *dest, int flags)
                        perror_msg("unable to stat `%s'", dest);
                        return -1;
                }
-               dest_exists = 0;
-       }
-
-       if (dest_exists && source_stat.st_dev == dest_stat.st_dev &&
+       } else {
+               if (source_stat.st_dev == dest_stat.st_dev &&
                        source_stat.st_ino == dest_stat.st_ino) {
                error_msg("`%s' and `%s' are the same file", source, dest);
                return -1;
        }
+               dest_exists = 1;
+       }
 
        if (S_ISDIR(source_stat.st_mode)) {
                DIR *dp;
@@ -116,13 +116,8 @@ int copy_file(const char *source, const char *dest, int flags)
                        free(new_source);
                        free(new_dest);
                }
-
-               /* ??? What if an error occurs in readdir?  */
-
-               if (closedir(dp) < 0) {
-                       perror_msg("unable to close directory `%s'", source);
-                       status = -1;
-               }
+               /* closedir have only EBADF error, but "dp" not changes */
+               closedir(dp);
 
                if (!dest_exists &&
                                chmod(dest, source_stat.st_mode & ~saved_umask) < 0) {
@@ -145,8 +140,7 @@ int copy_file(const char *source, const char *dest, int flags)
                }
 #endif
 
-               if ((sfp = fopen(source, "r")) == NULL) {
-                       perror_msg("unable to open `%s'", source);
+               if ((sfp = wfopen(source, "r")) == NULL) {
                        return -1;
                }
 
@@ -201,55 +195,28 @@ int copy_file(const char *source, const char *dest, int flags)
                        perror_msg("unable to close `%s'", source);
                        status = -1;
                }
-       } else if (S_ISBLK(source_stat.st_mode) || S_ISCHR(source_stat.st_mode) ||
-                       S_ISSOCK(source_stat.st_mode)) {
-
-               if (dest_exists) {
-                       if (flags & FILEUTILS_INTERACTIVE) {
-                               fprintf(stderr, "%s: overwrite `%s'? ", applet_name, dest);
-                               if (!ask_confirmation())
-                                       return 0;
                        }
+       else if (S_ISBLK(source_stat.st_mode) || S_ISCHR(source_stat.st_mode) ||
+           S_ISSOCK(source_stat.st_mode) || S_ISFIFO(source_stat.st_mode) ||
+           S_ISLNK(source_stat.st_mode)) {
 
-                       if (!(flags & FILEUTILS_FORCE)) {
+               if (dest_exists &&
+                      ((flags & FILEUTILS_FORCE) == 0 || unlink(dest) < 0)) {
                                perror_msg("unable to remove `%s'", dest);
                                return -1;
-                       }
 
-                       if (unlink(dest) < 0) {
-                               perror_msg("unable to remove `%s'", dest);
-                               return -1;
                        }
-
-                       dest_exists = 0;
+       } else {
+               error_msg("internal error: unrecognized file type");
+               return -1;
                }
-
+       if (S_ISBLK(source_stat.st_mode) || S_ISCHR(source_stat.st_mode) ||
+           S_ISSOCK(source_stat.st_mode)) {
                if (mknod(dest, source_stat.st_mode, source_stat.st_rdev) < 0) {
                        perror_msg("unable to create `%s'", dest);
                        return -1;
                }
        } else if (S_ISFIFO(source_stat.st_mode)) {
-
-               if (dest_exists) {
-                       if (flags & FILEUTILS_INTERACTIVE) {
-                               fprintf(stderr, "%s: overwrite `%s'? ", applet_name, dest);
-                               if (!ask_confirmation())
-                                       return 0;
-                       }
-
-                       if (!(flags & FILEUTILS_FORCE)) {
-                               perror_msg("unable to remove `%s'", dest);
-                               return -1;
-                       }
-
-                       if (unlink(dest) < 0) {
-                               perror_msg("unable to remove `%s'", dest);
-                               return -1;
-                       }
-
-                       dest_exists = 0;
-               }
-
                if (mkfifo(dest, source_stat.st_mode) < 0) {
                        perror_msg("cannot create fifo `%s'", dest);
                        return -1;
@@ -257,26 +224,6 @@ int copy_file(const char *source, const char *dest, int flags)
        } else if (S_ISLNK(source_stat.st_mode)) {
                char *lpath;
 
-               if (dest_exists) {
-                       if (flags & FILEUTILS_INTERACTIVE) {
-                               fprintf(stderr, "%s: overwrite `%s'? ", applet_name, dest);
-                               if (!ask_confirmation())
-                                       return 0;
-                       }
-
-                       if (!(flags & FILEUTILS_FORCE)) {
-                               perror_msg("unable to remove `%s'", dest);
-                               return -1;
-                       }
-
-                       if (unlink(dest) < 0) {
-                               perror_msg("unable to remove `%s'", dest);
-                               return -1;
-                       }
-
-                       dest_exists = 0;
-               }
-
                lpath = xreadlink(source);
                if (symlink(lpath, dest) < 0) {
                        perror_msg("cannot create symlink `%s'", dest);
@@ -295,9 +242,6 @@ int copy_file(const char *source, const char *dest, int flags)
 #endif
 
                return 0;
-       } else {
-               error_msg("internal error: unrecognized file type");
-               return -1;
        }
 
 #ifdef CONFIG_FEATURE_PRESERVE_HARDLINKS