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

13
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,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;