home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / arcv.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1.5 KB  |  99 lines

  1. /*
  2.  * Convert old to new archive format
  3. */
  4.  
  5. #include <signal.h>
  6. #include <ar.h>
  7.  
  8. #define    omag    0177555
  9.  
  10. struct    ar_hdr nh;
  11. struct
  12. {
  13.     char    oname[8];
  14.     long    odate;
  15.     char    ouid;
  16.     char    omode;
  17.     unsigned siz;
  18. } oh;
  19.  
  20. char    *tmp;
  21. char    *mktemp();
  22. int    f;
  23. int    tf;
  24. union {
  25.     char    buf[512];
  26.     int    magic;
  27. } b;
  28.  
  29. main(argc, argv)
  30. char *argv[];
  31. {
  32.     register i;
  33.  
  34.     tmp = mktemp("/tmp/arcXXXXX");
  35.     for(i=1; i<4; i++)
  36.         signal(i, SIG_IGN);
  37.     for(i=1; i<argc; i++)
  38.         conv(argv[i]);
  39.     unlink(tmp);
  40. }
  41.  
  42. conv(fil)
  43. char *fil;
  44. {
  45.     register unsigned i, n;
  46.  
  47.     f = open(fil, 2);
  48.     if(f < 0) {
  49.         printf("arcv: cannot open %s\n", fil);
  50.         return;
  51.     }
  52.     close(creat(tmp, 0600));
  53.     tf = open(tmp, 2);
  54.     if(tf < 0) {
  55.         printf("arcv: cannot open temp\n");
  56.         close(f);
  57.         return;
  58.     }
  59.     b.magic = 0;
  60.     read(f, (char *)&b.magic, sizeof(b.magic));
  61.     if(b.magic != omag) {
  62.         printf("arcv: %s not archive format\n", fil);
  63.         close(tf);
  64.         close(f);
  65.         return;
  66.     }
  67.     b.magic = ARMAG;
  68.     write(tf, (char *)&b.magic, sizeof(b.magic));
  69. loop:
  70.     i = read(f, (char *)&oh, sizeof(oh));
  71.     if(i != sizeof(oh))
  72.         goto out;
  73.     for(i=0; i<8; i++)
  74.         nh.ar_name[i] = oh.oname[i];
  75.     nh.ar_size = oh.siz;
  76.     nh.ar_uid = oh.ouid;
  77.     nh.ar_gid = 1;
  78.     nh.ar_mode = 0666;
  79.     nh.ar_date = oh.odate;
  80.     n = (oh.siz+1) & ~01;
  81.     write(tf, (char *)&nh, sizeof(nh));
  82.     while(n > 0) {
  83.         i = 512;
  84.         if(n < i)
  85.             i = n;
  86.         read(f, b.buf, i);
  87.         write(tf, b.buf, i);
  88.         n -= i;
  89.     }
  90.     goto loop;
  91. out:
  92.     lseek(f, 0L, 0);
  93.     lseek(tf, 0L, 0);
  94.     while((i=read(tf, b.buf, 512)) > 0)
  95.         write(f, b.buf, i);
  96.     close(f);
  97.     close(tf);
  98. }
  99.