cp.c (987B)
1 /* See LICENSE file for copyright and license details. */ 2 #include <sys/stat.h> 3 4 #include "fs.h" 5 #include "util.h" 6 7 static void 8 usage(void) 9 { 10 eprintf("usage: %s [-afipv] [-R [-H | -L | -P]] source ... dest\n", argv0); 11 } 12 13 int 14 main(int argc, char *argv[]) 15 { 16 struct stat st; 17 18 ARGBEGIN { 19 case 'i': 20 cp_iflag = 1; 21 break; 22 case 'a': 23 cp_follow = 'P'; 24 cp_aflag = cp_pflag = cp_rflag = 1; 25 break; 26 case 'f': 27 cp_fflag = 1; 28 break; 29 case 'p': 30 cp_pflag = 1; 31 break; 32 case 'r': 33 case 'R': 34 cp_rflag = 1; 35 break; 36 case 'v': 37 cp_vflag = 1; 38 break; 39 case 'H': 40 case 'L': 41 case 'P': 42 cp_follow = ARGC(); 43 break; 44 default: 45 usage(); 46 } ARGEND 47 48 if (argc < 2) 49 usage(); 50 51 if (!cp_follow) 52 cp_follow = cp_rflag ? 'P' : 'L'; 53 54 if (argc > 2) { 55 if (stat(argv[argc - 1], &st) < 0) 56 eprintf("stat %s:", argv[argc - 1]); 57 if (!S_ISDIR(st.st_mode)) 58 eprintf("%s: not a directory\n", argv[argc - 1]); 59 } 60 enmasse(argc, argv, cp); 61 62 return fshut(stdout, "<stdout>") || cp_status; 63 }