Commit | Line | Data |
---|---|---|
78e0b1de | 1 | /* @(#)nlist.c 4.7 (Berkeley) %G% */ |
329a2d40 | 2 | |
8fb9f90e | 3 | #include <sys/types.h> |
8fb9f90e BJ |
4 | #include <a.out.h> |
5 | #include <stdio.h> | |
6 | ||
7 | /* | |
8 | * nlist - retreive attributes from name list (string table version) | |
9 | */ | |
10 | nlist(name, list) | |
11 | char *name; | |
12 | struct nlist *list; | |
13 | { | |
14 | register struct nlist *p, *q; | |
329a2d40 RC |
15 | register char *s1, *s2; |
16 | register n, m; | |
17 | int maxlen, nreq; | |
8fb9f90e | 18 | FILE *f; |
329a2d40 | 19 | FILE *sf; |
8fb9f90e BJ |
20 | off_t sa; /* symbol address */ |
21 | off_t ss; /* start of strings */ | |
22 | struct exec buf; | |
23 | struct nlist space[BUFSIZ/sizeof (struct nlist)]; | |
8fb9f90e BJ |
24 | |
25 | maxlen = 0; | |
26 | for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) { | |
27 | q->n_type = 0; | |
28 | q->n_value = 0; | |
29 | q->n_desc = 0; | |
30 | q->n_other = 0; | |
329a2d40 RC |
31 | n = strlen(q->n_un.n_name); |
32 | if (n > maxlen) | |
33 | maxlen = n; | |
8fb9f90e BJ |
34 | } |
35 | f = fopen(name, "r"); | |
36 | if (f == NULL) | |
78e0b1de | 37 | return (-1); |
8fb9f90e BJ |
38 | fread((char *)&buf, sizeof buf, 1, f); |
39 | if (N_BADMAG(buf)) { | |
8623fcd2 | 40 | fclose(f); |
8fb9f90e BJ |
41 | return (-1); |
42 | } | |
329a2d40 RC |
43 | sf = fopen(name, "r"); |
44 | if (sf == NULL) { | |
45 | /* ??? */ | |
46 | fclose(f); | |
47 | return(-1); | |
48 | } | |
8fb9f90e BJ |
49 | sa = N_SYMOFF(buf); |
50 | ss = sa + buf.a_syms; | |
51 | n = buf.a_syms; | |
329a2d40 | 52 | fseek(f, sa, 0); |
8fb9f90e BJ |
53 | while (n) { |
54 | m = sizeof (space); | |
55 | if (n < m) | |
56 | m = n; | |
329a2d40 RC |
57 | if (fread((char *)space, m, 1, f) != 1) |
58 | break; | |
8fb9f90e BJ |
59 | n -= m; |
60 | for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) { | |
61 | char nambuf[BUFSIZ]; | |
62 | ||
63 | if (q->n_un.n_strx == 0 || q->n_type & N_STAB) | |
64 | continue; | |
329a2d40 RC |
65 | fseek(sf, ss+q->n_un.n_strx, 0); |
66 | fread(nambuf, maxlen+1, 1, sf); | |
883840c4 | 67 | for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) { |
329a2d40 RC |
68 | s1 = p->n_un.n_name; |
69 | s2 = nambuf; | |
70 | while (*s1) { | |
71 | if (*s1++ != *s2++) | |
8fb9f90e | 72 | goto cont; |
8fb9f90e | 73 | } |
329a2d40 | 74 | if (*s2) |
8fb9f90e BJ |
75 | goto cont; |
76 | p->n_value = q->n_value; | |
77 | p->n_type = q->n_type; | |
78 | p->n_desc = q->n_desc; | |
79 | p->n_other = q->n_other; | |
80 | if (--nreq == 0) | |
81 | goto alldone; | |
82 | break; | |
83 | cont: ; | |
84 | } | |
85 | } | |
86 | } | |
87 | alldone: | |
88 | fclose(f); | |
329a2d40 | 89 | fclose(sf); |
303c6723 | 90 | return (nreq); |
8fb9f90e | 91 | } |