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