sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit 109f6b5a609de3d31d8ca2563342f6eabe0ec63c
parent aaac1c880039564c87913ba1bbb08aaf28bf7ad7
Author: FRIGN <dev@frign.de>
Date:   Wed,  4 Mar 2015 23:22:43 +0100

Audit mv(1)

1) Make argument-naming consistent with other tools (cp(1), ...)
2) style fixes
3) usage() fix
4) BUGFIX: Probably from the old non-arg.h days, the directory-
   check was only done when argc > 3, but with arg.h, this ignores
   the case when 3 arguments were given.
   This is actually a pretty serious issue and I'm glad it's fixed.
5) Moreover, be more verbose when stat() fails and make it clearer
   what the hell is going on at this checkpoint.

Diffstat:
MREADME | 2+-
Mmv.1 | 10+++++-----
Mmv.c | 13+++++++++----
3 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/README b/README @@ -47,7 +47,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support, =* mkdir yes none =*| mkfifo yes none =* mktemp non-posix none -=* mv yes none (-i) +=*| mv yes none (-i) =*| nice yes none = nl no -d, -f, -h, -l, -p =*| nohup yes none diff --git a/mv.1 b/mv.1 @@ -1,4 +1,4 @@ -.Dd February 19, 2015 +.Dd March 4, 2015 .Dt MV 1 .Os sbase .Sh NAME @@ -8,17 +8,17 @@ .Nm .Op Fl f .Ar source ... -.Ar destination +.Ar dest .Sh DESCRIPTION .Nm moves each .Ar source to -.Ar destination . +.Ar dest . If only one .Ar source is given and -.Ar destination +.Ar dest is not a directory, .Nm overwrites the latter with the former. @@ -26,7 +26,7 @@ overwrites the latter with the former. .Bl -tag -width Ds .It Fl f Do not prompt before overwriting. -.Ar destination . +.Ar dest . Prompting has not been implemented yet. .El .Sh STANDARDS diff --git a/mv.c b/mv.c @@ -12,7 +12,7 @@ static int mv_status = 0; static int mv(const char *s1, const char *s2, int depth) { - if (rename(s1, s2) == 0) + if (!rename(s1, s2)) return (mv_status = 0); if (errno == EXDEV) { cp_aflag = cp_rflag = cp_pflag = 1; @@ -23,13 +23,14 @@ mv(const char *s1, const char *s2, int depth) return (mv_status = cp_status || rm_status); } mv_status = 1; + return -1; } static void usage(void) { - eprintf("usage: %s [-f] source... dest\n", argv0); + eprintf("usage: %s [-f] source ... dest\n", argv0); } int @@ -47,8 +48,12 @@ main(int argc, char *argv[]) if (argc < 2) usage(); - if (argc > 3 && !(stat(argv[argc-1], &st) == 0 && S_ISDIR(st.st_mode))) - eprintf("%s: not a directory\n", argv[argc-1]); + if (argc > 2) { + if (stat(argv[argc - 1], &st) < 0) + eprintf("stat %s:", argv[argc - 1]); + if (!S_ISDIR(st.st_mode)) + eprintf("%s: not a directory\n", argv[argc - 1]); + } enmasse(argc, argv, mv); return mv_status;