|
|
1.1 root 1: #include <sys/types.h>
2: #include <pagsiz.h>
3: #include <a.out.h>
4: #include <stdio.h>
5:
6: /*
7: * nlist - retreive attributes from name list (string table version)
8: */
9: nlist(name, list)
10: char *name;
11: struct nlist *list;
12: {
13: register struct nlist *p, *q;
14: register n, m, i, nreq;
15: FILE *f;
16: off_t sa; /* symbol address */
17: off_t ss; /* start of strings */
18: struct exec buf;
19: struct nlist space[BUFSIZ/sizeof (struct nlist)];
20: int maxlen;
21:
22: maxlen = 0;
23: for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) {
24: q->n_type = 0;
25: q->n_value = 0;
26: q->n_desc = 0;
27: q->n_other = 0;
28: i = strlen(q->n_un.n_name);
29: if (i > maxlen)
30: maxlen = i;
31: }
32: f = fopen(name, "r");
33: if (f == NULL)
34: return (NULL);
35: fread((char *)&buf, sizeof buf, 1, f);
36: if (N_BADMAG(buf)) {
37: close(f);
38: return (-1);
39: }
40: sa = N_SYMOFF(buf);
41: ss = sa + buf.a_syms;
42: n = buf.a_syms;
43: while (n) {
44: m = sizeof (space);
45: if (n < m)
46: m = n;
47: fseek(f, sa, 0);
48: i = fread((char *)space, m, 1, f);
49: sa += m;
50: n -= m;
51: for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
52: char nambuf[BUFSIZ];
53:
54: if (q->n_un.n_strx == 0 || q->n_type & N_STAB)
55: continue;
56: fseek(f, ss+q->n_un.n_strx, 0);
57: fread(nambuf, maxlen+1, 1, f);
58: for (p = list; p->n_un.n_name[0]; p++) {
59: i = 0;
60: while (p->n_un.n_name[i]) {
61: if (p->n_un.n_name[i] != nambuf[i])
62: goto cont;
63: i++;
64: }
65: if (nambuf[i])
66: goto cont;
67: p->n_value = q->n_value;
68: p->n_type = q->n_type;
69: p->n_desc = q->n_desc;
70: p->n_other = q->n_other;
71: if (--nreq == 0)
72: goto alldone;
73: break;
74: cont: ;
75: }
76: }
77: }
78: alldone:
79: fclose(f);
80: return (0);
81: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.