- 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 <pclouds@xxxxxxxxx> --- 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