#include "stdio.h" /* BCKDIR .. BACKUP DIRECTORY CREATION */ int blkf; /* blkf= blocking factor */ int chan ; /* chan= tape channel number */ char buf[20][512]; /* buf= data buffer array */ int *bpt; /* bpt= pointer to buffer buf */ char tdate[20],ans[6]; main() { extern int iclose(); /* special function for tape drive */ FILE *fopen(), *fp ; /* get date and print option */ printf("ENTER TODAYS DATE (dd-mmm-yy): "); gets(tdate); printf("PRINT THE DIRECTORY ? (n,y) "); gets(ans); /* open directory file 'dk:backup.lst' */ fp=fopen("dk:backup.lst","wn"); bpt=buf[0]; blkf=30 ; if(magtpe(1)==-1) exit(0); /* fail to open tape channel */ while(magtpe(6)==0)wrtbuf(fp); /* read tape block */ fclose(fp); printf("\n\nfile > DK:BACKUP.LST contains a directory listing \n"); magtpe(2); } magtpe(fun) /* MAGNETIC TAPE HANDLER */ int fun; /* fun= function called */ { extern int ispfnw(),igetc(),lookup(),iaddr(); /* special functions */ int code, err, ddev[4], wcnt, blk[4]; int erradr; char *dev ; dev="mt0" ; ascr50(3,dev,&ddev[0]); /* define lookup pfn */ blk[0]=0; blk[1]=0; blk[2]=0; blk[3]=0; erradr=call(iaddr,1,blk); /* WHAT FUNCTION HAS BEEN CHOSEN */ if(fun==1) /* open channel */ { if((chan=call(igetc,0))==-1) { printf("TAPE CHANNEL NOT OPENED \n"); return(-1);} else { if((err=call(lookup,2,&chan,ddev))!=0) { printf("LOOKUP ERROR : %d\n",err); return(-1);} else return(0); } } else if(fun==2) /* rewind tape */ { code='\373'; if((err=call(ispfnw,2,&code,&chan))!=0) { printf("REWIND ERROR : %d\n",err); return(-1);} else return(0); } else if(fun==6) /* read tape block */ { code='\370'; wcnt=256*blkf; if((err=call(ispfnw,5,&code,&chan,&wcnt,buf[0],&erradr))>2) { printf("TAPE READ ERROR: %d %d %d\n",err,blk[0],blk[1]); return(-1); } if(err==2) { if(blk[0]==6){ blkf=(wcnt-blk[1])/256; return(0);} else { printf("HARD TAPE ERROR : %d %d \n",blk[0],blk[1]); return(-1); } } if(err==1) return(1); return(0); } } wrtbuf(fp) /* WRITE BUFFER TO CONSOL AND FILE 'BACKUP.LST' */ int *fp; { char pfn[15], mo[5], *label; /* pfn= file name on dir */ /* mo= file creation month */ /* label= label for output */ int day, yr ; /* day & year file was created */ int size, cnt, err; /* size= file size */ int long cum; /* cum= block summation */ /* cnt= internal counter */ int long lblkf ; int long blk,sub ; /* blk= file location in tape blocks */ /* sub= file location inside tape block */ label=" FILENAME SIZE LOCATION CREATION "; (long) lblkf=blkf; if(ans[0]!='n' && ans[0]!='N') { printf("\n\n\n"); printf(" BUSINESS ANALYSIS TAPE BACKUP DIRECTORY %s\n\n",tdate); printf(" BLOCKING FACTOR = %d \n\n",blkf); printf("%s%s%s\n\n",label,label,label); } cnt=0 ; err=0 ; bpt=buf[0]; while((err=sscanf(bpt,"%14s%5d%6ld%2d%3s%2d",pfn,&size,&cum,&day,mo,&yr))==6) { bpt+=16; blk=cum/lblkf ; sub=cum-(blk*lblkf); if(ans[0]!='n' && ans[0]!='N') printf(" %-14s %5d %5ld-%02ld %02d-%3s-%02d",pfn,size,blk,sub,day,mo,yr); fprintf(fp,"%-14s %-5d %05ld-%02ld %02d-%3s-%02d\n\r",pfn,size,blk,sub,day,mo,yr); cnt++; if(cnt==3) { cnt=0; if(ans[0]!='n' && ans[0]!='N')printf("\n"); } } }