124973Sbloom /* 224973Sbloom * Copyright (c) 1985 Regents of the University of California. 324973Sbloom * All rights reserved. The Berkeley software License Agreement 424973Sbloom * specifies the terms and conditions for redistribution. 524973Sbloom */ 624973Sbloom 724973Sbloom #ifndef lint 824973Sbloom char copyright[] = 924973Sbloom "@(#) Copyright (c) 1985 Regents of the University of California.\n\ 1024973Sbloom All rights reserved.\n"; 1124973Sbloom #endif not lint 1224973Sbloom 1324973Sbloom #ifndef lint 14*25590Sbloom static char sccsid[] = "@(#)tcopy.c 5.2 (Berkeley) 12/11/85"; 1524973Sbloom #endif not lint 1624973Sbloom 1724973Sbloom #include <stdio.h> 18*25590Sbloom #include <signal.h> 1924973Sbloom #include <sys/file.h> 2024973Sbloom #include <sys/types.h> 2124973Sbloom #include <sys/ioctl.h> 2224973Sbloom #include <sys/mtio.h> 2324973Sbloom 2424973Sbloom #define SIZE (64 * 1024) 2524973Sbloom 2624973Sbloom char buff[SIZE]; 2724973Sbloom int filen=1; 2824973Sbloom long count, lcount; 2924973Sbloom int RUBOUT(); 3024973Sbloom long itol(); 3124973Sbloom int nfile; 3224973Sbloom long size, tsize; 3324973Sbloom int ln; 3424973Sbloom char *inf, *outf; 35*25590Sbloom int copy; 3624973Sbloom 3724973Sbloom main(argc, argv) 3824973Sbloom char **argv; 3924973Sbloom { 4024973Sbloom register n, nw, inp, outp; 4124973Sbloom struct mtop op; 4224973Sbloom 43*25590Sbloom if (argc <=1 || argc >= 3) { 44*25590Sbloom fprintf(stderr, "Usage: tcopy src [dest]\n"); 4524973Sbloom exit(1); 4624973Sbloom } 4724973Sbloom inf = argv[1]; 48*25590Sbloom if (argc == 3) { 49*25590Sbloom outf = argv[2]; 50*25590Sbloom copy = 1; 51*25590Sbloom } 5224973Sbloom if ((inp=open(inf, O_RDONLY, 0666)) < 0) { 5324973Sbloom fprintf(stderr,"Can't open %s\n", inf); 5424973Sbloom exit(1); 5524973Sbloom } 56*25590Sbloom if (copy) { 57*25590Sbloom if ((outp=open(outf, O_WRONLY, 0666)) < 0) { 58*25590Sbloom fprintf(stderr,"Can't open %s\n", outf); 59*25590Sbloom exit(3); 60*25590Sbloom } 6124973Sbloom } 62*25590Sbloom if (signal(SIGINT, SIG_IGN) != SIG_IGN) 63*25590Sbloom (void) signal(SIGINT, RUBOUT); 6424973Sbloom ln = -2; 6524973Sbloom for (;;) { 6624973Sbloom count++; 6724973Sbloom n = read(inp, buff, SIZE); 6824973Sbloom if (n > 0) { 6924973Sbloom nw = write(outp, buff, n); 70*25590Sbloom if (copy) { 71*25590Sbloom if (nw != n) { 72*25590Sbloom fprintf(stderr, "write (%d) != read (%d)\n", 73*25590Sbloom nw, n); 74*25590Sbloom fprintf(stderr, "COPY Aborted\n"); 75*25590Sbloom exit(5); 76*25590Sbloom } 7724973Sbloom } 7824973Sbloom size += n; 7924973Sbloom if (n != ln) { 8024973Sbloom if (ln > 0) 8124973Sbloom if (count - lcount > 1) 8224973Sbloom printf("file %d: records %ld to %ld: size %d\n", 8324973Sbloom filen, lcount, count-1, ln); 8424973Sbloom else 8524973Sbloom printf("file %d: record %ld: size %d\n", 8624973Sbloom filen, lcount, ln); 8724973Sbloom ln = n; 8824973Sbloom lcount = count; 8924973Sbloom } 9024973Sbloom } 9124973Sbloom else { 9224973Sbloom if (ln <= 0 && ln != -2) { 9324973Sbloom printf("eot\n"); 9424973Sbloom break; 9524973Sbloom } 9624973Sbloom if (ln > 0) 9724973Sbloom if (count - lcount > 1) 9824973Sbloom printf("file %d: records %ld to %ld: size %d\n", 9924973Sbloom filen, lcount, count-1, ln); 10024973Sbloom else 10124973Sbloom printf("file %d: record %ld: size %d\n", 10224973Sbloom filen, lcount, ln); 10324973Sbloom printf("file %d: eof after %ld records: %ld bytes\n", 10424973Sbloom filen, count-1, size); 105*25590Sbloom if (copy) { 106*25590Sbloom op.mt_op = MTWEOF; 107*25590Sbloom op.mt_count = (daddr_t)1; 108*25590Sbloom if(ioctl(outp, MTIOCTOP, (char *)&op) < 0) { 109*25590Sbloom perror("Write EOF"); 110*25590Sbloom exit(6); 111*25590Sbloom } 11224973Sbloom } 11324973Sbloom filen++; 11424973Sbloom count = 0; 11524973Sbloom lcount = 0; 11624973Sbloom tsize += size; 11724973Sbloom size = 0; 11824973Sbloom if (nfile && filen > nfile) 11924973Sbloom break; 12024973Sbloom ln = n; 12124973Sbloom } 12224973Sbloom } 123*25590Sbloom if (copy) 124*25590Sbloom (void) close(outp); 12524973Sbloom printf("total length: %ld bytes\n", tsize); 12624973Sbloom } 12724973Sbloom 12824973Sbloom RUBOUT() 12924973Sbloom { 13024973Sbloom if (count > lcount) 13124973Sbloom --count; 13224973Sbloom if (count) 13324973Sbloom if (count > lcount) 13424973Sbloom printf("file %d: records %ld to %ld: size %d\n", 13524973Sbloom filen, lcount, count, ln); 13624973Sbloom else 13724973Sbloom printf("file %d: record %ld: size %d\n", 13824973Sbloom filen, lcount, ln); 13924973Sbloom printf("rubout at file %d: record %ld\n", filen, count); 14024973Sbloom printf("total length: %ld bytes\n", tsize+size); 14124973Sbloom exit(1); 14224973Sbloom } 14324973Sbloom 144