sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

mv.c (1116B)


      1 /* See LICENSE file for copyright and license details. */
      2 #include <sys/stat.h>
      3 
      4 #include <errno.h>
      5 #include <fcntl.h>
      6 #include <stdio.h>
      7 
      8 #include "fs.h"
      9 #include "util.h"
     10 
     11 static int mv_status = 0;
     12 
     13 static int
     14 mv(const char *s1, const char *s2, int depth)
     15 {
     16 	struct recursor r = { .fn = rm, .follow = 'P' };
     17 
     18 	if (!rename(s1, s2))
     19 		return 0;
     20 	if (errno == EXDEV) {
     21 		cp_aflag = cp_rflag = cp_pflag = 1;
     22 		cp_follow = 'P';
     23 		cp_status = 0;
     24 		rm_status = 0;
     25 		cp(s1, s2, depth);
     26 		if (cp_status == 0)
     27 			recurse(AT_FDCWD, s1, NULL, &r);
     28 		if (cp_status || rm_status)
     29 			mv_status = 1;
     30 	} else {
     31 		weprintf("%s -> %s:", s1, s2);
     32 		mv_status = 1;
     33 	}
     34 
     35 	return 0;
     36 }
     37 
     38 static void
     39 usage(void)
     40 {
     41 	eprintf("usage: %s [-f] source ... dest\n", argv0);
     42 }
     43 
     44 int
     45 main(int argc, char *argv[])
     46 {
     47 	struct stat st;
     48 
     49 	ARGBEGIN {
     50 	case 'f':
     51 		break;
     52 	default:
     53 		usage();
     54 	} ARGEND
     55 
     56 	if (argc < 2)
     57 		usage();
     58 
     59 	if (argc > 2) {
     60 		if (stat(argv[argc - 1], &st) < 0)
     61 			eprintf("stat %s:", argv[argc - 1]);
     62 		if (!S_ISDIR(st.st_mode))
     63 			eprintf("%s: not a directory\n", argv[argc - 1]);
     64 	}
     65 	enmasse(argc, argv, mv);
     66 
     67 	return mv_status;
     68 }