Annotation of 43BSDReno/lib/libc/gen/nlist.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1989 The Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that: (1) source distributions retain this entire copyright
                      7:  * notice and comment, and (2) distributions including binaries display
                      8:  * the following acknowledgement:  ``This product includes software
                      9:  * developed by the University of California, Berkeley and its contributors''
                     10:  * in the documentation or other materials provided with the distribution
                     11:  * and in all advertising materials mentioning features or use of this
                     12:  * software. Neither the name of the University nor the names of its
                     13:  * contributors may be used to endorse or promote products derived
                     14:  * from this software without specific prior written permission.
                     15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     16:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     17:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     18:  */
                     19: 
                     20: #if defined(LIBC_SCCS) && !defined(lint)
                     21: static char sccsid[] = "@(#)nlist.c    5.7 (Berkeley) 6/1/90";
                     22: #endif /* LIBC_SCCS and not lint */
                     23: 
                     24: #include <sys/types.h>
                     25: #include <sys/file.h>
                     26: #include <a.out.h>
                     27: #include <stdio.h>
                     28: #include <unistd.h>
                     29: 
                     30: typedef struct nlist NLIST;
                     31: #define        _strx   n_un.n_strx
                     32: #define        _name   n_un.n_name
                     33: #define        ISVALID(p)      (p->_name && p->_name[0])
                     34: 
                     35: nlist(name, list)
                     36:        char *name;
                     37:        NLIST *list;
                     38: {
                     39:        register NLIST *p, *s;
                     40:        struct exec ebuf;
                     41:        FILE *fstr, *fsym;
                     42:        NLIST nbuf;
                     43:        off_t strings_offset, symbol_offset, symbol_size, lseek();
                     44:        int entries, len, maxlen;
                     45:        char sbuf[256];
                     46: 
                     47:        entries = -1;
                     48: 
                     49:        if (!(fsym = fopen(name, "r")))
                     50:                return(-1);
                     51:        if (fread((char *)&ebuf, sizeof(struct exec), 1, fsym) != 1 ||
                     52:            N_BADMAG(ebuf))
                     53:                goto done1;
                     54: 
                     55:        symbol_offset = N_SYMOFF(ebuf);
                     56:        symbol_size = ebuf.a_syms;
                     57:        strings_offset = symbol_offset + symbol_size;
                     58:        if (fseek(fsym, symbol_offset, SEEK_SET))
                     59:                goto done1;
                     60: 
                     61:        if (!(fstr = fopen(name, "r")))
                     62:                goto done1;
                     63: 
                     64:        /*
                     65:         * clean out any left-over information for all valid entries.
                     66:         * Type and value defined to be 0 if not found; historical
                     67:         * versions cleared other and desc as well.  Also figure out
                     68:         * the largest string length so don't read any more of the
                     69:         * string table than we have to.
                     70:         */
                     71:        for (p = list, entries = maxlen = 0; ISVALID(p); ++p, ++entries) {
                     72:                p->n_type = 0;
                     73:                p->n_other = 0;
                     74:                p->n_desc = 0;
                     75:                p->n_value = 0;
                     76:                if ((len = strlen(p->_name)) > maxlen)
                     77:                        maxlen = len;
                     78:        }
                     79:        if (++maxlen > sizeof(sbuf)) {          /* for the NULL */
                     80:                (void)fprintf(stderr, "nlist: symbol too large.\n");
                     81:                entries = -1;
                     82:                goto done2;
                     83:        }
                     84: 
                     85:        for (s = &nbuf; symbol_size; symbol_size -= sizeof(NLIST)) {
                     86:                if (fread((char *)s, sizeof(NLIST), 1, fsym) != 1)
                     87:                        goto done2;
                     88:                if (!s->_strx || s->n_type&N_STAB)
                     89:                        continue;
                     90:                if (fseek(fstr, strings_offset + s->_strx, SEEK_SET))
                     91:                        goto done2;
                     92:                (void)fread(sbuf, sizeof(sbuf[0]), maxlen, fstr);
                     93:                for (p = list; ISVALID(p); p++)
                     94:                        if (!strcmp(p->_name, sbuf)) {
                     95:                                p->n_value = s->n_value;
                     96:                                p->n_type = s->n_type;
                     97:                                p->n_desc = s->n_desc;
                     98:                                p->n_other = s->n_other;
                     99:                                if (!--entries)
                    100:                                        goto done2;
                    101:                        }
                    102:        }
                    103: done2: (void)fclose(fstr);
                    104: done1: (void)fclose(fsym);
                    105:        return(entries);
                    106: }

unix.superglobalmegacorp.com

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