home *** CD-ROM | disk | FTP | other *** search
- /*
- * Convert old to new archive format
- */
-
- #include <signal.h>
- #include <ar.h>
-
- #define omag 0177555
-
- struct ar_hdr nh;
- struct
- {
- char oname[8];
- long odate;
- char ouid;
- char omode;
- unsigned siz;
- } oh;
-
- char *tmp;
- char *mktemp();
- int f;
- int tf;
- union {
- char buf[512];
- int magic;
- } b;
-
- main(argc, argv)
- char *argv[];
- {
- register i;
-
- tmp = mktemp("/tmp/arcXXXXX");
- for(i=1; i<4; i++)
- signal(i, SIG_IGN);
- for(i=1; i<argc; i++)
- conv(argv[i]);
- unlink(tmp);
- }
-
- conv(fil)
- char *fil;
- {
- register unsigned i, n;
-
- f = open(fil, 2);
- if(f < 0) {
- printf("arcv: cannot open %s\n", fil);
- return;
- }
- close(creat(tmp, 0600));
- tf = open(tmp, 2);
- if(tf < 0) {
- printf("arcv: cannot open temp\n");
- close(f);
- return;
- }
- b.magic = 0;
- read(f, (char *)&b.magic, sizeof(b.magic));
- if(b.magic != omag) {
- printf("arcv: %s not archive format\n", fil);
- close(tf);
- close(f);
- return;
- }
- b.magic = ARMAG;
- write(tf, (char *)&b.magic, sizeof(b.magic));
- loop:
- i = read(f, (char *)&oh, sizeof(oh));
- if(i != sizeof(oh))
- goto out;
- for(i=0; i<8; i++)
- nh.ar_name[i] = oh.oname[i];
- nh.ar_size = oh.siz;
- nh.ar_uid = oh.ouid;
- nh.ar_gid = 1;
- nh.ar_mode = 0666;
- nh.ar_date = oh.odate;
- n = (oh.siz+1) & ~01;
- write(tf, (char *)&nh, sizeof(nh));
- while(n > 0) {
- i = 512;
- if(n < i)
- i = n;
- read(f, b.buf, i);
- write(tf, b.buf, i);
- n -= i;
- }
- goto loop;
- out:
- lseek(f, 0L, 0);
- lseek(tf, 0L, 0);
- while((i=read(tf, b.buf, 512)) > 0)
- write(f, b.buf, i);
- close(f);
- close(tf);
- }
-