home *** CD-ROM | disk | FTP | other *** search
/ Education Sampler 1992 [NeXTSTEP] / Education_1992_Sampler.iso / SoundAndMusic / cmix / tape.backup / ntapescan.c < prev    next >
C/C++ Source or Header  |  1991-11-25  |  7KB  |  286 lines

  1. /* program to print the headers on a series of soundfiles stored on a mag
  2. tape */
  3.  
  4. #include "../H/sfheader.h"
  5. #include <stdio.h>
  6. #include "nlabel.h"
  7. #include <sys/file.h>
  8. #include <sys/types.h>
  9. #include <sys/mtio.h>
  10. #include <sys/ioctl.h>
  11. #include <sys/stat.h>
  12. #include <signal.h>
  13. #include <errno.h>
  14. #include <strings.h>
  15. #include <sys/time.h>
  16. #include <pwd.h>
  17. static SFCODE    ampcode = {
  18.     SF_MAXAMP,
  19.     sizeof(SFMAXAMP) + sizeof(SFCODE)
  20. }; 
  21.  
  22. char tapename[16] = NEW_TAPE_DEVICE;
  23. char *usefile;
  24. #define BUFFER 65536
  25.  
  26.     char buffer[BUFFER];
  27.  
  28. main(argc,argv)
  29.  
  30. int argc;
  31. char *argv[];
  32.  
  33. {
  34.     SFHEADER sfh1;
  35.     SFMAXAMP sfm;
  36.     SFCODE *sizer;
  37.     SFCOMMENT sfcm;
  38.     struct stat sfst1;
  39.     struct mtget mtget ;
  40.     struct mtop mtop ;
  41.     struct label label;
  42. /*    char buffer[BUFFER]; */
  43.     extern int errno;
  44.  
  45.     char *cp,*sfin,*getsfcode();
  46.     int i,number,tapeunit,tapefile,tapenumber;
  47.     float duration;
  48.     struct passwd *pwst,*getpwuid();
  49.     int totalbytes,inbytes,allbytes,allt,j,l,restore,tint;
  50.  
  51.     char *catname,catholder[128],*chbptr,charbuff[500];
  52.     char *tmpname,tmpholder[14],*sfcname,sfcnholder[17];
  53.     char *getenv(),*ctime();
  54.     FILE *fdcat,*fdtmp;
  55.     struct tm *tmm,*localtime();
  56.  
  57.     if(argc == 1) {
  58. usage:        printf("Usage: -s [files to skip] -f [device to use] -n [number of files to scan] -l [tapenumber] -c <to create new catalog>\nDefaults: skip over label only, device=/dev/rsmt0, scan one file\n");
  59.         exit(1);
  60.     }
  61.  
  62.     catname = catholder;
  63.     tmpname = getenv("HOME");
  64.     catname = strcpy(catname,tmpname);
  65.     catname = strcat(catname,"/.catalogs/");
  66.     tmpname = tmpholder;
  67.     tmpname = strcpy(tmpname,"/tmp/");
  68.     sfcname = sfcnholder;
  69.  
  70.     usefile = tapename;
  71.     tapenumber = tapefile = restore = allbytes = 0;
  72.     system("date");
  73.     number = 1; /* default number of files to scan */
  74.     argc--;
  75.     while(argc) {
  76.         ++argv;
  77.         argc -= 2; /* Take away two args */
  78.         for(cp = argv[0]+1; *cp; cp++) {
  79.             switch(*cp) { /* Grap options */
  80.             case 'f': 
  81.                 usefile = *++argv;
  82.                 break;
  83.             case 's':
  84.                 tapefile = atoi(*++argv);
  85.                 /* skip this number of files before reading*/
  86.                 break;
  87.             case 'n':
  88.                 number = atoi(*++argv);
  89.                 break;
  90.             case 'l':
  91.                 tapenumber = atoi(*++argv);
  92.                 catname = strcat(catname,*argv);
  93.                 catname = strcat(catname,".catlg");
  94.                 tmpname = strcat(tmpname,*argv);
  95.                 break;
  96.             case 'c':
  97.                 restore = 1;
  98.                 break;
  99.             default :
  100.                 printf("Unknown option\n");
  101.                 goto usage;
  102.             }
  103.         }
  104.     }
  105.  
  106.     if (restore) {
  107.         chbptr = charbuff;
  108.         chbptr = strcpy(chbptr,"test -d ");
  109.         chbptr = strcat(chbptr,getenv("HOME"));
  110.         chbptr = strcat(chbptr,"/.catalogs");
  111.         if (system(chbptr) != 0) {
  112.             fprintf(stderr,
  113.     "\n\nShame on you! You need a directory called '.catalogs' in\n");
  114.             fprintf(stderr,
  115.         "your home directory to run this program! Sorry.....\n\n\n");
  116.             exit(-3);
  117.             }
  118.         }
  119.  
  120.     if((tapeunit = open(usefile,0)) < 0) {
  121.         printf("trouble opening tape unit\n");
  122.         exit(tapeunit);
  123.     }
  124.     if(!tapenumber) {
  125.         printf("You didn't specify a tape number with -l flag\n");
  126.         exit(-1);
  127.     }
  128.     if(read(tapeunit,&label,SIZEOFLABEL) != SIZEOFLABEL) {
  129.         printf("Can't seem to read the label on this tape\n");
  130.         exit(tapeunit);
  131.     }
  132.     if(label.tapenumber != tapenumber) {
  133.         printf
  134.         ("this is tape number %d, you are asking for tape number %d\n"
  135.         ,label.tapenumber,tapenumber);
  136.         exit(tapeunit);
  137.     }
  138.     mtop.mt_op = MTFSF;
  139.     mtop.mt_count = 1;
  140.     if((ioctl(tapeunit,MTIOCTOP,&mtop)) == -1) {
  141.         printf("error forward spacing tape past label eof\n");
  142.         exit(-2);
  143.     }
  144.     printf("Comment on tape %d: %s\n",label.tapenumber,label.comment);
  145.  
  146.     if (restore) {
  147.         if ((fdtmp = fopen(tmpname,"w")) == NULL) {
  148.             fprintf(stderr,"uh-oh, can't make the temp catalog!\n");
  149.             exit(-3);
  150.             }
  151.  
  152.         pwst = getpwuid(label.owner_uid);
  153.         fprintf(fdtmp,
  154.     "TAPE NUMBER: %d\t\tOwner: %s\n",label.tapenumber,pwst->pw_name);
  155.         fprintf(fdtmp,
  156. "Initialization date: %sComment: %s\n\n",ctime(&label.date),label.comment);
  157.  
  158.         fputs("file# dur\t chans class   nbytes\t  creation date     name\n",fdtmp);
  159.         }
  160.  
  161.     if(tapefile) {
  162.         mtop.mt_op = MTFSF;
  163.         mtop.mt_count = tapefile;
  164.         if((ioctl(tapeunit,MTIOCTOP,&mtop)) == -1) {
  165.             printf("error forward spacing tape\n");
  166.             exit(-2);
  167.         }
  168.  
  169.         if (restore) {
  170.             if ((fdcat = fopen(catname,"r")) != NULL) {
  171.                 for (j = 0; j < 5; j++) /* get past old hdr */
  172.                     fgets(chbptr,500,fdcat); 
  173.                 for (j = 0; j < tapefile; j++) {
  174.                     if (fgets(chbptr,128,fdcat) == NULL) {
  175.                         chbptr = strcpy(chbptr,"0 0 0 0 0 a MYSTERY file ???????\n");
  176.                         }
  177.                     else {
  178.                         sscanf(chbptr, 
  179.                         "%*d %*f %*d %*d %d",&allt);
  180.                         allbytes += allt;
  181.                         }
  182.                     fputs(chbptr,fdtmp);
  183.                     }
  184.                 fclose(fdcat);
  185.                 }
  186.             else {
  187.                 fprintf(stderr,
  188.                     "Can't open the old catalog!\n");
  189.                 exit(-3);
  190.                 }
  191.             }
  192.     }
  193.  
  194.     for(i=0; i<number; i++) {
  195.         if((inbytes = read(tapeunit,buffer,BUFFER)) != BUFFER) { 
  196.             printf("Bad read on tape file\n");
  197.             exit(-2);
  198.         }
  199.         bcopy(buffer,(char *)&sfh1,SIZEOF_HEADER);
  200.         tapefile++;
  201.  
  202.         totalbytes = inbytes;
  203.         while(inbytes == BUFFER) {
  204.             if ((inbytes = read(tapeunit,buffer,BUFFER)) < 0) {
  205.                 printf("Bad forward space read on tape file\n");
  206.                 exit(-2);
  207.                 }
  208.             totalbytes += inbytes;
  209.             }
  210.         allbytes += totalbytes;
  211.  
  212.         printf("--------------------------------------------------\n");
  213.         if(!ismagic(&sfh1)) {
  214.             printf("This doesn't look like a bsd soundfile\n");
  215.         }
  216.         else {
  217.             printf("--------------->File number %d\n",tapefile);
  218.             printsf(&sfh1);
  219.  
  220.             if (restore) {
  221.                 duration = 
  222.                     (float)totalbytes/(float)sfclass(&sfh1)/
  223.                     (float)sfchans(&sfh1)/sfsrate(&sfh1);
  224.  
  225.                 if ((cp = getsfcode(&sfh1,SF_MAXAMP))!=NULL) {
  226.                     bcopy(cp + sizeof(SFCODE), (char *) &sfm, sizeof(SFMAXAMP));
  227.                     if(sfmaxamptime(&sfm)) {
  228.                         tmm = localtime(&sfmaxamptime(&sfm));
  229.                         }
  230.                     else {
  231.                         tint = time(0);
  232.                         tmm = localtime(&tint);
  233.                         }
  234.                     }
  235.                 else {
  236.                     tint = time(0);
  237.                     tmm = localtime(&tint);
  238.                     }
  239.                 if ((cp=getsfcode(&sfh1,SF_COMMENT)) != NULL) {
  240.                     sizer = (SFCODE *) cp;
  241.                     bcopy(cp + sizeof(SFCODE) , (char *) &sfcm, sizer->bsize);
  242.                     sfcname = strncpy(sfcname,&sfcomm(&sfcm,0),16);
  243.                     for (l = 0; l < 17; l++) {
  244.                         if (sfcnholder[l] == '\n')
  245.                             sfcnholder[l] = '\ ';
  246.                         }
  247.                     }
  248.                 else {
  249.                     sfcname = strcpy(sfcname,"???????");
  250.                     }
  251.  
  252.             fprintf(fdtmp,
  253. "%3d   %.4f\t   %d     %d   %9d\t%02d:%02d:%02d %2d/%02d/%2d  %s\n",tapefile,duration,sfchans(&sfh1),sfclass(&sfh1),totalbytes,tmm->tm_hour,tmm->tm_min,tmm->tm_sec,tmm->tm_mon,tmm->tm_mday,tmm->tm_year,sfcname);
  254.  
  255.             if (i < number) {
  256.                 fclose(fdtmp);
  257.                 chbptr = strcpy(chbptr,"cp ");
  258.                 chbptr = strcat(chbptr,tmpname);
  259.                 chbptr = strcat(chbptr," ");
  260.                 chbptr = strcat(chbptr,catname);
  261.                 system(chbptr);
  262.                 if ((fdtmp = fopen(tmpname,"a")) == NULL) {
  263.                     fprintf(stderr,"Can't reopen tmp catalog!\n");
  264.                     exit(-3);
  265.                     }
  266.                 }
  267.             }
  268.         }
  269.  
  270.         fflush(stdout);
  271.  
  272.     }
  273.  
  274.     if (restore) {
  275.         fprintf(fdtmp,
  276.             "Total bytes used on this tape: %d\n",allbytes);
  277.         fclose(fdtmp);
  278.         chbptr = strcpy(chbptr,"mv ");
  279.         chbptr = strcat(chbptr,tmpname);
  280.         chbptr = strcat(chbptr," ");
  281.         chbptr = strcat(chbptr,catname);
  282.         system(chbptr);
  283.         }
  284.  
  285. }
  286.