1: /* 2: * Copyright (c) 1980 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #if defined(LIBC_SCCS) && !defined(lint) 8: static char sccsid[] = "@(#)nlist.c 5.2 (Berkeley) 3/9/86"; 9: #endif LIBC_SCCS and not lint 10: 11: #include <sys/types.h> 12: #include <a.out.h> 13: #include <stdio.h> 14: 15: /* 16: * nlist - retreive attributes from name list (string table version) 17: */ 18: nlist(name, list) 19: char *name; 20: struct nlist *list; 21: { 22: register struct nlist *p, *q; 23: register char *s1, *s2; 24: register n, m; 25: int maxlen, nreq; 26: FILE *f; 27: FILE *sf; 28: off_t sa; /* symbol address */ 29: off_t ss; /* start of strings */ 30: struct exec buf; 31: struct nlist space[BUFSIZ/sizeof (struct nlist)]; 32: 33: maxlen = 0; 34: for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) { 35: q->n_type = 0; 36: q->n_value = 0; 37: q->n_desc = 0; 38: q->n_other = 0; 39: n = strlen(q->n_un.n_name); 40: if (n > maxlen) 41: maxlen = n; 42: } 43: f = fopen(name, "r"); 44: if (f == NULL) 45: return (-1); 46: fread((char *)&buf, sizeof buf, 1, f); 47: if (N_BADMAG(buf)) { 48: fclose(f); 49: return (-1); 50: } 51: sf = fopen(name, "r"); 52: if (sf == NULL) { 53: /* ??? */ 54: fclose(f); 55: return(-1); 56: } 57: sa = N_SYMOFF(buf); 58: ss = sa + buf.a_syms; 59: n = buf.a_syms; 60: fseek(f, sa, 0); 61: while (n) { 62: m = sizeof (space); 63: if (n < m) 64: m = n; 65: if (fread((char *)space, m, 1, f) != 1) 66: break; 67: n -= m; 68: for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) { 69: char nambuf[BUFSIZ]; 70: 71: if (q->n_un.n_strx == 0 || q->n_type & N_STAB) 72: continue; 73: fseek(sf, ss+q->n_un.n_strx, 0); 74: fread(nambuf, maxlen+1, 1, sf); 75: for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) { 76: s1 = p->n_un.n_name; 77: s2 = nambuf; 78: while (*s1) { 79: if (*s1++ != *s2++) 80: goto cont; 81: } 82: if (*s2) 83: goto cont; 84: p->n_value = q->n_value; 85: p->n_type = q->n_type; 86: p->n_desc = q->n_desc; 87: p->n_other = q->n_other; 88: if (--nreq == 0) 89: goto alldone; 90: break; 91: cont: ; 92: } 93: } 94: } 95: alldone: 96: fclose(f); 97: fclose(sf); 98: return (nreq); 99: }