109f6b5a60
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.
61 lines
955 B
C
61 lines
955 B
C
/* See LICENSE file for copyright and license details. */
|
|
#include <sys/stat.h>
|
|
|
|
#include <errno.h>
|
|
#include <stdio.h>
|
|
|
|
#include "fs.h"
|
|
#include "util.h"
|
|
|
|
static int mv_status = 0;
|
|
|
|
static int
|
|
mv(const char *s1, const char *s2, int depth)
|
|
{
|
|
if (!rename(s1, s2))
|
|
return (mv_status = 0);
|
|
if (errno == EXDEV) {
|
|
cp_aflag = cp_rflag = cp_pflag = 1;
|
|
cp_HLPflag = 'P';
|
|
rm_rflag = 1;
|
|
cp(s1, s2, depth);
|
|
rm(s1, 0);
|
|
return (mv_status = cp_status || rm_status);
|
|
}
|
|
mv_status = 1;
|
|
|
|
return -1;
|
|
}
|
|
|
|
static void
|
|
usage(void)
|
|
{
|
|
eprintf("usage: %s [-f] source ... dest\n", argv0);
|
|
}
|
|
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
struct stat st;
|
|
|
|
ARGBEGIN {
|
|
case 'f':
|
|
break;
|
|
default:
|
|
usage();
|
|
} ARGEND;
|
|
|
|
if (argc < 2)
|
|
usage();
|
|
|
|
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;
|
|
}
|