diff options
| -rw-r--r-- | libc/inet/Makefile | 10 | ||||
| -rw-r--r-- | libc/inet/getproto.c | 164 | ||||
| -rw-r--r-- | libc/inet/getservice.c | 176 | 
3 files changed, 348 insertions, 2 deletions
| diff --git a/libc/inet/Makefile b/libc/inet/Makefile index c1afea35a..e5f11ee51 100644 --- a/libc/inet/Makefile +++ b/libc/inet/Makefile @@ -40,7 +40,11 @@ MSRC3=socketcalls.c  MOBJ3= accept.o bind.o connect.o getpeername.o getsockname.o getsockopt.o \  	listen.o recv.o recvfrom.o recvmsg.o send.o sendmsg.o sendto.o \  	setsockopt.o shutdown.o socket.o socketpair.o  -OBJS=$(MOBJ) $(MOBJ2) $(MOBJ3) + +CSRC =getservice.c getproto.c +COBJS=$(patsubst %.c,%.o, $(CSRC)) + +OBJS=$(MOBJ) $(MOBJ2) $(MOBJ3) $(COBJS)  all: $(OBJS) $(LIBC) @@ -62,7 +66,9 @@ $(MOBJ3): $(MSRC3)  	$(CC) $(CFLAGS) -DL_$* $< -c -o $*.o  	$(STRIPTOOL) -x -R .note -R .comment $*.o -$(OBJS): Makefile +$(COBJS): +	$(CC) $(CFLAGS) $< -c $*.c -o $*.o +	$(STRIPTOOL) -x -R .note -R .comment $*.o  clean: subdirs_clean  	rm -f *.[oa] *~ core diff --git a/libc/inet/getproto.c b/libc/inet/getproto.c new file mode 100644 index 000000000..95306b0f3 --- /dev/null +++ b/libc/inet/getproto.c @@ -0,0 +1,164 @@ +/* +** protocols.c                           /etc/protocols access functions +** +** This file is part of the NYS Library. +** +** The NYS Library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Library General Public License as +** published by the Free Software Foundation; either version 2 of the +** License, or (at your option) any later version. +** +** The NYS Library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +** Library General Public License for more details. +**  +** You should have received a copy of the GNU Library General Public +** License along with the NYS Library; see the file COPYING.LIB.  If +** not, write to the Free Software Foundation, Inc., 675 Mass Ave, +** Cambridge, MA 02139, USA. +** +** +** Copyright (c) 1983 Regents of the University of California. +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** 1. Redistributions of source code must retain the above copyright +**    notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +**    notice, this list of conditions and the following disclaimer in the +**    documentation and/or other materials provided with the distribution. +** 3. All advertising materials mentioning features or use of this software +**    must display the following acknowledgement: +**	This product includes software developed by the University of +**	California, Berkeley and its contributors. +** 4. Neither the name of the University nor the names of its contributors +**    may be used to endorse or promote products derived from this software +**    without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +** SUCH DAMAGE. +*/ + +#include <sys/types.h> +#include <sys/socket.h> +#include <netdb.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define	MAXALIASES	35 + +static FILE *protof = NULL; +static char line[BUFSIZ+1]; +static struct protoent proto; +static char *proto_aliases[MAXALIASES]; +static int proto_stayopen; + +void setprotoent(int f) +{ +	if (protof == NULL) +		protof = fopen(_PATH_PROTOCOLS, "r" ); +	else +		rewind(protof); +	proto_stayopen |= f; +} + +void endprotoent(void) +{ +	if (protof) { +		fclose(protof); +		protof = NULL; +	} +	proto_stayopen = 0; +} + +struct protoent * getprotoent(void) +{ +	char *p; +	register char *cp, **q; + +	if (protof == NULL && (protof = fopen(_PATH_PROTOCOLS, "r" )) == NULL) +		return (NULL); +again: +	if ((p = fgets(line, BUFSIZ, protof)) == NULL) +		return (NULL); +	if (*p == '#') +		goto again; +	cp = strpbrk(p, "#\n"); +	if (cp == NULL) +		goto again; +	*cp = '\0'; +	proto.p_name = p; +	cp = strpbrk(p, " \t"); +	if (cp == NULL) +		goto again; +	*cp++ = '\0'; +	while (*cp == ' ' || *cp == '\t') +		cp++; +	p = strpbrk(cp, " \t"); +	if (p != NULL) +		*p++ = '\0'; +	proto.p_proto = atoi(cp); +	q = proto.p_aliases = proto_aliases; +	if (p != NULL) { +		cp = p; +		while (cp && *cp) { +			if (*cp == ' ' || *cp == '\t') { +				cp++; +				continue; +			} +			if (q < &proto_aliases[MAXALIASES - 1]) +				*q++ = cp; +			cp = strpbrk(cp, " \t"); +			if (cp != NULL) +				*cp++ = '\0'; +		} +	} +	*q = NULL; +	return (&proto); +} + + +struct protoent * getprotobyname(const char *name) +{ +	register struct protoent *p; +	register char **cp; + +	setprotoent(proto_stayopen); +	while ((p = getprotoent()) != NULL) { +		if (strcmp(p->p_name, name) == 0) +			break; +		for (cp = p->p_aliases; *cp != 0; cp++) +			if (strcmp(*cp, name) == 0) +				goto found; +	} +found: +	if (!proto_stayopen) +		endprotoent(); +	return (p); +} + +struct protoent * getprotobynumber(int proto) +{ +	register struct protoent *p; + +	setprotoent(proto_stayopen); +	while ((p = getprotoent()) != NULL) +		if (p->p_proto == proto) +			break; +	if (!proto_stayopen) +		endprotoent(); +	return (p); +} diff --git a/libc/inet/getservice.c b/libc/inet/getservice.c new file mode 100644 index 000000000..dee6c83f7 --- /dev/null +++ b/libc/inet/getservice.c @@ -0,0 +1,176 @@ +/* +** services.c                           /etc/services access functions +** +** This file is part of the NYS Library. +** +** The NYS Library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Library General Public License as +** published by the Free Software Foundation; either version 2 of the +** License, or (at your option) any later version. +** +** The NYS Library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +** Library General Public License for more details. +**  +** You should have received a copy of the GNU Library General Public +** License along with the NYS Library; see the file COPYING.LIB.  If +** not, write to the Free Software Foundation, Inc., 675 Mass Ave, +** Cambridge, MA 02139, USA. +** +** +** Copyright (c) 1983 Regents of the University of California. +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** 1. Redistributions of source code must retain the above copyright +**    notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +**    notice, this list of conditions and the following disclaimer in the +**    documentation and/or other materials provided with the distribution. +** 3. All advertising materials mentioning features or use of this software +**    must display the following acknowledgement: +**	This product includes software developed by the University of +**	California, Berkeley and its contributors. +** 4. Neither the name of the University nor the names of its contributors +**    may be used to endorse or promote products derived from this software +**    without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +** ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +** OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +** SUCH DAMAGE. +*/ + + +#include <sys/types.h> +#include <sys/socket.h> +#include <netdb.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <netinet/in.h> +#include <arpa/inet.h> + +#define	MAXALIASES	35 + +static FILE *servf = NULL; +static char line[BUFSIZ+1]; +static struct servent serv; +static char *serv_aliases[MAXALIASES]; +static int serv_stayopen; + +void setservent(int f) +{ +	if (servf == NULL) +		servf = fopen(_PATH_SERVICES, "r" ); +	else +		rewind(servf); +	serv_stayopen |= f; +} + +void endservent(void) +{ +	if (servf) { +		fclose(servf); +		servf = NULL; +	} +	serv_stayopen = 0; +} + +struct servent * getservent(void) +{ +	char *p; +	register char *cp, **q; + +	if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL) +		return (NULL); +again: +	if ((p = fgets(line, BUFSIZ, servf)) == NULL) +		return (NULL); +	if (*p == '#') +		goto again; +	cp = strpbrk(p, "#\n"); +	if (cp == NULL) +		goto again; +	*cp = '\0'; +	serv.s_name = p; +	p = strpbrk(p, " \t"); +	if (p == NULL) +		goto again; +	*p++ = '\0'; +	while (*p == ' ' || *p == '\t') +		p++; +	cp = strpbrk(p, ",/"); +	if (cp == NULL) +		goto again; +	*cp++ = '\0'; +	serv.s_port = htons((u_short)atoi(p)); +	serv.s_proto = cp; +	q = serv.s_aliases = serv_aliases; +	cp = strpbrk(cp, " \t"); +	if (cp != NULL) +		*cp++ = '\0'; +	while (cp && *cp) { +		if (*cp == ' ' || *cp == '\t') { +			cp++; +			continue; +		} +		if (q < &serv_aliases[MAXALIASES - 1]) +			*q++ = cp; +		cp = strpbrk(cp, " \t"); +		if (cp != NULL) +			*cp++ = '\0'; +	} +	*q = NULL; +	return (&serv); +} + + +struct servent *getservbyname(const char *name, const char *proto) +{ +	register struct servent *p; +	register char **cp; + +	setservent(serv_stayopen); +	while ((p = getservent()) != NULL) { +		if (strcmp(name, p->s_name) == 0) +			goto gotname; +		for (cp = p->s_aliases; *cp; cp++) +			if (strcmp(name, *cp) == 0) +				goto gotname; +		continue; +gotname: +		if (proto == 0 || strcmp(p->s_proto, proto) == 0) +			break; +	} +	if (!serv_stayopen) +		endservent(); +	return (p); +} + + +struct servent * getservbyport(int port, const char *proto) +{ +	register struct servent *p; + +	setservent(serv_stayopen); +	while ((p = getservent()) != NULL) { +		if (p->s_port != port) +			continue; +		if (proto == 0 || strcmp(p->s_proto, proto) == 0) +			break; +	} +	if (!serv_stayopen) +		endservent(); +	return (p); +} | 
