xref: /csrg-svn/usr.bin/tcopy/tcopy.c (revision 24973)
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