|
|
1.1 ! root 1: static char *sccsid = "@(#)cp.c 4.1 (Berkeley) 10/1/80"; ! 2: /* ! 3: * cp oldfile newfile ! 4: */ ! 5: ! 6: #define BSIZE 1024 ! 7: #include <stdio.h> ! 8: #include <sys/types.h> ! 9: #include <sys/stat.h> ! 10: struct stat stbuf1, stbuf2; ! 11: char iobuf[BSIZE]; ! 12: int iflag = 0; /* interactive flag. If this flag is set, ! 13: * the user is queried before files are ! 14: * destroyed by cp. ! 15: */ ! 16: ! 17: main(argc, argv) ! 18: char *argv[]; ! 19: { ! 20: register i, r; ! 21: ! 22: /* get the flag(s) */ ! 23: ! 24: if (argc < 2) ! 25: goto usage; ! 26: if (*argv[1] == '-') { ! 27: argc--; ! 28: while (*++argv[1] != '\0') ! 29: switch (*argv[1]) { ! 30: ! 31: /* interactive mode */ ! 32: case 'i': ! 33: iflag++; ! 34: break; ! 35: ! 36: /* don't live with bad options */ ! 37: default: ! 38: goto usage; ! 39: } ! 40: argv++; ! 41: } ! 42: if (argc < 3) ! 43: goto usage; ! 44: if (argc > 3) { ! 45: if (stat(argv[argc-1], &stbuf2) < 0) ! 46: goto usage; ! 47: if ((stbuf2.st_mode&S_IFMT) != S_IFDIR) ! 48: goto usage; ! 49: } ! 50: r = 0; ! 51: for(i=1; i<argc-1;i++) ! 52: r |= copy(argv[i], argv[argc-1]); ! 53: exit(r); ! 54: usage: ! 55: fprintf(stderr, "Usage: cp: f1 f2; or cp f1 ... fn d2\n"); ! 56: exit(1); ! 57: } ! 58: ! 59: copy(from, to) ! 60: char *from, *to; ! 61: { ! 62: int fold, fnew, n; ! 63: register char *p1, *p2, *bp; ! 64: int mode; ! 65: char c,i; ! 66: if ((fold = open(from, 0)) < 0) { ! 67: fprintf(stderr, "cp: cannot open %s\n", from); ! 68: return(1); ! 69: } ! 70: fstat(fold, &stbuf1); ! 71: mode = stbuf1.st_mode; ! 72: /* is target a directory? */ ! 73: if (stat(to, &stbuf2) >=0 && ! 74: (stbuf2.st_mode&S_IFMT) == S_IFDIR) { ! 75: p1 = from; ! 76: p2 = to; ! 77: bp = iobuf; ! 78: while(*bp++ = *p2++) ! 79: ; ! 80: bp[-1] = '/'; ! 81: p2 = bp; ! 82: while(*bp = *p1++) ! 83: if (*bp++ == '/') ! 84: bp = p2; ! 85: to = iobuf; ! 86: } ! 87: if (stat(to, &stbuf2) >= 0) { ! 88: if (stbuf1.st_dev == stbuf2.st_dev && ! 89: stbuf1.st_ino == stbuf2.st_ino) { ! 90: fprintf(stderr, "cp: cannot copy file to itself.\n"); ! 91: return(1); ! 92: } else if (iflag) { ! 93: fprintf (stderr, "overwrite %s? ", to); ! 94: i = c = getchar(); ! 95: while (c != '\n' && c != EOF) ! 96: c = getchar(); ! 97: if (i != 'y') ! 98: return(1); ! 99: } ! 100: } ! 101: if ((fnew = creat(to, mode)) < 0) { ! 102: fprintf(stderr, "cp: cannot create %s\n", to); ! 103: close(fold); ! 104: return(1); ! 105: } ! 106: while(n = read(fold, iobuf, BSIZE)) { ! 107: if (n < 0) { ! 108: perror("cp: read"); ! 109: close(fold); ! 110: close(fnew); ! 111: return(1); ! 112: } else ! 113: if (write(fnew, iobuf, n) != n) { ! 114: perror("cp: write"); ! 115: close(fold); ! 116: close(fnew); ! 117: return(1); ! 118: } ! 119: } ! 120: close(fold); ! 121: close(fnew); ! 122: return(0); ! 123: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.