bin/mv has its own copies of cp.c and mv.c.
Apparently, they are modifications of cp's cp.c and rm's rm.c,
used when moving as "copy and remove the source".
In bin/mv/rm.c, the following snippet of rm_file() confuses me:
if (S_ISDIR(sb.st_mode)) {
warnx("%s: is a directory", f);
eval = 1;
continue;
}
if (S_ISDIR(sb.st_mode))
rval = rmdir(f);
else {
rval = unlink(f);
}
If it's a directory, give up.
And if it's a directory, rmdir();
Is this intentional? In fact, rm_file() and check()
are not used anywhere else in bin/mv code.
Is it there to keep the diff to bin/rm smaller?
Jan
Index: rm.c
===================================================================
RCS file: /cvs/src/bin/mv/rm.c,v
retrieving revision 1.7
diff -u -p -r1.7 rm.c
--- rm.c 27 Nov 2015 17:32:16 -0000 1.7
+++ rm.c 10 Oct 2016 10:21:01 -0000
@@ -52,9 +52,7 @@ extern char *__progname;
static int eval, stdin_ok;
-static int check(char *, char *, struct stat *);
static void checkdot(char **);
-static void rm_file(char **);
static void rm_tree(char **);
static void __dead
@@ -79,7 +77,6 @@ rmmain(int argc, char *argv[])
if (*argv) {
stdin_ok = isatty(STDIN_FILENO);
-
rm_tree(argv);
}
@@ -158,72 +155,6 @@ rm_tree(char **argv)
if (errno)
err(1, "fts_read");
fts_close(fts);
-}
-
-static void
-rm_file(char **argv)
-{
- struct stat sb;
- int rval;
- char *f;
-
- /*
- * Remove a file. POSIX 1003.2 states that, by default, attempting
- * to remove a directory is an error, so must always stat the file.
- */
- while ((f = *argv++) != NULL) {
- /* Assume if can't stat the file, can't unlink it. */
- if (lstat(f, &sb)) {
- if (errno != ENOENT) {
- warn("%s", f);
- eval = 1;
- }
- continue;
- }
-
- if (S_ISDIR(sb.st_mode)) {
- warnx("%s: is a directory", f);
- eval = 1;
- continue;
- }
- if (S_ISDIR(sb.st_mode))
- rval = rmdir(f);
- else {
- rval = unlink(f);
- }
- if (rval && (errno != ENOENT)) {
- warn("%s", f);
- eval = 1;
- }
- }
-}
-
-static int
-check(char *path, char *name, struct stat *sp)
-{
- int ch, first;
- char modep[15];
-
- /*
- * If it's not a symbolic link and it's unwritable and we're
- * talking to a terminal, ask. Symbolic links are excluded
- * because their permissions are meaningless. Check stdin_ok
- * first because we may not have stat'ed the file.
- */
- if (!stdin_ok || S_ISLNK(sp->st_mode) || !access(name, W_OK) ||
- errno != EACCES)
- return (1);
- strmode(sp->st_mode, modep);
- (void)fprintf(stderr, "override %s%s%s/%s for %s? ",
- modep + 1, modep[9] == ' ' ? "" : " ",
- user_from_uid(sp->st_uid, 0),
- group_from_gid(sp->st_gid, 0), path);
- (void)fflush(stderr);
-
- first = ch = getchar();
- while (ch != '\n' && ch != EOF)
- ch = getchar();
- return (first == 'y' || first == 'Y');
}
/*