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.
This commit is contained in:
FRIGN 2015-03-04 23:22:43 +01:00
parent aaac1c8800
commit 109f6b5a60
3 changed files with 15 additions and 10 deletions

2
README
View File

@ -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

10
mv.1
View File

@ -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

9
mv.c
View File

@ -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,6 +23,7 @@ mv(const char *s1, const char *s2, int depth)
return (mv_status = cp_status || rm_status);
}
mv_status = 1;
return -1;
}
@ -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)))
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;