xref: /freebsd/lib/libc/net/getprotoent.c (revision a2a775011ce266113bd38d22d618fa6258d4d8cb)
158f0484fSRodney W. Grimes /*
258f0484fSRodney W. Grimes  * Copyright (c) 1983, 1993
358f0484fSRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
458f0484fSRodney W. Grimes  *
558f0484fSRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
658f0484fSRodney W. Grimes  * modification, are permitted provided that the following conditions
758f0484fSRodney W. Grimes  * are met:
858f0484fSRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
958f0484fSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
1058f0484fSRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
1158f0484fSRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
1258f0484fSRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
1358f0484fSRodney W. Grimes  * 3. All advertising materials mentioning features or use of this software
1458f0484fSRodney W. Grimes  *    must display the following acknowledgement:
1558f0484fSRodney W. Grimes  *	This product includes software developed by the University of
1658f0484fSRodney W. Grimes  *	California, Berkeley and its contributors.
1758f0484fSRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
1858f0484fSRodney W. Grimes  *    may be used to endorse or promote products derived from this software
1958f0484fSRodney W. Grimes  *    without specific prior written permission.
2058f0484fSRodney W. Grimes  *
2158f0484fSRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2258f0484fSRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2358f0484fSRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2458f0484fSRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2558f0484fSRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2658f0484fSRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2758f0484fSRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2858f0484fSRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2958f0484fSRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3058f0484fSRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3158f0484fSRodney W. Grimes  * SUCH DAMAGE.
3258f0484fSRodney W. Grimes  */
3358f0484fSRodney W. Grimes 
3458f0484fSRodney W. Grimes #if defined(LIBC_SCCS) && !defined(lint)
3558f0484fSRodney W. Grimes static char sccsid[] = "@(#)getprotoent.c	8.1 (Berkeley) 6/4/93";
3658f0484fSRodney W. Grimes #endif /* LIBC_SCCS and not lint */
378fb3f3f6SDavid E. O'Brien #include <sys/cdefs.h>
388fb3f3f6SDavid E. O'Brien __FBSDID("$FreeBSD$");
3958f0484fSRodney W. Grimes 
4058f0484fSRodney W. Grimes #include <sys/types.h>
4158f0484fSRodney W. Grimes #include <sys/socket.h>
4258f0484fSRodney W. Grimes #include <netdb.h>
4358f0484fSRodney W. Grimes #include <stdio.h>
4458f0484fSRodney W. Grimes #include <stdlib.h>
4558f0484fSRodney W. Grimes #include <string.h>
4692b6f7beSHajimu UMEMOTO #include "namespace.h"
4792b6f7beSHajimu UMEMOTO #include "reentrant.h"
4892b6f7beSHajimu UMEMOTO #include "un-namespace.h"
4992b6f7beSHajimu UMEMOTO #include "netdb_private.h"
5058f0484fSRodney W. Grimes 
5192b6f7beSHajimu UMEMOTO static struct protodata protodata;
5292b6f7beSHajimu UMEMOTO static thread_key_t protodata_key;
5392b6f7beSHajimu UMEMOTO static once_t protodata_init_once = ONCE_INITIALIZER;
5492b6f7beSHajimu UMEMOTO static int protodata_thr_keycreated = 0;
5558f0484fSRodney W. Grimes 
5692b6f7beSHajimu UMEMOTO static void
5792b6f7beSHajimu UMEMOTO protoent_data_clear(struct protoent_data *ped)
5892b6f7beSHajimu UMEMOTO {
5992b6f7beSHajimu UMEMOTO 	if (ped->fp) {
6092b6f7beSHajimu UMEMOTO 		fclose(ped->fp);
6192b6f7beSHajimu UMEMOTO 		ped->fp = NULL;
6292b6f7beSHajimu UMEMOTO 	}
6392b6f7beSHajimu UMEMOTO }
6492b6f7beSHajimu UMEMOTO 
6592b6f7beSHajimu UMEMOTO static void
6692b6f7beSHajimu UMEMOTO protodata_free(void *ptr)
6792b6f7beSHajimu UMEMOTO {
6892b6f7beSHajimu UMEMOTO 	struct protodata *pd = ptr;
6992b6f7beSHajimu UMEMOTO 
7092b6f7beSHajimu UMEMOTO 	if (pd == NULL)
7192b6f7beSHajimu UMEMOTO 		return;
7292b6f7beSHajimu UMEMOTO 	protoent_data_clear(&pd->data);
7392b6f7beSHajimu UMEMOTO 	free(pd);
7492b6f7beSHajimu UMEMOTO }
7592b6f7beSHajimu UMEMOTO 
7692b6f7beSHajimu UMEMOTO static void
7792b6f7beSHajimu UMEMOTO protodata_keycreate(void)
7892b6f7beSHajimu UMEMOTO {
7992b6f7beSHajimu UMEMOTO 	protodata_thr_keycreated =
8092b6f7beSHajimu UMEMOTO 	    (thr_keycreate(&protodata_key, protodata_free) == 0);
8192b6f7beSHajimu UMEMOTO }
8292b6f7beSHajimu UMEMOTO 
8392b6f7beSHajimu UMEMOTO struct protodata *
8492b6f7beSHajimu UMEMOTO __protodata_init(void)
8592b6f7beSHajimu UMEMOTO {
8692b6f7beSHajimu UMEMOTO 	struct protodata *pd;
8792b6f7beSHajimu UMEMOTO 
8892b6f7beSHajimu UMEMOTO 	if (thr_main() != 0)
8992b6f7beSHajimu UMEMOTO 		return (&protodata);
9092b6f7beSHajimu UMEMOTO 	if (thr_once(&protodata_init_once, protodata_keycreate) != 0 ||
9192b6f7beSHajimu UMEMOTO 	    !protodata_thr_keycreated)
9292b6f7beSHajimu UMEMOTO 		return (NULL);
9392b6f7beSHajimu UMEMOTO 	if ((pd = thr_getspecific(protodata_key)) != NULL)
9492b6f7beSHajimu UMEMOTO 		return (pd);
9592b6f7beSHajimu UMEMOTO 	if ((pd = calloc(1, sizeof(*pd))) == NULL)
9692b6f7beSHajimu UMEMOTO 		return (NULL);
9792b6f7beSHajimu UMEMOTO 	if (thr_setspecific(protodata_key, pd) == 0)
9892b6f7beSHajimu UMEMOTO 		return (pd);
9992b6f7beSHajimu UMEMOTO 	free(pd);
10092b6f7beSHajimu UMEMOTO 	return (NULL);
10192b6f7beSHajimu UMEMOTO }
10258f0484fSRodney W. Grimes 
10358f0484fSRodney W. Grimes void
10492b6f7beSHajimu UMEMOTO setprotoent_r(int f, struct protoent_data *ped)
10558f0484fSRodney W. Grimes {
10692b6f7beSHajimu UMEMOTO 	if (ped->fp == NULL)
10792b6f7beSHajimu UMEMOTO 		ped->fp = fopen(_PATH_PROTOCOLS, "r");
10858f0484fSRodney W. Grimes 	else
10992b6f7beSHajimu UMEMOTO 		rewind(ped->fp);
11092b6f7beSHajimu UMEMOTO 	ped->stayopen |= f;
11158f0484fSRodney W. Grimes }
11258f0484fSRodney W. Grimes 
11358f0484fSRodney W. Grimes void
11492b6f7beSHajimu UMEMOTO endprotoent_r(struct protoent_data *ped)
11558f0484fSRodney W. Grimes {
11692b6f7beSHajimu UMEMOTO 	if (ped->fp) {
11792b6f7beSHajimu UMEMOTO 		fclose(ped->fp);
11892b6f7beSHajimu UMEMOTO 		ped->fp = NULL;
11958f0484fSRodney W. Grimes 	}
12092b6f7beSHajimu UMEMOTO 	ped->stayopen = 0;
12158f0484fSRodney W. Grimes }
12258f0484fSRodney W. Grimes 
12392b6f7beSHajimu UMEMOTO int
12492b6f7beSHajimu UMEMOTO getprotoent_r(struct protoent *pe, struct protoent_data *ped)
12558f0484fSRodney W. Grimes {
12658f0484fSRodney W. Grimes 	char *p;
12792b6f7beSHajimu UMEMOTO 	char *cp, **q, *endp;
12892b6f7beSHajimu UMEMOTO 	long l;
12958f0484fSRodney W. Grimes 
13092b6f7beSHajimu UMEMOTO 	if (ped->fp == NULL && (ped->fp = fopen(_PATH_PROTOCOLS, "r")) == NULL)
13192b6f7beSHajimu UMEMOTO 		return (-1);
13258f0484fSRodney W. Grimes again:
133a2a77501SHajimu UMEMOTO 	if ((p = fgets(ped->line, sizeof ped->line, ped->fp)) == NULL)
13492b6f7beSHajimu UMEMOTO 		return (-1);
13558f0484fSRodney W. Grimes 	if (*p == '#')
13658f0484fSRodney W. Grimes 		goto again;
13758f0484fSRodney W. Grimes 	cp = strpbrk(p, "#\n");
1387b6cc404SMaxim Sobolev 	if (cp != NULL)
13958f0484fSRodney W. Grimes 		*cp = '\0';
14092b6f7beSHajimu UMEMOTO 	pe->p_name = p;
14158f0484fSRodney W. Grimes 	cp = strpbrk(p, " \t");
14258f0484fSRodney W. Grimes 	if (cp == NULL)
14358f0484fSRodney W. Grimes 		goto again;
14458f0484fSRodney W. Grimes 	*cp++ = '\0';
14558f0484fSRodney W. Grimes 	while (*cp == ' ' || *cp == '\t')
14658f0484fSRodney W. Grimes 		cp++;
14758f0484fSRodney W. Grimes 	p = strpbrk(cp, " \t");
14858f0484fSRodney W. Grimes 	if (p != NULL)
14958f0484fSRodney W. Grimes 		*p++ = '\0';
15092b6f7beSHajimu UMEMOTO 	l = strtol(cp, &endp, 10);
15192b6f7beSHajimu UMEMOTO 	if (endp == cp || *endp != '\0' || l < 0 || l > USHRT_MAX)
15292b6f7beSHajimu UMEMOTO 		goto again;
15392b6f7beSHajimu UMEMOTO 	pe->p_proto = l;
15492b6f7beSHajimu UMEMOTO 	q = pe->p_aliases = ped->aliases;
15558f0484fSRodney W. Grimes 	if (p != NULL) {
15658f0484fSRodney W. Grimes 		cp = p;
15758f0484fSRodney W. Grimes 		while (cp && *cp) {
15858f0484fSRodney W. Grimes 			if (*cp == ' ' || *cp == '\t') {
15958f0484fSRodney W. Grimes 				cp++;
16058f0484fSRodney W. Grimes 				continue;
16158f0484fSRodney W. Grimes 			}
162a2a77501SHajimu UMEMOTO 			if (q < &ped->aliases[_MAXALIASES - 1])
16358f0484fSRodney W. Grimes 				*q++ = cp;
16458f0484fSRodney W. Grimes 			cp = strpbrk(cp, " \t");
16558f0484fSRodney W. Grimes 			if (cp != NULL)
16658f0484fSRodney W. Grimes 				*cp++ = '\0';
16758f0484fSRodney W. Grimes 		}
16858f0484fSRodney W. Grimes 	}
16958f0484fSRodney W. Grimes 	*q = NULL;
17092b6f7beSHajimu UMEMOTO 	return (0);
17192b6f7beSHajimu UMEMOTO }
17292b6f7beSHajimu UMEMOTO 
17392b6f7beSHajimu UMEMOTO void
17492b6f7beSHajimu UMEMOTO setprotoent(int f)
17592b6f7beSHajimu UMEMOTO {
17692b6f7beSHajimu UMEMOTO 	struct protodata *pd;
17792b6f7beSHajimu UMEMOTO 
17892b6f7beSHajimu UMEMOTO 	if ((pd = __protodata_init()) == NULL)
17992b6f7beSHajimu UMEMOTO 		return;
18092b6f7beSHajimu UMEMOTO 	setprotoent_r(f, &pd->data);
18192b6f7beSHajimu UMEMOTO }
18292b6f7beSHajimu UMEMOTO 
18392b6f7beSHajimu UMEMOTO void
18492b6f7beSHajimu UMEMOTO endprotoent(void)
18592b6f7beSHajimu UMEMOTO {
18692b6f7beSHajimu UMEMOTO 	struct protodata *pd;
18792b6f7beSHajimu UMEMOTO 
18892b6f7beSHajimu UMEMOTO 	if ((pd = __protodata_init()) == NULL)
18992b6f7beSHajimu UMEMOTO 		return;
19092b6f7beSHajimu UMEMOTO 	endprotoent_r(&pd->data);
19192b6f7beSHajimu UMEMOTO }
19292b6f7beSHajimu UMEMOTO 
19392b6f7beSHajimu UMEMOTO struct protoent *
19492b6f7beSHajimu UMEMOTO getprotoent(void)
19592b6f7beSHajimu UMEMOTO {
19692b6f7beSHajimu UMEMOTO 	struct protodata *pd;
19792b6f7beSHajimu UMEMOTO 
19892b6f7beSHajimu UMEMOTO 	if ((pd = __protodata_init()) == NULL)
19992b6f7beSHajimu UMEMOTO 		return (NULL);
20092b6f7beSHajimu UMEMOTO 	if (getprotoent_r(&pd->proto, &pd->data) != 0)
20192b6f7beSHajimu UMEMOTO 		return (NULL);
20292b6f7beSHajimu UMEMOTO 	return (&pd->proto);
20358f0484fSRodney W. Grimes }
204