#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); }