|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1985 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: char copyright[] = ! 9: "@(#) Copyright (c) 1985 Regents of the University of California.\n\ ! 10: All rights reserved.\n"; ! 11: #endif not lint ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)tcopy.c 1.2 (Berkeley) 12/11/85"; ! 15: #endif not lint ! 16: ! 17: #include <stdio.h> ! 18: #include <signal.h> ! 19: #include <sys/file.h> ! 20: #include <sys/types.h> ! 21: #include <sys/ioctl.h> ! 22: #include <sys/mtio.h> ! 23: ! 24: #define SIZE (64 * 1024) ! 25: ! 26: char buff[SIZE]; ! 27: int filen=1; ! 28: long count, lcount; ! 29: int RUBOUT(); ! 30: long itol(); ! 31: int nfile; ! 32: long size, tsize; ! 33: int ln; ! 34: char *inf, *outf; ! 35: int copy; ! 36: ! 37: main(argc, argv) ! 38: char **argv; ! 39: { ! 40: register n, nw, inp, outp; ! 41: struct mtop op; ! 42: ! 43: if (argc <=1 || argc >= 3) { ! 44: fprintf(stderr, "Usage: tcopy src [dest]\n"); ! 45: exit(1); ! 46: } ! 47: inf = argv[1]; ! 48: if (argc == 3) { ! 49: outf = argv[2]; ! 50: copy = 1; ! 51: } ! 52: if ((inp=open(inf, O_RDONLY, 0666)) < 0) { ! 53: fprintf(stderr,"Can't open %s\n", inf); ! 54: exit(1); ! 55: } ! 56: if (copy) { ! 57: if ((outp=open(outf, O_WRONLY, 0666)) < 0) { ! 58: fprintf(stderr,"Can't open %s\n", outf); ! 59: exit(3); ! 60: } ! 61: } ! 62: if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! 63: (void) signal(SIGINT, RUBOUT); ! 64: ln = -2; ! 65: for (;;) { ! 66: count++; ! 67: n = read(inp, buff, SIZE); ! 68: if (n > 0) { ! 69: nw = write(outp, buff, n); ! 70: if (copy) { ! 71: if (nw != n) { ! 72: fprintf(stderr, "write (%d) != read (%d)\n", ! 73: nw, n); ! 74: fprintf(stderr, "COPY Aborted\n"); ! 75: exit(5); ! 76: } ! 77: } ! 78: size += n; ! 79: if (n != ln) { ! 80: if (ln > 0) ! 81: if (count - lcount > 1) ! 82: printf("file %d: records %ld to %ld: size %d\n", ! 83: filen, lcount, count-1, ln); ! 84: else ! 85: printf("file %d: record %ld: size %d\n", ! 86: filen, lcount, ln); ! 87: ln = n; ! 88: lcount = count; ! 89: } ! 90: } ! 91: else { ! 92: if (ln <= 0 && ln != -2) { ! 93: printf("eot\n"); ! 94: break; ! 95: } ! 96: if (ln > 0) ! 97: if (count - lcount > 1) ! 98: printf("file %d: records %ld to %ld: size %d\n", ! 99: filen, lcount, count-1, ln); ! 100: else ! 101: printf("file %d: record %ld: size %d\n", ! 102: filen, lcount, ln); ! 103: printf("file %d: eof after %ld records: %ld bytes\n", ! 104: filen, count-1, size); ! 105: if (copy) { ! 106: op.mt_op = MTWEOF; ! 107: op.mt_count = (daddr_t)1; ! 108: if(ioctl(outp, MTIOCTOP, (char *)&op) < 0) { ! 109: perror("Write EOF"); ! 110: exit(6); ! 111: } ! 112: } ! 113: filen++; ! 114: count = 0; ! 115: lcount = 0; ! 116: tsize += size; ! 117: size = 0; ! 118: if (nfile && filen > nfile) ! 119: break; ! 120: ln = n; ! 121: } ! 122: } ! 123: if (copy) ! 124: (void) close(outp); ! 125: printf("total length: %ld bytes\n", tsize); ! 126: } ! 127: ! 128: RUBOUT() ! 129: { ! 130: if (count > lcount) ! 131: --count; ! 132: if (count) ! 133: if (count > lcount) ! 134: printf("file %d: records %ld to %ld: size %d\n", ! 135: filen, lcount, count, ln); ! 136: else ! 137: printf("file %d: record %ld: size %d\n", ! 138: filen, lcount, ln); ! 139: printf("rubout at file %d: record %ld\n", filen, count); ! 140: printf("total length: %ld bytes\n", tsize+size); ! 141: exit(1); ! 142: } ! 143:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.