aboutsummaryrefslogtreecommitdiff
path: root/toys/posix/cp.c
diff options
context:
space:
mode:
authorDenys Nykula <nykula@ukr.net>2019-06-22 14:57:59 +0300
committerRob Landley <rob@landley.net>2019-06-22 09:05:53 -0500
commit3b9cfa70db019fa9b43ddba2d5620bff6c72bad6 (patch)
tree17ba946b54145c3949a8ac3b3d9c229bab15a26d /toys/posix/cp.c
parent10534db2f6145dac85689e773d53befa4ce91c7d (diff)
downloadtoybox-3b9cfa70db019fa9b43ddba2d5620bff6c72bad6.tar.gz
Fix mv with trailing slash in source.
Press tab, have bash complete dir name with a slash, notice musl rename() dislikes that. Replace trailing slash in the cp loop with a null character, if the command name is mv. Add the slash back if an error occurs.
Diffstat (limited to 'toys/posix/cp.c')
-rw-r--r--toys/posix/cp.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/toys/posix/cp.c b/toys/posix/cp.c
index 681af025..9989ed14 100644
--- a/toys/posix/cp.c
+++ b/toys/posix/cp.c
@@ -403,9 +403,14 @@ void cp_main(void)
// Loop through sources
for (i=0; i<toys.optc; i++) {
- char *src = toys.optargs[i];
+ char *src = toys.optargs[i], *trail = src;
int rc = 1;
+ if (CFG_MV && toys.which->name[0] == 'm') {
+ while (*++trail);
+ if (*--trail == '/') *trail = 0;
+ }
+
if (destdir) {
char *s = (toys.optflags&FLAG_D) ? getdirname(src) : getbasename(src);
@@ -442,6 +447,7 @@ void cp_main(void)
if (exists && no_clobber) rc = 0;
}
if (rc) rc = rename(src, TT.destname);
+ if (errno && !*trail) *trail = '/';
}
// Copy if we didn't mv, skipping nonexistent sources