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