|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.