home *** CD-ROM | disk | FTP | other *** search
/ Education Sampler 1992 [NeXTSTEP] / Education_1992_Sampler.iso / SoundAndMusic / cmix / tape.backup / nsfbackup.c < prev    next >
C/C++ Source or Header  |  1991-12-16  |  8KB  |  303 lines

  1. /* Program to backup one or more soundfiles onto a magtape */
  2. /* confusion about skipfile, tapefile, now that label is there */
  3. /* do I want to specify the file to start with, or the files to skip ? */
  4.  
  5. /* lists as file 1 the first soundfile (i.e. doesn't count catalog) -- BGG
  6.    problem with rewriting part of the tape on Sun SCSI drives, can only
  7.    append files to the tape or rewrite the entire tape -- BGG */
  8. #include "../H/sfheader.h"
  9. #include <stdio.h>
  10. #include <strings.h>
  11. #include <sys/file.h>
  12. #include <sys/types.h>
  13. #include <sys/time.h>
  14. #include <sys/mtio.h>
  15. #include <sys/ioctl.h>
  16. #include <sys/stat.h>
  17. #include <signal.h>
  18. #include <errno.h>
  19. #include <pwd.h>
  20. #include "nlabel.h"
  21. #define  BUFSIZE 65536
  22.  
  23. char tapename[16] = NEW_TAPE_DEVICE;
  24. char *usefile;
  25.  
  26.     char buffer[BUFSIZE];
  27.  
  28. main(argc,argv)
  29.  
  30. int argc;
  31. char *argv[];
  32.  
  33. {
  34.     SFHEADER sfh1;
  35.     struct stat sfst1;
  36.     struct mtget mtget ;
  37.     struct mtop mtop ;
  38.     struct passwd *pwst,*getpwuid();
  39.     struct label label;
  40.  
  41.     char *cp,*sfin,*getsfcode();
  42. /*    char buffer[BUFSIZE]; */
  43.     int grandtotal,totalbytes,allbytes,allt,i,j,result,inbytes,iii;
  44.     int sf1,tapeunit,tapefile,skipfile,tapenumber,firsttime;
  45.     float duration;
  46.  
  47.     char *catname,catholder[128],*chbptr,charbuff[500];
  48.     char *tmpname,tmpholder[14];
  49.     char *getenv(),*ctime();
  50.     FILE *fdcat,*fdtmp;
  51.     struct tm *tmm,*localtime();
  52.  
  53.     if(argc == 1) { 
  54. usage:    printf("Usage: -l [tapenumber] -s [number tape files to skip first] -f [device to use] sf1 .... sfn\nDefaults: skip over label only, use /dev/rsmt0\n");
  55.         exit(1);
  56.     }
  57.  
  58.     chbptr = charbuff;
  59.     chbptr = strcpy(chbptr,"test -d ");
  60.     chbptr = strcat(chbptr,getenv("HOME"));
  61.     chbptr = strcat(chbptr,"/catalogs");
  62.     if (system(chbptr) != 0) {
  63.         fprintf(stderr,
  64.     "\n\nShame on you! You need a directory called 'catalogs' in\n");
  65.         fprintf(stderr,
  66.     "your home directory to run this program! Sorry.....\n\n\n");
  67.         exit(-3);
  68.         }
  69.  
  70.     catname = catholder;
  71.     tmpname = tmpholder;
  72.     tmpname = getenv("HOME");
  73.     catname = strcpy(catname,tmpname);
  74.     catname = strcat(catname,"/catalogs/");
  75.     tmpname = strcpy(tmpname,"/tmp/");
  76.  
  77.     tapenumber = 0;
  78.     usefile = tapename;
  79.     grandtotal = skipfile = allbytes = 0;
  80.     tapefile = 0;
  81.     firsttime = 1;
  82.     system("date");
  83.  
  84.     while((*++argv)[0] == '-') {
  85.         argc -= 2; /* Take away two args */
  86.         for(cp = argv[0]+1; *cp; cp++) {
  87.             switch(*cp) { /* Grap options */
  88.             case 'f': 
  89.                 usefile = *++argv;
  90.                 break;
  91.             case 's':
  92.                 tapefile = atoi(*++argv);
  93.                 /* now specifies files to skip -1 since 
  94.                    label is always read */
  95.                 skipfile = tapefile ? 1 : 0;
  96.                 break;
  97.             case 'l':
  98.                 tapenumber = atoi(*++argv);
  99.                 catname = strcat(catname,*argv);
  100.                 catname = strcat(catname,".catlg");
  101.                 tmpname = strcat(tmpname,*argv);
  102.                 break;
  103.             default :
  104.                 printf("unknown option\n");
  105.                 goto usage;
  106.             }
  107.         }
  108.     }
  109.     if(!tapenumber) {
  110.         printf("You didn't specify a tape number with -l flag\n");
  111.         exit(-1);
  112.     }
  113.  
  114.     if((tapeunit = open(usefile,2)) < 0) {
  115.         printf("trouble opening tape unit\n");
  116.         exit(tapeunit);
  117.     }
  118.     if(read(tapeunit,&label,SIZEOFLABEL) != SIZEOFLABEL) {
  119.         printf("Can't seem to read the label on this tape\n");
  120.         exit(tapeunit);
  121.     }
  122.  
  123.     if(label.tapenumber != tapenumber) {
  124.         printf
  125.         ("this is tape number %d, you are asking for tape number %d\n"
  126.         ,label.tapenumber,tapenumber);
  127.         exit(tapeunit);
  128.     }
  129.  
  130.     if(getuid() != 0) {  /* allow root access */
  131.         if(label.owner_uid != getuid()) {
  132.             printf("This tape doesn't belong to you!\n");
  133.             exit(tapeunit);
  134.         }
  135.     }
  136.  
  137.     mtop.mt_op = MTFSF;
  138.     mtop.mt_count = 1;
  139.     if((ioctl(tapeunit,MTIOCTOP,&mtop)) == -1) {
  140.         printf("error repositioning tape past label eof\n");
  141.         exit(-2);
  142.     }
  143.  
  144.     printf("Comment on tape %d: %s\n",label.tapenumber,label.comment);
  145.  
  146.     if ((fdtmp = fopen(tmpname,"w")) == NULL) {
  147.         fprintf(stderr,"uh-oh, can't make the temp catalog!\n");
  148.         exit(-3);
  149.         }
  150.  
  151.     pwst = getpwuid(label.owner_uid);
  152.     fprintf(fdtmp,
  153.     "TAPE NUMBER: %d\t\tOwner: %s\n",label.tapenumber,pwst->pw_name);
  154.     fprintf(fdtmp,
  155. "Initialization date: %sComment: %s\n\n",ctime(&label.date),label.comment);
  156.  
  157.     fputs("file# dur\t chans class   nbytes\t  creation date     name\n",fdtmp);
  158.  
  159.     for(i=0; i<argc-1; i++) {
  160.         sfin = argv[i];
  161.         printf("-------------------------------------------------\n");
  162.         printf(":::::::::::::Backup file %s\n",sfin);
  163.         readopensf(sfin,sf1,sfh1,sfst1,"sfbackup",result);
  164.         if(result < 0) {
  165.             close(sf1);
  166.             fprintf(stderr,
  167.             "Cannot read soundfile %s!\n",sfin);
  168.             exit(-3);
  169.         }
  170.         totalbytes = 0;
  171.  
  172.         printsf(&sfh1);
  173.  
  174.         if(skipfile) {
  175.             mtop.mt_op = MTFSF;
  176.             mtop.mt_count = tapefile;
  177.             if((ioctl(tapeunit,MTIOCTOP,&mtop)) == -1) {
  178.                 printf("error forward spacing tape\n");
  179.                 exit(-2);
  180.             }
  181.             if ((fdcat = fopen(catname,"r")) != NULL) {
  182.                 for (j = 0; j < 5; j++) /* get past old hdr */
  183.                     fgets(chbptr,500,fdcat); 
  184.                 for (j = 0; j < tapefile; j++) {
  185.                     fgets(chbptr,128,fdcat);
  186.                     sscanf(chbptr, 
  187.                         "%*d %*f %*d %*d %d",&allt);
  188.                     allbytes += allt;
  189.                     fputs(chbptr,fdtmp);
  190.                     }
  191.                 fclose(fdcat);
  192.                 }
  193.             else {
  194.                 fprintf(stderr,
  195.                     "Can't open the old catalog!\n");
  196.                 exit(-3);
  197.                 }
  198.         }
  199.         skipfile = 0;
  200.  
  201.         if(lseek(sf1,0,0) < 0) {
  202.             printf("bad lseek on soundfile\n");
  203.             exit(-1);
  204.         }
  205.  
  206.         if (firsttime) { /* position the drive for subsquent writes */
  207.             mtop.mt_op = MTBSF;
  208.             mtop.mt_count = 1;
  209.             if((ioctl(tapeunit,MTIOCTOP,&mtop)) == -1) {
  210.                 printf("error in pre-write shuffle (BSF)\n");
  211.                 exit(-2);
  212.                 }
  213.  
  214.             mtop.mt_op = MTWEOF;
  215.             mtop.mt_count = 1;
  216.             if((ioctl(tapeunit,MTIOCTOP,&mtop)) == -1) {
  217.                 printf("error in pre-write shuffle (WEOF)\n");
  218.                 exit(-2);
  219.                 }
  220.             firsttime = 0;
  221.             }
  222.  
  223.  
  224.         while(1) {
  225.             if((inbytes = read(sf1,(char *)buffer,BUFSIZE)) <= 0) {
  226.                 printf("reached eof on input\n");
  227.                 close(sf1);
  228.                 break;
  229.             }
  230.             if(inbytes < 65536) {
  231.                 for (iii = inbytes; iii < 65536; iii++) 
  232.                     buffer[iii] = 0x00;
  233.                 inbytes = 65536;
  234.                 }
  235.             if(write(tapeunit,(char *)buffer,inbytes) != inbytes) {
  236.                 printf("Bad write on tape file\n");
  237.                 close(sf1);
  238.                 closetape(tapeunit);
  239.                 exit(0);
  240.             }
  241.             totalbytes += inbytes;
  242.         }
  243.  
  244.         duration = 
  245.             (float)totalbytes/(float)sfclass(&sfh1)/
  246.                 (float)sfchans(&sfh1)/sfsrate(&sfh1);
  247.         tapefile++;
  248.         printf("Bytes dumped = %d, duration = %f, tapefile = %d\n",
  249.                 totalbytes,duration,tapefile+1);
  250.  
  251.         tmm = localtime(&sfst1.st_mtime);
  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)+1,tmm->tm_mday,tmm->tm_year,sfin);
  254.  
  255.         grandtotal += totalbytes;
  256.         fflush(stdout);
  257.         close(sf1);
  258.         closetape(tapeunit);
  259.  
  260.         if (i < argc-2) {
  261.             fclose(fdtmp);
  262.             chbptr = strcpy(chbptr,"cp ");
  263.             chbptr = strcat(chbptr,tmpname);
  264.             chbptr = strcat(chbptr," ");
  265.             chbptr = strcat(chbptr,catname);
  266.             system(chbptr);
  267.             if ((fdtmp = fopen(tmpname,"a")) == NULL) {
  268.                 fprintf(stderr,"Can't reopen tmp catalog!\n");
  269.                 exit(-3);
  270.                 }
  271.             }
  272.     }
  273.  
  274.     fprintf(fdtmp,
  275.         "Total bytes used on this tape: %d\n",allbytes+grandtotal);
  276.     fclose(fdtmp);
  277.     chbptr = strcpy(chbptr,"cp ");
  278.     chbptr = strcat(chbptr,tmpname);
  279.     chbptr = strcat(chbptr," ");
  280.     chbptr = strcat(chbptr,catname);
  281.     system(chbptr);
  282.  
  283.     closetape(tapeunit); /* for 2 EOFS for tapescans */
  284.     close(tapeunit); /* I believe that there will now be three eofs */
  285.             /* not true on the SCSI drive -- BGG */
  286.     printf("Total bytes dumped this run = %d\n",grandtotal);
  287. }
  288.  
  289. closetape(unit)
  290. {
  291.     struct mtop mtop ;
  292.     /* write two eofs and backspace inbetween them.
  293.        this will allow /dev/rmt0 to be used, which will
  294.        automatically rewind on close */
  295.  
  296.     mtop.mt_op = MTWEOF;
  297.     mtop.mt_count = 1;
  298.     if((ioctl(unit,MTIOCTOP,&mtop)) == -1) {
  299.         printf("error writing eofs\n");
  300.         exit(-2);
  301.     }
  302. }
  303.