[hackers] [sbase] Audit mv(1) || FRIGN

From: <git_AT_suckless.org>
Date: Wed, 4 Mar 2015 23:54:08 +0100 (CET)

commit 4bfacf6d3ec2435654925706375ee0fd58cf6ad2
Author: FRIGN <dev_AT_frign.de>
Date: Wed Mar 4 23:22:43 2015 +0100

    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.

diff --git a/README b/README
index 7745254..4a52906 100644
--- a/README
+++ b/README
_AT_@ -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
diff --git a/mv.1 b/mv.1
index b3ec35d..5ddb80d 100644
--- a/mv.1
+++ b/mv.1
_AT_@ -1,4 +1,4 @@
-.Dd February 19, 2015
+.Dd March 4, 2015
 .Dt MV 1
 .Os sbase
 .Sh NAME
_AT_@ -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.
_AT_@ -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
diff --git a/mv.c b/mv.c
index b46981c..6734ee9 100644
--- a/mv.c
+++ b/mv.c
_AT_@ -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;
_AT_@ -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
_AT_@ -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;
Received on Wed Mar 04 2015 - 23:54:08 CET

This archive was generated by hypermail 2.3.0 : Thu Mar 05 2015 - 00:00:28 CET