32V/usr/src/cmd/mtm.c

Compare this file to the similar file:
Show the results in this format:

#include <signal.h>
/* Magnetic Tape Manipulation Program
** mtm [-sn] [-lm] [-bp] [unit]
**
** skip n files
** list m files
** buffer size pK bytes
** on unit 
**
** Assumes definition of raw magnetic tapes and the 
** mapping of 4-7 into physical drives 0-3
*/
char *buf;
int bcnt;
int filecnt;
int fd;
int unit;
char *file ;

main(argc,argv)
int argc;
char *argv[];
{
	char *p;
	int nskip, nlist, skip, list;
	int finis();

	signal(SIGINT,finis);
	signal(SIGQUIT,finis);
	unit = nskip = nlist = 0;
	skip = 0;
	list = 1;
	bcnt = 2;
	file = "/dev/rmt0 ";
	filecnt=1;
	argv++;

	while(--argc) {
		p = *argv++;
		if(*p == '-'){
			++p;
			switch(*p){

			case 's':
				skip++;
				list--;
				nskip = atoi(++p);
				break;
	
			case 'l':
				list++;
				nlist = atoi(++p);
				break;
	
			case 'b':
				bcnt = atoi(++p);
				if(bcnt < 30) break;
				printf("Requested buffer too big %dK\n",bcnt);
				exit(8);
			default:
				printf("Bad option\n");
				exit(8);
			}
		}
		else{

			if((*p < '0') || (*p> '9')){
				printf("Syntax Error\n");
				exit(8);
			}
			unit = atoi(p);
		}
	}

	bcnt = bcnt<<10;
	if (((int)(buf = sbrk(bcnt))) < 0) {
		printf("requested buffer too big - %dK\n",bcnt);
		exit(8);
	}

	unit = unit | 04;	/* force to no rewind unit number */
	sprintf(&file[8],"%d",unit);
	if((fd = open(file, 0)) < 0) {
		printf("Tape Open Error %s\n",file);
		exit(8);
	}

	if(skip)
		files(nskip,0);
	if(list){
		if(nlist == 0)
			nlist = -1;
		files(nlist,1);
		finis();
	}
}

files(nfiles,lflag)
int nfiles, lflag;
{
	int cnt, prevcnt, reccnt, eof;
	if(nfiles == 0)return;
	eof=0;
	for(; nfiles--; filecnt++){
		cnt = reccnt = prevcnt = 0;
		do{
			prevcnt = cnt;
			if((cnt = read(fd,buf,bcnt)) == 0){	/* EOF */
				if(eof){	/* double eof */
					printf("Double EOF after file %d\n",
						--filecnt);
					finis();
				}
				else{
					eof=1;
					if(lflag)
						printf("      %d Records\n",reccnt);
				}
			}
			else{
				eof = 0;
				if((++reccnt == 1) && lflag) printf("File %d:\n",filecnt);
				if(cnt<0){	/* error */
					if(lflag) printf("      Record %d - ERROR\n",reccnt);
				}
				else{	/*data read*/
					if(lflag && cnt != prevcnt)
						printf("      Record %d - %d bytes\n",
							reccnt,cnt);
				}
			}
		}while(eof==0);
	}
}


finis()
{
	unit -= 4;
	sprintf(&file[8],"%d",unit);
	close(fd);
	fd = open(file, 0);
	close(fd);
	printf("DONE\n");
	exit(0);
}