126 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (c) 1983 Regents of the University of California.
 | 
						|
 * All rights reserved.
 | 
						|
 *
 | 
						|
 * Redistribution and use in source and binary forms are permitted
 | 
						|
 * provided that: (1) source distributions retain this entire copyright
 | 
						|
 * notice and comment, and (2) distributions including binaries display
 | 
						|
 * the following acknowledgement:  ``This product includes software
 | 
						|
 * developed by the University of California, Berkeley and its contributors''
 | 
						|
 * in the documentation or other materials provided with the distribution
 | 
						|
 * and in all advertising materials mentioning features or use of this
 | 
						|
 * software. 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR
 | 
						|
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 | 
						|
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 | 
						|
 */
 | 
						|
 | 
						|
#if defined(LIBC_SCCS) && !defined(lint)
 | 
						|
static char sccsid[] = "@(#)getservent.c	5.8 (Berkeley) 6/1/90";
 | 
						|
#endif /* LIBC_SCCS and not lint */
 | 
						|
 | 
						|
#include <sys/types.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
#include <net/hton.h>
 | 
						|
#include <net/gen/netdb.h>
 | 
						|
 | 
						|
#define	MAXALIASES	35
 | 
						|
 | 
						|
static FILE *servf = NULL;
 | 
						|
static char line[BUFSIZ+1];
 | 
						|
static struct servent serv;
 | 
						|
static char *serv_aliases[MAXALIASES];
 | 
						|
int _serv_stayopen;
 | 
						|
 | 
						|
static char *any _ARGS(( char *cp, char *match ));
 | 
						|
 | 
						|
void
 | 
						|
setservent(f)
 | 
						|
	int f;
 | 
						|
{
 | 
						|
	if (servf == NULL)
 | 
						|
		servf = fopen(_PATH_SERVICES, "r" );
 | 
						|
	else
 | 
						|
		rewind(servf);
 | 
						|
	_serv_stayopen |= f;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
endservent()
 | 
						|
{
 | 
						|
	if (servf) {
 | 
						|
		fclose(servf);
 | 
						|
		servf = NULL;
 | 
						|
	}
 | 
						|
	_serv_stayopen = 0;
 | 
						|
}
 | 
						|
 | 
						|
struct servent *
 | 
						|
getservent()
 | 
						|
{
 | 
						|
	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 = any(p, "#\n");
 | 
						|
	if (cp == NULL)
 | 
						|
		goto again;
 | 
						|
	*cp = '\0';
 | 
						|
	serv.s_name = p;
 | 
						|
	p = any(p, " \t");
 | 
						|
	if (p == NULL)
 | 
						|
		goto again;
 | 
						|
	*p++ = '\0';
 | 
						|
	while (*p == ' ' || *p == '\t')
 | 
						|
		p++;
 | 
						|
	cp = any(p, ",/");
 | 
						|
	if (cp == NULL)
 | 
						|
		goto again;
 | 
						|
	*cp++ = '\0';
 | 
						|
	serv.s_port = htons((u16_t)atoi(p));
 | 
						|
	serv.s_proto = cp;
 | 
						|
	q = serv.s_aliases = serv_aliases;
 | 
						|
	cp = any(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 = any(cp, " \t");
 | 
						|
		if (cp != NULL)
 | 
						|
			*cp++ = '\0';
 | 
						|
	}
 | 
						|
	*q = NULL;
 | 
						|
	return (&serv);
 | 
						|
}
 | 
						|
 | 
						|
static char *
 | 
						|
any(cp, match)
 | 
						|
	register char *cp;
 | 
						|
	char *match;
 | 
						|
{
 | 
						|
	register char *mp, c;
 | 
						|
 | 
						|
	while ((c = *cp)) {
 | 
						|
		for (mp = match; *mp; mp++)
 | 
						|
			if (*mp == c)
 | 
						|
				return (cp);
 | 
						|
		cp++;
 | 
						|
	}
 | 
						|
	return ((char *)0);
 | 
						|
}
 |