- selinux preservation code
 - make-link code
 - delete link dereference code
 - non-recursive copy code
 - stat no preservation code
 - verbose printing code

Some of these are "cp" features that we don't need (for "git worktree
move"). Some do not make sense in source-control context (SELinux).
Some probably need a reimplementation to better fit in (verbose
printing code).

Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 copy.c | 101 +++++------------------------------------------------------------
 1 file changed, 7 insertions(+), 94 deletions(-)

diff --git a/copy.c b/copy.c
index 79623ac..b7a87f1 100644
--- a/copy.c
+++ b/copy.c
@@ -82,14 +82,7 @@ int FAST_FUNC copy_file(const char *source, const char 
*dest, int flags)
        smallint dest_exists = 0;
        smallint ovr;
 
-/* Inverse of cp -d ("cp without -d") */
-#define FLAGS_DEREF (flags & (FILEUTILS_DEREFERENCE + 
FILEUTILS_DEREFERENCE_L0))
-
-       if ((FLAGS_DEREF ? stat : lstat)(source, &source_stat) < 0) {
-               /* This may be a dangling symlink.
-                * Making [sym]links to dangling symlinks works, so... */
-               if (flags & (FILEUTILS_MAKE_SOFTLINK|FILEUTILS_MAKE_HARDLINK))
-                       goto make_links;
+       if (lstat(source, &source_stat) < 0) {
                bb_perror_msg("can't stat '%s'", source);
                return -1;
        }
@@ -109,35 +102,12 @@ int FAST_FUNC copy_file(const char *source, const char 
*dest, int flags)
                dest_exists = 1;
        }
 
