From 109f6b5a609de3d31d8ca2563342f6eabe0ec63c Mon Sep 17 00:00:00 2001 From: FRIGN Date: Wed, 4 Mar 2015 23:22:43 +0100 Subject: [PATCH] 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. --- README | 2 +- mv.1 | 10 +++++----- mv.c | 13 +++++++++---- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/README b/README index 7745254..4a52906 100644 --- 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 index b3ec35d..5ddb80d 100644 --- 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 index b46981c..6734ee9 100644 --- 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;