Add conditional support for -v / --verbose
No binary (build failed)
—
(log yok)
| @@ -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 | |
| @@ -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 | |
| @@ -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); | |
| @@ -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); | |
| } | |
| @@ -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); | |
| } | |
| @@ -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 { | |
| @@ -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) | |
| @@ -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; | |
| @@ -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; | |
| } | |
| @@ -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) { | |
| @@ -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; | |
| } | |