1*16672Sralph /* @(#)nlist.c 4.6 (Berkeley) 07/06/84 */ 216668Sralph 31972Swnj #include <sys/types.h> 41972Swnj #include <a.out.h> 51972Swnj #include <stdio.h> 61972Swnj 71972Swnj /* 81972Swnj * nlist - retreive attributes from name list (string table version) 91972Swnj */ 101972Swnj nlist(name, list) 111972Swnj char *name; 121972Swnj struct nlist *list; 131972Swnj { 141972Swnj register struct nlist *p, *q; 1516668Sralph register char *s1, *s2; 1616668Sralph register n, m; 1716668Sralph int maxlen, nreq; 181972Swnj FILE *f; 1916668Sralph FILE *sf; 201972Swnj off_t sa; /* symbol address */ 211972Swnj off_t ss; /* start of strings */ 221972Swnj struct exec buf; 231972Swnj struct nlist space[BUFSIZ/sizeof (struct nlist)]; 241972Swnj 251972Swnj maxlen = 0; 261972Swnj for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) { 271972Swnj q->n_type = 0; 281972Swnj q->n_value = 0; 291972Swnj q->n_desc = 0; 301972Swnj q->n_other = 0; 3116668Sralph n = strlen(q->n_un.n_name); 3216668Sralph if (n > maxlen) 3316668Sralph maxlen = n; 341972Swnj } 351972Swnj f = fopen(name, "r"); 361972Swnj if (f == NULL) 371972Swnj return (NULL); 381972Swnj fread((char *)&buf, sizeof buf, 1, f); 391972Swnj if (N_BADMAG(buf)) { 4015261Sralph fclose(f); 411972Swnj return (-1); 421972Swnj } 4316668Sralph sf = fopen(name, "r"); 4416668Sralph if (sf == NULL) { 4516668Sralph /* ??? */ 4616668Sralph fclose(f); 4716668Sralph return(-1); 4816668Sralph } 491972Swnj sa = N_SYMOFF(buf); 501972Swnj ss = sa + buf.a_syms; 511972Swnj n = buf.a_syms; 5216668Sralph fseek(f, sa, 0); 531972Swnj while (n) { 541972Swnj m = sizeof (space); 551972Swnj if (n < m) 561972Swnj m = n; 5716668Sralph if (fread((char *)space, m, 1, f) != 1) 5816668Sralph break; 591972Swnj n -= m; 601972Swnj for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) { 611972Swnj char nambuf[BUFSIZ]; 621972Swnj 631972Swnj if (q->n_un.n_strx == 0 || q->n_type & N_STAB) 641972Swnj continue; 6516668Sralph fseek(sf, ss+q->n_un.n_strx, 0); 6616668Sralph fread(nambuf, maxlen+1, 1, sf); 6710085Ssam for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) { 6816668Sralph s1 = p->n_un.n_name; 6916668Sralph s2 = nambuf; 7016668Sralph while (*s1) { 7116668Sralph if (*s1++ != *s2++) 721972Swnj goto cont; 731972Swnj } 7416668Sralph if (*s2) 751972Swnj goto cont; 761972Swnj p->n_value = q->n_value; 771972Swnj p->n_type = q->n_type; 781972Swnj p->n_desc = q->n_desc; 791972Swnj p->n_other = q->n_other; 801972Swnj if (--nreq == 0) 811972Swnj goto alldone; 821972Swnj break; 831972Swnj cont: ; 841972Swnj } 851972Swnj } 861972Swnj } 871972Swnj alldone: 881972Swnj fclose(f); 8916668Sralph fclose(sf); 90*16672Sralph return (nreq); 911972Swnj } 92