diff --git a/coreutils/Config.src b/coreutils/Config.src index 33defa4db..68c717883 100644 --- a/coreutils/Config.src +++ b/coreutils/Config.src @@ -739,6 +739,16 @@ config YES yes is used to repeatedly output a specific string, or the default string `y'. +comment "Common options" + +config FEATURE_VERBOSE + bool "Support verbose options (usually -v) for various applets" + default y + help + Enable cp -v, rm -v and similar messages. + Also enables long option (--verbose) if it exists. + Without this option, -v is accepted but ignored. + comment "Common options for cp and mv" depends on CP || MV diff --git a/coreutils/cp.c b/coreutils/cp.c index de2e512be..247ed0fda 100644 --- a/coreutils/cp.c +++ b/coreutils/cp.c @@ -79,7 +79,6 @@ int cp_main(int argc, char **argv) "parents\0" No_argument "\xff" ; #endif - // -v (--verbose) is ignored flags = getopt32(argv, FILEUTILS_CP_OPTSTR "arPv"); /* Options of cp from GNU coreutils 6.10: * -a, --archive diff --git a/coreutils/install.c b/coreutils/install.c index 445497f9a..6c88ae11c 100644 --- a/coreutils/install.c +++ b/coreutils/install.c @@ -28,6 +28,9 @@ #if ENABLE_FEATURE_INSTALL_LONG_OPTIONS static const char install_longopts[] ALIGN1 = + IF_FEATURE_VERBOSE( + "verbose\0" No_argument "v" + ) "directory\0" No_argument "d" "preserve-timestamps\0" No_argument "p" "strip\0" No_argument "s" @@ -89,6 +92,7 @@ int install_main(int argc, char **argv) const char *gid_str; const char *uid_str; const char *mode_str; + int mkdir_flags = FILEUTILS_RECUR; int copy_flags = FILEUTILS_DEREFERENCE | FILEUTILS_FORCE; int opts; int min_args = 1; @@ -120,7 +124,6 @@ int install_main(int argc, char **argv) #endif opt_complementary = "s--d:d--s" IF_FEATURE_INSTALL_LONG_OPTIONS(IF_SELINUX(":Z--\xff:\xff--Z")); /* -c exists for backwards compatibility, it's needed */ - /* -v is ignored ("print name of each created directory") */ /* -b is ignored ("make a backup of each existing destination file") */ opts = getopt32(argv, "cvb" "Ddpsg:m:o:" IF_SELINUX("Z:"), &gid_str, &mode_str, &uid_str IF_SELINUX(, &scontext)); @@ -141,6 +144,11 @@ int install_main(int argc, char **argv) } #endif + if ((opts & OPT_v) && FILEUTILS_VERBOSE) { + mkdir_flags |= FILEUTILS_VERBOSE; + copy_flags |= FILEUTILS_VERBOSE; + } + /* preserve access and modification time, this is GNU behaviour, * BSD only preserves modification time */ if (opts & OPT_PRESERVE_TIME) { @@ -171,14 +179,14 @@ int install_main(int argc, char **argv) /* GNU coreutils 6.9 does not set uid:gid * on intermediate created directories * (only on last one) */ - if (bb_make_directory(dest, 0755, FILEUTILS_RECUR)) { + if (bb_make_directory(dest, 0755, mkdir_flags)) { ret = EXIT_FAILURE; goto next; } } else { if (opts & OPT_MKDIR_LEADING) { char *ddir = xstrdup(dest); - bb_make_directory(dirname(ddir), 0755, FILEUTILS_RECUR); + bb_make_directory(dirname(ddir), 0755, mkdir_flags); /* errors are not checked. copy_file * will fail if dir is not created. */ free(ddir); diff --git a/coreutils/mkdir.c b/coreutils/mkdir.c index 4a8e43e43..864edfb0a 100644 --- a/coreutils/mkdir.c +++ b/coreutils/mkdir.c @@ -48,7 +48,9 @@ static const char mkdir_longopts[] ALIGN1 = #if ENABLE_SELINUX "context\0" Required_argument "Z" #endif +#if ENABLE_FEATURE_VERBOSE "verbose\0" No_argument "v" +#endif ; #endif @@ -67,7 +69,7 @@ int mkdir_main(int argc UNUSED_PARAM, char **argv) #if ENABLE_FEATURE_MKDIR_LONG_OPTIONS applet_long_options = mkdir_longopts; #endif - opt = getopt32(argv, "m:p" IF_SELINUX("Z:") "v", &smode IF_SELINUX(,&scontext)); + opt = getopt32(argv, "m:pv" IF_SELINUX("Z:"), &smode IF_SELINUX(,&scontext)); if (opt & 1) { mode_t mmode = 0777; if (!bb_parse_mode(smode, &mmode)) { @@ -77,8 +79,10 @@ int mkdir_main(int argc UNUSED_PARAM, char **argv) } if (opt & 2) flags |= FILEUTILS_RECUR; + if ((opt & 4) && FILEUTILS_VERBOSE) + flags |= FILEUTILS_VERBOSE; #if ENABLE_SELINUX - if (opt & 4) { + if (opt & 8) { selinux_or_die(); setfscreatecon_or_die(scontext); } diff --git a/coreutils/mv.c b/coreutils/mv.c index f127dfabd..50571755b 100644 --- a/coreutils/mv.c +++ b/coreutils/mv.c @@ -33,13 +33,17 @@ static const char mv_longopts[] ALIGN1 = "interactive\0" No_argument "i" "force\0" No_argument "f" "no-clobber\0" No_argument "n" + IF_FEATURE_VERBOSE( "verbose\0" No_argument "v" + ) ; #endif #define OPT_FORCE (1 << 0) #define OPT_INTERACTIVE (1 << 1) #define OPT_NOCLOBBER (1 << 2) +#define OPT_VERBOSE ((1 << 3) * ENABLE_FEATURE_VERBOSE) + int mv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int mv_main(int argc, char **argv) @@ -58,7 +62,6 @@ int mv_main(int argc, char **argv) /* Need at least two arguments. * If more than one of -f, -i, -n is specified , only the final one * takes effect (it unsets previous options). - * -v is accepted but ignored. */ opt_complementary = "-2:f-in:i-fn:n-fi"; flags = getopt32(argv, "finv"); @@ -148,6 +151,9 @@ int mv_main(int argc, char **argv) status = 1; } RET_0: + if (flags & OPT_VERBOSE) { + printf("'%s' -> '%s'\n", *argv, dest); + } if (dest != last) { free((void *) dest); } diff --git a/coreutils/rm.c b/coreutils/rm.c index 042fba162..d0ad81dfc 100644 --- a/coreutils/rm.c +++ b/coreutils/rm.c @@ -38,7 +38,6 @@ int rm_main(int argc UNUSED_PARAM, char **argv) unsigned opt; opt_complementary = "f-i:i-f"; - /* -v (verbose) is ignored */ opt = getopt32(argv, "fiRrv"); argv += optind; if (opt & 1) @@ -47,6 +46,8 @@ int rm_main(int argc UNUSED_PARAM, char **argv) flags |= FILEUTILS_INTERACTIVE; if (opt & (8|4)) flags |= FILEUTILS_RECUR; + if ((opt & 16) && FILEUTILS_VERBOSE) + flags |= FILEUTILS_VERBOSE; if (*argv != NULL) { do { diff --git a/coreutils/rmdir.c b/coreutils/rmdir.c index cc2dea010..0792a1c8e 100644 --- a/coreutils/rmdir.c +++ b/coreutils/rmdir.c @@ -31,7 +31,7 @@ #define PARENTS (1 << 0) -//efine VERBOSE (1 << 1) //accepted but ignored +#define VERBOSE ((1 << 1) * ENABLE_FEATURE_VERBOSE) #define IGNORE_NON_EMPTY (1 << 2) int rmdir_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; @@ -44,10 +44,12 @@ int rmdir_main(int argc UNUSED_PARAM, char **argv) #if ENABLE_FEATURE_RMDIR_LONG_OPTIONS static const char rmdir_longopts[] ALIGN1 = "parents\0" No_argument "p" - "verbose\0" No_argument "v" /* Debian etch: many packages fail to be purged or installed * because they desperately want this option: */ "ignore-fail-on-non-empty\0" No_argument "\xff" + IF_FEATURE_VERBOSE( + "verbose\0" No_argument "v" + ) ; applet_long_options = rmdir_longopts; #endif @@ -62,6 +64,10 @@ int rmdir_main(int argc UNUSED_PARAM, char **argv) path = *argv; while (1) { + if (flags & VERBOSE) { + printf("rmdir: removing directory, '%s'\n", path); + } + if (rmdir(path) < 0) { #if ENABLE_FEATURE_RMDIR_LONG_OPTIONS if ((flags & IGNORE_NON_EMPTY) && errno == ENOTEMPTY) diff --git a/include/libbb.h b/include/libbb.h index afdee38c4..a1a0dc18c 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -334,6 +334,8 @@ enum { /* DO NOT CHANGE THESE VALUES! cp.c, mv.c, install.c depend on them. */ FILEUTILS_SET_SECURITY_CONTEXT = 1 << 10, #endif FILEUTILS_IGNORE_CHMOD_ERR = 1 << 11, + /* -v */ + FILEUTILS_VERBOSE = (1 << 12) * ENABLE_FEATURE_VERBOSE, }; #define FILEUTILS_CP_OPTSTR "pdRfilsLH" IF_SELINUX("c") extern int remove_file(const char *path, int flags) FAST_FUNC; diff --git a/libbb/copy_file.c b/libbb/copy_file.c index 9333a8d49..a4be875d2 100644 --- a/libbb/copy_file.c +++ b/libbb/copy_file.c @@ -389,5 +389,9 @@ 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; } diff --git a/libbb/make_directory.c b/libbb/make_directory.c index 7826b90f5..89352ca1f 100644 --- a/libbb/make_directory.c +++ b/libbb/make_directory.c @@ -99,6 +99,10 @@ int FAST_FUNC bb_make_directory(char *path, long mode, int flags) if (!c) { goto ret0; } + } else { + if (flags & FILEUTILS_VERBOSE) { + printf("created directory: '%s'\n", path); + } } if (!c) { diff --git a/libbb/remove_file.c b/libbb/remove_file.c index 5b75f7f30..eaca293d9 100644 --- a/libbb/remove_file.c +++ b/libbb/remove_file.c @@ -78,6 +78,10 @@ int FAST_FUNC remove_file(const char *path, int flags) return -1; } + if (flags & FILEUTILS_VERBOSE) { + printf("removed directory: '%s'\n", path); + } + return status; } @@ -98,5 +102,9 @@ int FAST_FUNC remove_file(const char *path, int flags) return -1; } + if (flags & FILEUTILS_VERBOSE) { + printf("removed '%s'\n", path); + } + return 0; }