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:
parent
aaac1c8800
commit
109f6b5a60
2
README
2
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
|
||||
|
|
10
mv.1
10
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
|
||||
|
|
9
mv.c
9
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,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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user