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