121349Sdist /* 221349Sdist * Copyright (c) 1980 Regents of the University of California. 321349Sdist * All rights reserved. The Berkeley software License Agreement 421349Sdist * specifies the terms and conditions for redistribution. 521349Sdist */ 616668Sralph 7*26572Sdonn #if defined(LIBC_SCCS) && !defined(lint) 8*26572Sdonn static char sccsid[] = "@(#)nlist.c 5.2 (Berkeley) 03/09/86"; 9*26572Sdonn #endif LIBC_SCCS and not lint 1021349Sdist 111972Swnj #include <sys/types.h> 121972Swnj #include <a.out.h> 131972Swnj #include <stdio.h> 141972Swnj 151972Swnj /* 161972Swnj * nlist - retreive attributes from name list (string table version) 171972Swnj */ 181972Swnj nlist(name, list) 191972Swnj char *name; 201972Swnj struct nlist *list; 211972Swnj { 221972Swnj register struct nlist *p, *q; 2316668Sralph register char *s1, *s2; 2416668Sralph register n, m; 2516668Sralph int maxlen, nreq; 261972Swnj FILE *f; 2716668Sralph FILE *sf; 281972Swnj off_t sa; /* symbol address */ 291972Swnj off_t ss; /* start of strings */ 301972Swnj struct exec buf; 311972Swnj struct nlist space[BUFSIZ/sizeof (struct nlist)]; 321972Swnj 331972Swnj maxlen = 0; 341972Swnj for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) { 351972Swnj q->n_type = 0; 361972Swnj q->n_value = 0; 371972Swnj q->n_desc = 0; 381972Swnj q->n_other = 0; 3916668Sralph n = strlen(q->n_un.n_name); 4016668Sralph if (n > maxlen) 4116668Sralph maxlen = n; 421972Swnj } 431972Swnj f = fopen(name, "r"); 441972Swnj if (f == NULL) 4517852Sralph return (-1); 461972Swnj fread((char *)&buf, sizeof buf, 1, f); 471972Swnj if (N_BADMAG(buf)) { 4815261Sralph fclose(f); 491972Swnj return (-1); 501972Swnj } 5116668Sralph sf = fopen(name, "r"); 5216668Sralph if (sf == NULL) { 5316668Sralph /* ??? */ 5416668Sralph fclose(f); 5516668Sralph return(-1); 5616668Sralph } 571972Swnj sa = N_SYMOFF(buf); 581972Swnj ss = sa + buf.a_syms; 591972Swnj n = buf.a_syms; 6016668Sralph fseek(f, sa, 0); 611972Swnj while (n) { 621972Swnj m = sizeof (space); 631972Swnj if (n < m) 641972Swnj m = n; 6516668Sralph if (fread((char *)space, m, 1, f) != 1) 6616668Sralph break; 671972Swnj n -= m; 681972Swnj for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) { 691972Swnj char nambuf[BUFSIZ]; 701972Swnj 711972Swnj if (q->n_un.n_strx == 0 || q->n_type & N_STAB) 721972Swnj continue; 7316668Sralph fseek(sf, ss+q->n_un.n_strx, 0); 7416668Sralph fread(nambuf, maxlen+1, 1, sf); 7510085Ssam for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) { 7616668Sralph s1 = p->n_un.n_name; 7716668Sralph s2 = nambuf; 7816668Sralph while (*s1) { 7916668Sralph if (*s1++ != *s2++) 801972Swnj goto cont; 811972Swnj } 8216668Sralph if (*s2) 831972Swnj goto cont; 841972Swnj p->n_value = q->n_value; 851972Swnj p->n_type = q->n_type; 861972Swnj p->n_desc = q->n_desc; 871972Swnj p->n_other = q->n_other; 881972Swnj if (--nreq == 0) 891972Swnj goto alldone; 901972Swnj break; 911972Swnj cont: ; 921972Swnj } 931972Swnj } 941972Swnj } 951972Swnj alldone: 961972Swnj fclose(f); 9716668Sralph fclose(sf); 9816672Sralph return (nreq); 991972Swnj } 100