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