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:
13
mv.c
13
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;
|
||||
|
Reference in New Issue
Block a user