diff options
author | Denys Nykula <nykula@ukr.net> | 2019-06-22 14:57:59 +0300 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2019-06-22 09:05:53 -0500 |
commit | 3b9cfa70db019fa9b43ddba2d5620bff6c72bad6 (patch) | |
tree | 17ba946b54145c3949a8ac3b3d9c229bab15a26d /toys | |
parent | 10534db2f6145dac85689e773d53befa4ce91c7d (diff) | |
download | toybox-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')
-rw-r--r-- | toys/posix/cp.c | 8 |
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 |