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