summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko2010-10-26 15:58:47 +0200
committerDenys Vlasenko2010-10-26 15:58:47 +0200
commit4c46d854690595bb2c5487aedccebab8de8aafda (patch)
treed1d43599b4bc99ca05a082e5cd994b955f5fab3b
parenta43e969574fca5ba17bb866c2aa249fe16ac0530 (diff)
downloadbusybox-4c46d854690595bb2c5487aedccebab8de8aafda.zip
busybox-4c46d854690595bb2c5487aedccebab8de8aafda.tar.gz
mv: implement -n option
function old new delta mv_longopts 23 36 +13 mv_main 510 520 +10 packed_usage 27218 27225 +7 Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r--coreutils/mv.c46
-rw-r--r--include/usage.src.h12
2 files changed, 33 insertions, 25 deletions
diff --git a/coreutils/mv.c b/coreutils/mv.c
index 7f49d5b..245639b 100644
--- a/coreutils/mv.c
+++ b/coreutils/mv.c
@@ -16,15 +16,30 @@
#include "libbb.h"
#include "libcoreutils/coreutils.h"
+//usage:#define mv_trivial_usage
+//usage: "[-fin] SOURCE DEST\n"
+//usage: "or: mv [-fin] SOURCE... DIRECTORY"
+//usage:#define mv_full_usage "\n\n"
+//usage: "Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY\n"
+//usage: "\nOptions:"
+//usage: "\n -f Don't prompt before overwriting"
+//usage: "\n -i Interactive, prompt before overwrite"
+//usage: "\n -n Don't overwrite an existing file"
+//usage:
+//usage:#define mv_example_usage
+//usage: "$ mv /tmp/foo /bin/bar\n"
+
#if ENABLE_FEATURE_MV_LONG_OPTIONS
static const char mv_longopts[] ALIGN1 =
"interactive\0" No_argument "i"
"force\0" No_argument "f"
+ "no-clobber\0" No_argument "n"
;
#endif
#define OPT_FILEUTILS_FORCE 1
#define OPT_FILEUTILS_INTERACTIVE 2
+#define OPT_FILEUTILS_NOCLOBBER 4
int mv_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int mv_main(int argc, char **argv)
@@ -40,10 +55,11 @@ int mv_main(int argc, char **argv)
#if ENABLE_FEATURE_MV_LONG_OPTIONS
applet_long_options = mv_longopts;
#endif
- // Need at least two arguments
- // -f unsets -i, -i unsets -f
- opt_complementary = "-2:f-i:i-f";
- flags = getopt32(argv, "fi");
+ /* 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). */
+ opt_complementary = "-2:f-in:i-fn:n-fi";
+ flags = getopt32(argv, "fin");
argc -= optind;
argv += optind;
last = argv[argc - 1];
@@ -68,18 +84,22 @@ int mv_main(int argc, char **argv)
}
DO_MOVE:
- if (dest_exists
- && !(flags & OPT_FILEUTILS_FORCE)
- && ((access(dest, W_OK) < 0 && isatty(0))
- || (flags & OPT_FILEUTILS_INTERACTIVE))
- ) {
- if (fprintf(stderr, "mv: overwrite '%s'? ", dest) < 0) {
- goto RET_1; /* Ouch! fprintf failed! */
- }
- if (!bb_ask_confirmation()) {
+ if (dest_exists) {
+ if (flags & OPT_FILEUTILS_NOCLOBBER)
goto RET_0;
+ if (!(flags & OPT_FILEUTILS_FORCE)
+ && ((access(dest, W_OK) < 0 && isatty(0))
+ || (flags & OPT_FILEUTILS_INTERACTIVE))
+ ) {
+ if (fprintf(stderr, "mv: overwrite '%s'? ", dest) < 0) {
+ goto RET_1; /* Ouch! fprintf failed! */
+ }
+ if (!bb_ask_confirmation()) {
+ goto RET_0;
+ }
}
}
+
if (rename(*argv, dest) < 0) {
struct stat source_stat;
int source_exists;
diff --git a/include/usage.src.h b/include/usage.src.h
index f5ddd7b..e1810c9 100644
--- a/include/usage.src.h
+++ b/include/usage.src.h
@@ -2695,18 +2695,6 @@ INSERT
"ras3 reset retension rewind rewoffline seek setblk setdensity\n" \
"setpart tell unload unlock weof wset" \
-#define mv_trivial_usage \
- "[-fi] SOURCE DEST\n" \
- "or: mv [-fi] SOURCE... DIRECTORY"
-#define mv_full_usage "\n\n" \
- "Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY\n" \
- "\nOptions:" \
- "\n -f Don't prompt before overwriting" \
- "\n -i Interactive, prompt before overwrite" \
-
-#define mv_example_usage \
- "$ mv /tmp/foo /bin/bar\n"
-
#define nameif_trivial_usage \
"[-s] [-c FILE] [{IFNAME MACADDR}]"
#define nameif_full_usage "\n\n" \