Annotation of 41BSD/cmd/arcv.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "@(#)arcv.c 4.1 10/1/80";
                      2: /*
                      3:  * arcv - convert old to new archive format
                      4:  */
                      5: 
                      6: #include <signal.h>
                      7: #include <ar.h>
                      8: #define        OARMAG  0177545
                      9: struct oar_hdr {
                     10:        char    oar_name[14];
                     11:        long    oar_date;
                     12:        char    oar_uid;
                     13:        char    oar_gid;
                     14:        int     oar_mode;
                     15:        long    oar_size;
                     16: };
                     17: 
                     18: struct ar_hdr nh;
                     19: struct oar_hdr oh;
                     20: char   *tmp;
                     21: char   *mktemp();
                     22: int    f;
                     23: char   buf[512];
                     24: int    tf;
                     25: main(argc, argv)
                     26: char *argv[];
                     27: {
                     28:        register i;
                     29: 
                     30:        if (argc>1 && strcmp(argv[1], "-t")==0) {
                     31:                tmp = mktemp("/usr/tmp/arcXXXXXX");
                     32:                argc--;
                     33:                argv++;
                     34:        } else
                     35:                tmp = mktemp("/tmp/arcXXXXXX");
                     36:        for(i=1; i<4; i++)
                     37:                signal(i, SIG_IGN);
                     38:        for(i=1; i<argc; i++) {
                     39:                if (argc>1)
                     40:                        printf("%s:\n", argv[i]);
                     41:                conv(argv[i]);
                     42:        }
                     43:        unlink(tmp);
                     44:        return(0);
                     45: }
                     46: 
                     47: conv(fil)
                     48: char *fil;
                     49: {
                     50:        int oldmagic;
                     51:        long n;
                     52:        unsigned i;
                     53: 
                     54:        f = open(fil, 2);
                     55:        if(f < 0) {
                     56:                printf("arcv: cannot open %s\n", fil);
                     57:                return;
                     58:        }
                     59:        close(creat(tmp, 0600));
                     60:        tf = open(tmp, 2);
                     61:        if(tf < 0) {
                     62:                printf("arcv: cannot open temp\n");
                     63:                close(f);
                     64:                return;
                     65:        }
                     66:        oldmagic = 0;
                     67:        read(f, (char *)&oldmagic, sizeof(oldmagic));
                     68:        if(oldmagic != 0177545) {
                     69:                printf("arcv: %s not old archive format\n", fil);
                     70:                close(tf);
                     71:                close(f);
                     72:                return;
                     73:        }
                     74:        chkwrite(tf, ARMAG, SARMAG);
                     75: loop:
                     76:        i = read(f, (char *)&oh, sizeof(oh));
                     77:        if(i != sizeof(oh))
                     78:                goto out;
                     79: 
                     80:        sprintf(buf, "%-16.14s%-12ld%-6u%-6u%-8o%-10ld%-2s",
                     81:           oh.oar_name,
                     82:           oh.oar_date,
                     83:           oh.oar_uid,
                     84:           oh.oar_gid,
                     85:           (unsigned short)oh.oar_mode,
                     86:           oh.oar_size,
                     87:           ARFMAG);
                     88:        strncpy((char *)&nh, buf, sizeof(nh));
                     89:        n = oh.oar_size;
                     90:        chkwrite(tf, (char *)&nh, sizeof(nh));
                     91:        while(n > 0) {
                     92:                i = 512;
                     93:                if (n<i)
                     94:                        i = n;
                     95:                read(f, buf, i&01? i+1:i);
                     96:                if (i&01) {
                     97:                        buf[i] = '\n';
                     98:                        i++;
                     99:                }
                    100:                chkwrite(tf, buf, i);
                    101:                n -= i;
                    102:        }
                    103:        goto loop;
                    104: out:
                    105:        lseek(f, 0L, 0);
                    106:        lseek(tf, 0L, 0);
                    107:        while((i=read(tf, buf, 512)) > 0)
                    108:                chkwrite(f, buf, i);
                    109:        close(f);
                    110:        close(tf);
                    111: }
                    112: 
                    113: chkwrite(f, b, n)
                    114: char *b;
                    115: {
                    116:        if (write(f, b, n) != n) {
                    117:                printf("arcv: write error\n");
                    118:                unlink(tmp);
                    119:                exit(1);
                    120:        }
                    121: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.