Annotation of 3BSD/cmd/symorder.c, revision 1.1.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.