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:
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;