1 #ifndef lint 2 static char sccsid[] = "@(#)cpmv.c 5.3 (Berkeley) 01/22/85"; 3 #endif 4 5 #include "uucp.h" 6 #include <sys/types.h> 7 #include <sys/stat.h> 8 9 /*** 10 * xcp(f1, f2) copy f1 to f2 11 * char *f1, *f2; 12 * 13 * return - 0 ok | FAIL failed 14 */ 15 16 xcp(f1, f2) 17 char *f1, *f2; 18 { 19 char buf[BUFSIZ]; 20 register int len; 21 register int fp1, fp2; 22 char *lastpart(); 23 char full[100]; 24 struct stat s; 25 26 if ((fp1 = open(subfile(f1), 0)) < 0) 27 return FAIL; 28 strcpy(full, f2); 29 if (stat(subfile(f2), &s) == 0) { 30 /* check for directory */ 31 if ((s.st_mode & S_IFMT) == S_IFDIR) { 32 strcat(full, "/"); 33 strcat(full, lastpart(f1)); 34 } 35 } 36 DEBUG(4, "full %s\n", full); 37 if ((fp2 = creat(subfile(full), 0666)) < 0) { 38 close(fp1); 39 return FAIL; 40 } 41 while((len = read(fp1, buf, BUFSIZ)) > 0) 42 if (write(fp2, buf, len) != len) { 43 len = -1; 44 break; 45 } 46 47 close(fp1); 48 close(fp2); 49 return len < 0 ? FAIL: SUCCESS; 50 } 51 52 53 /* 54 * xmv(f1, f2) move f1 to f2 55 * char * f1, *f2; 56 * 57 * return 0 ok | FAIL failed 58 */ 59 60 xmv(f1, f2) 61 register char *f1, *f2; 62 { 63 register int ret; 64 65 if (link(subfile(f1), subfile(f2)) < 0) { 66 /* copy file */ 67 ret = xcp(f1, f2); 68 if (ret == 0) 69 unlink(subfile(f1)); 70 return ret; 71 } 72 unlink(subfile(f1)); 73 return 0; 74 } 75