Annotation of 3BSD/cmd/symorder.c, revision 1.1

1.1     ! root        1: /* symorder orderlist symbolfile
        !             2:  *  orderlist is a file containing symbols to be found in symbolfile,
        !             3:  *      1 symbol per line.
        !             4:  *  symbolfile is updated in place to put the requested symbols first
        !             5:  *      in the symbol table, in the order specified.  This is done
        !             6:  *      by swapping the old symbols in the required spots with the
        !             7:  *      new ones.  If all of the order symbols are not found, an
        !             8:  *      error is generated.
        !             9:  *
        !            10:  *  Modelled after nlist.c the nlist subroutine, which has been
        !            11:  *      modified to succeed as soon as all sought symbols are found.
        !            12:  *
        !            13:  *  This program was specifically designed to cut down on the read
        !            14:  *      overhead of systat(ss) when getting symbols from /unix.
        !            15:  */
        !            16: 
        !            17: #include <stdio.h>
        !            18: #include <a.out.h>
        !            19: int a_magic[] = {A_MAGIC1, A_MAGIC2, A_MAGIC3, A_MAGIC4, 0};
        !            20: #define SPACE 100
        !            21: 
        !            22: main(argc, argv)
        !            23: char *argv[];
        !            24: {
        !            25:        register struct nlist *p, *q;
        !            26:        register FILE *f;
        !            27:        register int sa, na, i, j;
        !            28:        int nsym = 0, symfound = 0, n, o;
        !            29:        struct nlist nl1, nl2;
        !            30:        char buf[20];
        !            31:        struct nlist order[SPACE];
        !            32:        struct exec exec;
        !            33: 
        !            34:        if(argc != 3) {
        !            35:                fprintf(stderr, "Usage: symorder orderlist file\n");
        !            36:                exit(1);
        !            37:        }
        !            38:        if((f = fopen(argv[1], "r")) == NULL) {
        !            39:                fprintf(stderr, "Can't open "); perror(argv[1]);
        !            40:                exit(1);
        !            41:        }
        !            42:        for(p = order; fgets(buf, sizeof buf, f) != NULL; p++, nsym++)
        !            43:                for(i = 0; i < 8 && buf[i] != '\n'; i++)
        !            44:                        p->n_name[i] = buf[i];
        !            45:        fclose(f);
        !            46: /***    for(i = 0; i < nsym; i++)                       ***/
        !            47: /***            printf("\"%.8s\"\n", order[i].n_name);  ***/
        !            48: /***    printf("--------\n");                           ***/
        !            49:        if((f = fopen(argv[2], "r")) == NULL) {
        !            50:                fprintf(stderr, "Can't open "); perror(argv[2]);
        !            51:                exit(1);
        !            52:        }
        !            53:        if((o = open(argv[2], 1)) < 0) {
        !            54:                fprintf(stderr, "Can't update "); perror(argv[2]);
        !            55:                exit(1);
        !            56:        }
        !            57:        if((fread(&exec, sizeof exec, 1, f)) != 1) {
        !            58:                fprintf(stderr, "Can't read "); perror(argv[2]);
        !            59:                exit(1);
        !            60:        }
        !            61:        for(i=0; a_magic[i]; i++)
        !            62:                if(a_magic[i] == exec.a_magic) break;
        !            63:        if(a_magic[i] == 0){
        !            64:                fprintf(stderr, "Bad Header on %s\n", argv[2]);
        !            65:                exit(1);
        !            66:        }
        !            67:        sa = exec.a_text + exec.a_data;
        !            68:        sa += exec.a_trsize + exec.a_drsize;
        !            69:        sa += sizeof exec;
        !            70:        na = sa;
        !            71:        fseek(f, sa, 0);
        !            72:        n = exec.a_syms;
        !            73: 
        !            74:        while(n && symfound < nsym) {
        !            75:                if(fread(&nl1, sizeof nl1, 1, f) != 1) {
        !            76:                        fprintf(stderr, "Short file "); perror(argv[2]);
        !            77:                        exit(1);
        !            78:                }
        !            79: /***    printf("\"%.8s\"\n", nl1.n_name);       ***/
        !            80:                na += sizeof nl1;
        !            81:                n -= sizeof nl1;
        !            82: /***    printf("Trying ");                      ***/
        !            83:                for(j = 0; j < nsym; j++) {
        !            84: /***    printf("%s ", order[j].n_name);         ***/
        !            85:                        for(i = 0; i < 8; i++)
        !            86:                                if(nl1.n_name[i] != order[j].n_name[i])
        !            87:                                        goto cont;
        !            88: /***    printf("Found: %.8s\n", nl1.n_name);    ***/
        !            89:                        if (order[j].n_value)
        !            90:                                goto cont;
        !            91:                        order[j].n_value = 1;
        !            92:                        fseek(f, (i = (sa+(j * sizeof nl1))), 0);
        !            93:                        if(fread(&nl2, sizeof nl2, 1, f) != 1)
        !            94:                                printf("Read err on 2nd sym\n");
        !            95:                        lseek(o, i, 0);
        !            96:                        if(write(o, &nl1, sizeof nl1) == -1)
        !            97:                                perror("write1");
        !            98:                        lseek(o, na-sizeof nl1, 0);
        !            99:                        if(write(o, &nl2, sizeof nl2) == -1)
        !           100:                                perror("write2");
        !           101:                        fseek(f, 0, 0);
        !           102:                        fseek(f, na, 0);
        !           103:                        symfound++;
        !           104:                        break;
        !           105:        cont:           ;
        !           106: 
        !           107:                }
        !           108: /***    printf("\n");                           ***/
        !           109:        }
        !           110:        if(symfound < nsym) {
        !           111:                fprintf(stderr, "%d Syms not found:\n", nsym - symfound);
        !           112:                for (i = 0; i < nsym; i++) {
        !           113:                        if (order[i].n_value == 0)
        !           114:                                printf("%.8s\n", order[i].n_name);
        !           115:                }
        !           116:        }
        !           117: }

unix.superglobalmegacorp.com

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