-#if ENABLE_SELINUX
-       if ((flags & FILEUTILS_PRESERVE_SECURITY_CONTEXT) && 
is_selinux_enabled() > 0) {
-               security_context_t con;
-               if (lgetfilecon(source, &con) >= 0) {
-                       if (setfscreatecon(con) < 0) {
-                               bb_perror_msg("can't set setfscreatecon %s", 
con);
-                               freecon(con);
-                               return -1;
-                       }
-               } else if (errno == ENOTSUP || errno == ENODATA) {
-                       setfscreatecon_or_die(NULL);
-               } else {
-                       bb_perror_msg("can't lgetfilecon %s", source);
-                       return -1;
-               }
-       }
-#endif
-
        if (S_ISDIR(source_stat.st_mode)) {
                DIR *dp;
                const char *tp;
                struct dirent *d;
                mode_t saved_umask = 0;
 
-               if (!(flags & FILEUTILS_RECUR)) {
-                       bb_error_msg("omitting directory '%s'", source);
-                       return -1;
-               }
-
                /* Did we ever create source ourself before? */
                tp = is_in_ino_dev_hashtable(&source_stat);
                if (tp) {
@@ -160,8 +130,6 @@ int FAST_FUNC copy_file(const char *source, const char 
*dest, int flags)
                        saved_umask = umask(0);
 
                        mode = source_stat.st_mode;
-                       if (!(flags & FILEUTILS_PRESERVE_STATUS))
-                               mode = source_stat.st_mode & ~saved_umask;
                        /* Allow owner to access new dir (at least for now) */
                        mode |= S_IRWXU;
                        if (mkdir(dest, mode) < 0) {
@@ -210,45 +178,17 @@ int FAST_FUNC copy_file(const char *source, const char 
*dest, int flags)
                goto preserve_mode_ugid_time;
        }
 
-       if (flags & (FILEUTILS_MAKE_SOFTLINK|FILEUTILS_MAKE_HARDLINK)) {
-               int (*lf)(const char *oldpath, const char *newpath);
- make_links:
-               /* Hmm... maybe
-                * if (DEREF && MAKE_SOFTLINK) source = realpath(source) ?
-                * (but realpath returns NULL on dangling symlinks...) */
-               lf = (flags & FILEUTILS_MAKE_SOFTLINK) ? symlink : link;
-               if (lf(source, dest) < 0) {
-                       ovr = ask_and_unlink(dest, flags);
-                       if (ovr <= 0)
-                               return ovr;
-                       if (lf(source, dest) < 0) {
-                               bb_perror_msg("can't create link '%s'", dest);
-                               return -1;
-                       }
-               }
-               /* _Not_ jumping to preserve_mode_ugid_time:
-                * (sym)links don't have those */
-               return 0;
-       }
-
-       if (/* "cp thing1 thing2" without -R: just open and read() from thing1 
*/
-           !(flags & FILEUTILS_RECUR)
-           /* "cp [-opts] regular_file thing2" */
-        || S_ISREG(source_stat.st_mode)
-        /* DEREF uses stat, which never returns S_ISLNK() == true.
-         * So the below is never true: */
-        /* || (FLAGS_DEREF && S_ISLNK(source_stat.st_mode)) */
-       ) {
+       if (S_ISREG(source_stat.st_mode) ) { /* "cp [-opts] regular_file 
thing2" */
                int src_fd;
                int dst_fd;
                mode_t new_mode;
 
-               if (!FLAGS_DEREF && S_ISLNK(source_stat.st_mode)) {
+               if (S_ISLNK(source_stat.st_mode)) {
                        /* "cp -d symlink dst": create a link */
                        goto dont_cat;
                }
 
-               if (ENABLE_FEATURE_PRESERVE_HARDLINKS && !FLAGS_DEREF) {
+               if (ENABLE_FEATURE_PRESERVE_HARDLINKS) {
                        const char *link_target;
                        link_target = is_in_ino_dev_hashtable(&source_stat);
                        if (link_target) {
@@ -295,25 +235,6 @@ int FAST_FUNC copy_file(const char *source, const char 
*dest, int flags)
                        }
                }
 
-#if ENABLE_SELINUX
-               if ((flags & 
(FILEUTILS_PRESERVE_SECURITY_CONTEXT|FILEUTILS_SET_SECURITY_CONTEXT))
-                && is_selinux_enabled() > 0
-               ) {
-                       security_context_t con;
-                       if (getfscreatecon(&con) == -1) {
-                               bb_perror_msg("getfscreatecon");
-                               return -1;
-                       }
-                       if (con) {
-                               if (setfilecon(dest, con) == -1) {
-                                       bb_perror_msg("setfilecon:%s,%s", dest, 
con);
-                                       freecon(con);
-                                       return -1;
-                               }
-                               freecon(con);
-                       }
-               }
-#endif
                if (bb_copyfd_eof(src_fd, dst_fd) == -1)
                        retval = -1;
                /* Careful with writing... */
@@ -348,9 +269,8 @@ int FAST_FUNC copy_file(const char *source, const char 
*dest, int flags)
                                bb_perror_msg("can't create symlink '%s'", 
dest);
                                return -1;
                        }
-                       if (flags & FILEUTILS_PRESERVE_STATUS)
-                               if (lchown(dest, source_stat.st_uid, 
source_stat.st_gid) < 0)
-                                       bb_perror_msg("can't preserve %s of 
'%s'", "ownership", dest);
+                       if (lchown(dest, source_stat.st_uid, 
source_stat.st_gid) < 0)
+                               bb_perror_msg("can't preserve %s of '%s'", 
"ownership", dest);
                }
                /* _Not_ jumping to preserve_mode_ugid_time:
                 * symlinks don't have those */
@@ -370,10 +290,7 @@ int FAST_FUNC copy_file(const char *source, const char 
*dest, int flags)
 
  preserve_mode_ugid_time:
 
-       if (flags & FILEUTILS_PRESERVE_STATUS
-       /* Cannot happen: */
-       /* && !(flags & (FILEUTILS_MAKE_SOFTLINK|FILEUTILS_MAKE_HARDLINK)) */
-       ) {
+       if (1 /*FILEUTILS_PRESERVE_STATUS*/) {
                struct timeval times[2];
 
                times[1].tv_sec = times[0].tv_sec = source_stat.st_mtime;
@@ -389,10 +306,6 @@ int FAST_FUNC copy_file(const char *source, const char 
*dest, int flags)
                        bb_perror_msg("can't preserve %s of '%s'", 
"permissions", dest);
        }
 
-       if (flags & FILEUTILS_VERBOSE) {
-               printf("'%s' -> '%s'\n", source, dest);
-       }
-
        return retval;
 }
 #endif
-- 
2.8.2.524.g6ff3d78

Reply via email to