xref: /minix3/lib/libc/gen/nlist.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /* $NetBSD: nlist.c,v 1.25 2014/09/18 13:58:20 christos Exp $ */
22fe8fb19SBen Gras 
32fe8fb19SBen Gras /*
42fe8fb19SBen Gras  * Copyright (c) 1989, 1993
52fe8fb19SBen Gras  *	The Regents of the University of California.  All rights reserved.
62fe8fb19SBen Gras  *
72fe8fb19SBen Gras  * Redistribution and use in source and binary forms, with or without
82fe8fb19SBen Gras  * modification, are permitted provided that the following conditions
92fe8fb19SBen Gras  * are met:
102fe8fb19SBen Gras  * 1. Redistributions of source code must retain the above copyright
112fe8fb19SBen Gras  *    notice, this list of conditions and the following disclaimer.
122fe8fb19SBen Gras  * 2. Redistributions in binary form must reproduce the above copyright
132fe8fb19SBen Gras  *    notice, this list of conditions and the following disclaimer in the
142fe8fb19SBen Gras  *    documentation and/or other materials provided with the distribution.
152fe8fb19SBen Gras  * 3. Neither the name of the University nor the names of its contributors
162fe8fb19SBen Gras  *    may be used to endorse or promote products derived from this software
172fe8fb19SBen Gras  *    without specific prior written permission.
182fe8fb19SBen Gras  *
192fe8fb19SBen Gras  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
202fe8fb19SBen Gras  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
212fe8fb19SBen Gras  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
222fe8fb19SBen Gras  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
232fe8fb19SBen Gras  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
242fe8fb19SBen Gras  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
252fe8fb19SBen Gras  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
262fe8fb19SBen Gras  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
272fe8fb19SBen Gras  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
282fe8fb19SBen Gras  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
292fe8fb19SBen Gras  * SUCH DAMAGE.
302fe8fb19SBen Gras  */
312fe8fb19SBen Gras 
322fe8fb19SBen Gras /*
332fe8fb19SBen Gras  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
342fe8fb19SBen Gras  *
352fe8fb19SBen Gras  * Redistribution and use in source and binary forms, with or without
362fe8fb19SBen Gras  * modification, are permitted provided that the following conditions
372fe8fb19SBen Gras  * are met:
382fe8fb19SBen Gras  * 1. Redistributions of source code must retain the above copyright
392fe8fb19SBen Gras  *    notice, this list of conditions and the following disclaimer.
402fe8fb19SBen Gras  * 2. Redistributions in binary form must reproduce the above copyright
412fe8fb19SBen Gras  *    notice, this list of conditions and the following disclaimer in the
422fe8fb19SBen Gras  *    documentation and/or other materials provided with the distribution.
432fe8fb19SBen Gras  * 3. All advertising materials mentioning features or use of this software
442fe8fb19SBen Gras  *    must display the following acknowledgement:
452fe8fb19SBen Gras  *	This product includes software developed by the University of
462fe8fb19SBen Gras  *	California, Berkeley and its contributors.
472fe8fb19SBen Gras  * 4. Neither the name of the University nor the names of its contributors
482fe8fb19SBen Gras  *    may be used to endorse or promote products derived from this software
492fe8fb19SBen Gras  *    without specific prior written permission.
502fe8fb19SBen Gras  *
512fe8fb19SBen Gras  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
522fe8fb19SBen Gras  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
532fe8fb19SBen Gras  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
542fe8fb19SBen Gras  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
552fe8fb19SBen Gras  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
562fe8fb19SBen Gras  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
572fe8fb19SBen Gras  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
582fe8fb19SBen Gras  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
592fe8fb19SBen Gras  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
602fe8fb19SBen Gras  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
612fe8fb19SBen Gras  * SUCH DAMAGE.
622fe8fb19SBen Gras  */
632fe8fb19SBen Gras 
642fe8fb19SBen Gras #include <sys/cdefs.h>
652fe8fb19SBen Gras #if defined(LIBC_SCCS) && !defined(lint)
662fe8fb19SBen Gras #if 0
672fe8fb19SBen Gras static char sccsid[] = "@(#)nlist.c	8.1 (Berkeley) 6/4/93";
682fe8fb19SBen Gras #else
69*0a6a1f1dSLionel Sambuc __RCSID("$NetBSD: nlist.c,v 1.25 2014/09/18 13:58:20 christos Exp $");
702fe8fb19SBen Gras #endif
712fe8fb19SBen Gras #endif /* LIBC_SCCS and not lint */
722fe8fb19SBen Gras 
732fe8fb19SBen Gras #include "namespace.h"
742fe8fb19SBen Gras #include <sys/param.h>
752fe8fb19SBen Gras #include <sys/mman.h>
762fe8fb19SBen Gras #include <sys/stat.h>
772fe8fb19SBen Gras #include <sys/file.h>
782fe8fb19SBen Gras 
792fe8fb19SBen Gras #include <assert.h>
802fe8fb19SBen Gras #include <errno.h>
812fe8fb19SBen Gras #include <stdio.h>
822fe8fb19SBen Gras #include <string.h>
832fe8fb19SBen Gras #include <unistd.h>
842fe8fb19SBen Gras #include <nlist.h>
852fe8fb19SBen Gras 
862fe8fb19SBen Gras #if 0
872fe8fb19SBen Gras #ifdef __weak_alias
882fe8fb19SBen Gras __weak_alias(nlist,_nlist)
892fe8fb19SBen Gras #endif
902fe8fb19SBen Gras #endif
912fe8fb19SBen Gras 
922fe8fb19SBen Gras #include "nlist_private.h"
932fe8fb19SBen Gras 
942fe8fb19SBen Gras static const struct {
95f14fb602SLionel Sambuc 	int	(*fdnlist)(int, struct nlist *);
962fe8fb19SBen Gras } fdnlist_fmts[] = {
972fe8fb19SBen Gras #ifdef NLIST_AOUT
982fe8fb19SBen Gras 	{	__fdnlist_aout		},
992fe8fb19SBen Gras #endif
1002fe8fb19SBen Gras #ifdef NLIST_COFF
1012fe8fb19SBen Gras 	{	__fdnlist_coff		},
1022fe8fb19SBen Gras #endif
1032fe8fb19SBen Gras #ifdef NLIST_ECOFF
1042fe8fb19SBen Gras 	{	__fdnlist_ecoff		},
1052fe8fb19SBen Gras #endif
1062fe8fb19SBen Gras #ifdef NLIST_ELF32
1072fe8fb19SBen Gras 	{	__fdnlist_elf32		},
1082fe8fb19SBen Gras #endif
1092fe8fb19SBen Gras #ifdef NLIST_ELF64
1102fe8fb19SBen Gras 	{	__fdnlist_elf64		},
1112fe8fb19SBen Gras #endif
1122fe8fb19SBen Gras };
1132fe8fb19SBen Gras 
1142fe8fb19SBen Gras int
nlist(const char * name,struct nlist * list)115f14fb602SLionel Sambuc nlist(const char *name, struct nlist *list)
1162fe8fb19SBen Gras {
1172fe8fb19SBen Gras 	int fd, n;
1182fe8fb19SBen Gras 
1192fe8fb19SBen Gras 	_DIAGASSERT(name != NULL);
1202fe8fb19SBen Gras 	_DIAGASSERT(list != NULL);
1212fe8fb19SBen Gras 
122*0a6a1f1dSLionel Sambuc 	fd = open(name, O_RDONLY | O_CLOEXEC, 0);
1232fe8fb19SBen Gras 	if (fd < 0)
1242fe8fb19SBen Gras 		return (-1);
1252fe8fb19SBen Gras 	n = __fdnlist(fd, list);
1262fe8fb19SBen Gras 	(void)close(fd);
1272fe8fb19SBen Gras 	return (n);
1282fe8fb19SBen Gras }
1292fe8fb19SBen Gras 
1302fe8fb19SBen Gras int
__fdnlist(int fd,struct nlist * list)131f14fb602SLionel Sambuc __fdnlist(int fd, struct nlist *list)
1322fe8fb19SBen Gras {
1332fe8fb19SBen Gras 	size_t i;
1342fe8fb19SBen Gras 	int rv;
1352fe8fb19SBen Gras 
1362fe8fb19SBen Gras 	_DIAGASSERT(fd != -1);
1372fe8fb19SBen Gras 	_DIAGASSERT(list != NULL);
1382fe8fb19SBen Gras 
1392fe8fb19SBen Gras 	for (i = 0; i < sizeof(fdnlist_fmts) / sizeof(fdnlist_fmts[0]); i++)
1402fe8fb19SBen Gras 		if ((rv = (*fdnlist_fmts[i].fdnlist)(fd, list)) != -1)
1412fe8fb19SBen Gras 			return (rv);
1422fe8fb19SBen Gras 	return (-1);
1432fe8fb19SBen Gras }
144