Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 2 Jul 2005 13:06:14 GMT
From:      soc-bushman <soc-bushman@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 79429 for review
Message-ID:  <200507021306.j62D6E9U089205@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=79429

Change 79429 by soc-bushman@soc-bushman_stinger on 2005/07/02 13:06:10

	testing program added - still completely not finished

Affected files ...

.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservbyname.c#3 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservbyport.c#3 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservent.c#3 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/getservent/getservent.c#1 add
.. //depot/projects/soc2005/nsswitch_cached/tests/getservent/libc_private.h#1 add
.. //depot/projects/soc2005/nsswitch_cached/tests/getservent/namespace.h#1 add
.. //depot/projects/soc2005/nsswitch_cached/tests/getservent/netdb_private.h#1 add
.. //depot/projects/soc2005/nsswitch_cached/tests/getservent/nss_tls.h#1 add
.. //depot/projects/soc2005/nsswitch_cached/tests/getservent/reentrant.h#1 add
.. //depot/projects/soc2005/nsswitch_cached/tests/getservent/un-namespace.h#1 add

Differences ...

==== //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservbyname.c#3 (text+ko) ====


==== //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservbyport.c#3 (text+ko) ====


==== //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservent.c#3 (text+ko) ====

@@ -54,6 +54,777 @@
 #include "un-namespace.h"
 #include "netdb_private.h"
 
+/* nsswitch part - begin */
+#include "libc_private.h"
+#include "nss_tls.h"
+#include <nsswitch.h>
+#include <errno.h>
+/* nsswitch part - end */
+
+/* nsswitch part - begin */
+
+// I guess, we'd better send this structure as the sequence of function arguments
+/*static struct servent_data
+{
+//	char *aliases[_MAXALIASES];	
+//	char line[_MAXLINELEN + 1];
+	char **aliases;
+	size_t aliases_size;
+	
+	char * buffer;
+	size_t buffer_size;
+};*/
+
+static const ns_src defaultsrc[] = {
+	{ NSSRC_COMPAT, NS_SUCCESS },
+	{ NULL, 0 }
+};
+
+static int servent_unpack(char *, struct servent *, char **, size_t);
+static void servent_init(struct servent *);
+
+struct files_state
+{
+	FILE *fp;
+	int stayopen;
+};
+static void files_endstate(void *);
+NSS_TLS_HANDLING(files);
+
+static int files_servent(void *, void *, va_list);
+static int files_setservent(void *, void *, va_list);
+static int files_endservent(void *, void *, va_list);
+static void files_setent(int, struct files_state *);
+static void files_endent(struct files_state *);
+
+#ifdef YP
+static int nis_getservbyname_r(void *, void *, va_list);
+static int nis_getservbyport_t(void *, void *, va_list);
+static int nis_getservent_r(void *, void *, va_list);
+static int nis_setservent(void *, void *, va_list);
+static int nis_endservent(void *, void *, va_list);
+
+struct nis_state
+{
+	/* this specification is not finished */
+	int yp_stepping;
+//	char *yp_name;
+//	char *yp_proto;
+//	int yp_port;
+	char *yp_domain;
+	char *yp_key;
+	int yp_keylen;
+};
+static void nis_endstate(void *);
+NSS_TLS_HANDLING(nis);
+
+#endif
+
+struct compat_state
+{
+	FILE	*fp;
+	int	 stayopen;
+/*	char	*name;
+	enum _compat {
+		COMPAT_MODE_OFF = 0,
+		COMPAT_MODE_ALL,
+		COMPAT_MODE_NAME
+	}	 compat;*/
+};
+//static void compat_endstate(void *);
+//NSS_TLS_HANDLING(compat);
+	
+/* nsswitch part - end */
+
+static int
+servent_unpack(char *p, struct servent * serv, char ** aliases, size_t aliases_size)
+{
+	char *cp, **q, *endp;
+	long l;		
+	
+	if (*p == '#')
+		return -1;
+	cp = strpbrk(p, "#\n");
+	if (cp != NULL)
+		*cp = '\0';
+	serv->s_name = p;
+	p = strpbrk(p, " \t");
+	if (p == NULL)
+		return -1;
+	*p++ = '\0';
+	while (*p == ' ' || *p == '\t')
+		p++;
+	cp = strpbrk(p, ",/");
+	if (cp == NULL)
+		return -1;
+	*cp++ = '\0';
+	l = strtol(p, &endp, 10);
+	if (endp == p || *endp != '\0' || l < 0 || l > USHRT_MAX)
+		return -1;
+	serv->s_port = htons((in_port_t)l);
+	serv->s_proto = cp;
+	q = serv->s_aliases = aliases;
+	cp = strpbrk(cp, " \t");
+	if (cp != NULL)
+		*cp++ = '\0';
+	while (cp && *cp) {
+		if (*cp == ' ' || *cp == '\t') {
+			cp++;
+			continue;
+		}
+		if (q < &aliases[_MAXALIASES - 1]) {
+			*q++ = cp;
+			*q++ = '\0'; // my hack - should work - but will left the buffer in mess after the ending 0
+		}
+		cp = strpbrk(cp, " \t");
+		if (cp != NULL)
+			*cp++ = '\0';
+	}		
+	*q = NULL;
+	
+	return 0;
+}
+
+static void
+servent_init(struct servent * serv)
+{
+}
+
+#define SERVENT_BUFFER_UNPACK(buffer, buffer_size, line, line_size, aliases) 	\
+	aliases=(char **)(_ALIGN((char **)buffer));										\
+	line=(char *)aliases+sizeof(char *)*_MAXALIASES;							\
+	if (line>buffer+buffer_size)												\
+		return (NS_UNAVAIL);													\
+	line_size=buffer+buffer_size-line;											\
+	if (line_size<_MAXLINELEN+1)												\
+		return (NS_TRYAGAIN);
+	/* TODO - must check the alignment here */
+
+#define SERVENT_BUFFER_SIZE sizeof(char*)*_MAXALIASES+_ALIGNBYTES+_MAXLINELEN
+
+/* files backend implementation - begin */
+static 	void
+files_endstate(void *p)
+{
+	FILE * f;
+	
+	if (p == NULL)
+		return;
+	
+	f = ((struct files_state *)p)->fp;
+	if (f != NULL)
+		fclose(f);
+	
+	free(p);
+}
+
+//struct servent * serv, char * buffer, size_t buffer_size, int * errnop, struct files_state * st
+static 	int 
+files_servent(void * retval, void *mdata, va_list ap)
+{
+	struct files_state * st;
+	int rv;	
+	int stayopen;
+	
+	enum nss_lookup_type how;	
+	char * name;
+	char * proto;
+	int port;
+	
+	struct servent * serv;
+	char * buffer;
+	size_t buffer_size;
+	int * errnop;
+	
+	char **aliases;
+	char * line;
+	size_t line_size;
+
+	char *p;
+	char **cp;//, **q, *endp;
+//	long l;	
+			
+	rv = files_getstate(&st);
+	if (rv != 0)
+		return (NS_UNAVAIL);
+	
+	SERVENT_BUFFER_UNPACK(buffer, buffer_size,line,line_size,aliases)
+/*	aliases=_ALIGN((char **)buffer);
+	line=aliases+sizeof(char *)*_MAXALIASES;
+	if (line>=buffer+buffer_size)
+		return (NS_TRYAGAIN);
+	line_size=buffer+buffer_size-line;
+	
+	if (line_size<_MAXLINELEN+1)
+		return (NS_TRYAGAIN);*/
+
+	name = NULL;	
+	proto = NULL;
+	how = (enum nss_lookup_type)mdata;
+	switch (how)
+	{
+		case nss_lt_name:
+			name = va_arg(ap, char *);
+			proto = va_arg(ap, char *);
+			stayopen=0;
+			break;
+		case nss_lt_id:
+			port = va_arg(ap, int);
+			proto = va_arg(ap, char *);
+			stayopen=0;
+			break;
+		case nss_lt_all:
+			stayopen=1;
+			break;		
+		default:
+			return NS_NOTFOUND;
+	};
+	
+	serv = va_arg(ap, struct servent *);
+	buffer  = va_arg(ap, char *);
+	buffer_size = va_arg(ap, size_t);
+	errnop = va_arg(ap,int *);
+	
+	if (st->fp == NULL && (st->fp = fopen(_PATH_SERVICES, "r")) == NULL)
+		return (NS_UNAVAIL);	
+	
+	if (stayopen==1)
+		files_setent(1,st);	
+	
+	rv=NS_NOTFOUND;
+	do {
+		memset(serv,0,sizeof(*serv));
+		*aliases='\0';
+				
+		if ((p = fgets(line,line_size, st->fp)) == NULL) {
+			rv=(NS_RETURN);
+			break;
+		}
+
+		if (servent_unpack(p,serv,aliases,_MAXALIASES) == -1)
+			continue;
+/*		if (*p == '#')
+			continue;
+		cp = strpbrk(p, "#\n");
+		if (cp != NULL)
+			*cp = '\0';
+		serv->s_name = p;
+		p = strpbrk(p, " \t");
+		if (p == NULL)
+			continue;
+		*p++ = '\0';
+		while (*p == ' ' || *p == '\t')
+			p++;
+		cp = strpbrk(p, ",/");
+		if (cp == NULL)
+			continue;
+		*cp++ = '\0';
+		l = strtol(p, &endp, 10);
+		if (endp == p || *endp != '\0' || l < 0 || l > USHRT_MAX)
+			continue;
+		serv->s_port = htons((in_port_t)l);
+		serv->s_proto = cp;
+		q = serv->s_aliases = aliases;
+		cp = strpbrk(cp, " \t");
+		if (cp != NULL)
+			*cp++ = '\0';
+		while (cp && *cp) {
+			if (*cp == ' ' || *cp == '\t') {
+				cp++;
+				continue;
+			}
+			if (q < &st->aliases[_MAXALIASES - 1]) {
+				*q++ = cp;
+				*q++ = '\0'; // my hack - should work - but will left the buffer in mess after the ending 0
+			}
+			cp = strpbrk(cp, " \t");
+			if (cp != NULL)
+				*cp++ = '\0';
+		}		
+		*q = NULL;			*/
+		
+		switch (how)
+		{
+			case nss_lt_name:
+				if (strcmp(name, serv->s_name) == 0)
+					goto gotname;
+				for (cp = serv->s_aliases; *cp; cp++)
+					if (strcmp(name, *cp) == 0)
+						goto gotname;
+					
+				continue;
+			gotname:
+				if (proto == 0 || strcmp(serv->s_proto, proto) == 0)
+					rv=NS_SUCCESS;
+				break;
+			case nss_lt_id:
+				if (port != serv->s_port)
+					continue;
+
+				if (proto == 0 || strcmp(serv->s_proto, proto) == 0)
+					rv=NS_SUCCESS;
+				break;
+			case nss_lt_all:
+				rv = (NS_SUCCESS);
+				break;
+		};
+		
+	} while (!(rv & NS_TERMINATE));
+	
+	if (stayopen==1)
+		files_endent(st);
+		
+	if (rv==NS_SUCCESS)
+		*(struct servent **)retval=serv;
+	
+	return rv;
+}
+
+static void files_setent(int f, struct files_state * st)
+{
+/*	struct files_state * st;
+	int rv;
+	
+	rv = files_getstate(&st);
+	if (rv != 0)
+		return (NS_UNAVAIL);
+	*/
+	if (st->fp == NULL)
+		st->fp = fopen(_PATH_SERVICES, "r");
+	else
+		rewind(st->fp);
+	st->stayopen |= f;
+
+	//return (NS_SUCCESS);	
+}
+
+static void files_endent(struct files_state * st)
+{
+/*	struct files_state *st;
+	int rv;
+
+	rv = files_getstate(&st);
+	if (rv != 0)
+		return (NS_UNAVAIL);
+	*/
+	st->stayopen = 0;
+//	return (NS_SUCCESS);
+}
+
+/*static int 
+files_getservent_r(void * retval, void * mdata, va_list ap)
+{
+	struct files_state * st;
+	struct servent * serv;
+	char * buffer;
+	size_t buffer_size;
+	int * errnop;
+	int rv;
+	
+	rv = files_getstate(&st);
+	if (rv != 0)
+		return (NS_UNAVAIL);	
+	
+	serv = va_arg(ap, struct servent *);
+	buffer  = va_arg(ap, char *);
+	buffer_size = va_arg(ap, size_t);
+	errnop = va_arg(ap,int *);
+	
+	rv=files_servent(se,buffer,buffer_size,errnop);
+	if (rv==NS_SUCCESS)
+		*(struct servent **)retval=se;
+	
+	return rv;
+}	*/
+
+
+static int 
+files_setservent(void * retval, void * mdata, va_list ap)
+{
+	struct files_state *st;
+	int rv;
+	int f;
+
+	f=va_arg(ap,int);
+
+	rv = files_getstate(&st);
+	if (rv != 0)
+		return (NS_UNAVAIL);	
+		
+	files_setent(f,st);
+	return (NS_SUCCESS);
+}
+
+static 	int 
+files_endservent(void * retval, void * mdata, va_list ap)
+{
+	struct files_state *st;
+	int rv;
+	
+	rv = files_getstate(&st);
+	if (rv != 0)
+		return (NS_UNAVAIL);
+	
+	files_endent(st);	
+	return (NS_SUCCESS);
+}
+
+/* files backend implementation - end */
+
+/* nis backend implementation - begin */
+static 	void
+nis_endstate(void *p)
+{
+	if (p == NULL)
+		return;
+
+	free(((struct nis_state *)p)->yp_key);	
+	free(p);
+}
+
+static int 
+nis_getservbyname_r(void * result, void * mdata, va_list ap)
+{
+	struct nis_state * ns;
+	int rv;
+	
+	struct servent * serv;
+	char **aliases;
+	char * line;
+	size_t line_size;	
+	
+	char * name;
+	char * proto;
+	char * buffer;
+	size_t bufsize;
+	int * errnop;
+	
+	char *resultbuf;
+	int resultbuflen;
+	char buf[YPMAXRECORD + 2];
+
+	rv = nis_getstate(&ns);
+	if (rv != 0)
+		return (NS_UNAVAIL);	
+	
+	name = va_arg(ap, char *);
+	proto = va_arg(ap, char *);
+	serv = va_arg(ap, struct servent *);
+	buffer = va_arg(ap, char *);
+	bufsize = va_arg(ap, size_t);
+	errnop = va_arg(ap, int *);
+	
+	SERVENT_BUFFER_UNPACK(buffer,bufsize,line,line_size,aliases)
+	
+	/* TODO: do we need this ? */
+/*	if (bufsize < _MAXLINELEN+1)
+		return (NS_TRYAGAIN);*/
+	
+	if(!ns->yp_domain) {
+		if(yp_get_default_domain(&ns->yp_domain))
+			return (NS_UNAVAIL);
+	}
+
+	//snprintf(buf, sizeof(buf), "%s/%s", ns->yp_name, ns->yp_proto);
+	snprintf(buf, sizeof(buf), "%s/%s", name, proto);
+
+//	ns->yp_name = 0;
+//	ns->yp_proto = NULL;
+
+	if (yp_match(ns->yp_domain, "services.byname", buf, strlen(buf),
+	    &resultbuf, &resultbuflen)) {
+		return (NS_NOTFOUND);
+	}
+		
+	/* getservent() expects lines terminated with \n -- make it happy */
+	//snprintf(sed->line, sizeof sed->line, "%.*s\n", resultbuflen, resultbuf);
+	snprintf(buffer, bufsize, "%.*s\n", resultbuflen, resultbuf);	
+	rv = (servent_unpack(buffer,serv,aliases,_MAXALIASES)==-1) ? (NS_NOTFOUND) : (NS_SUCCESS);
+
+	free(resultbuf);
+	return rv;	
+}
+
+static int 
+nis_getservbyport_t(void * result, void * mdata, va_list ap)
+{
+	struct nis_state * ns;
+	
+	struct servent * serv;
+	char ** aliases;
+	char * line;
+	size_t line_size;
+	
+	int port;
+	char * proto;
+	char * buffer;
+	size_t bufsize;
+	int * errnop;
+
+	char *resultbuf;
+	int resultbuflen;
+	char buf[YPMAXRECORD + 2];
+	int rv;
+	
+	rv = nis_getstate(&ns);
+	if (rv != 0)
+		return (NS_UNAVAIL);	
+	
+	port = va_arg(ap, int);
+	proto = va_arg(ap, char *);
+	serv = va_arg(ap, struct servent *);
+	buffer = va_arg(ap, char *);
+	bufsize = va_arg(ap, size_t);
+	errnop = va_arg(ap, int *);	
+
+	SERVENT_BUFFER_UNPACK(buffer,bufsize,line,line_size,aliases);
+	
+	/* TODO - do we need this? */
+//	if (bufsize<_MAXLINELEN+1)
+//		return (NS_TRYAGAIN);
+	
+//	snprintf(buf, sizeof(buf), "%d/%s", ntohs(sed->yp_port),
+//	    sed->yp_proto);
+	snprintf(buf, sizeof(buf), "%d/%s", ntohs(port),
+	    proto);	
+
+//	sed->yp_port = 0;
+//	sed->yp_proto = NULL;
+
+	if (!ns->yp_domain) {
+		if (yp_get_default_domain(&ns->yp_domain))
+			return (NS_UNAVAIL);
+	}
+
+	/*
+	 * We have to be a little flexible here. Ideally you're supposed
+	 * to have both a services.byname and a services.byport map, but
+	 * some systems have only services.byname. FreeBSD cheats a little
+	 * by putting the services.byport information in the same map as
+	 * services.byname so that either case will work. We allow for both
+	 * possibilities here: if there is no services.byport map, we try
+	 * services.byname instead.
+	 */
+	if ((rv = yp_match(ns->yp_domain, "services.byport", buf, strlen(buf),
+						&resultbuf, &resultbuflen))) {
+		if (rv == YPERR_MAP) {
+			if (yp_match(ns->yp_domain, "services.byname", buf,
+					strlen(buf), &resultbuf, &resultbuflen))
+			return(NS_NOTFOUND);
+		} else
+			return(NS_NOTFOUND);
+	}
+		
+	snprintf(buffer, bufsize, "%.*s\n", resultbuflen, resultbuf);	
+	rv = (servent_unpack(buffer,serv,aliases,_MAXALIASES)==-1) ? (NS_NOTFOUND) : (NS_SUCCESS);
+
+	free(resultbuf);
+	return rv;	
+}
+
+static int 
+nis_getservent_r(void * result, void * mdata, va_list ap)
+{
+	struct nis_state * ns;
+	
+	char ** aliases;
+	char * line;
+	size_t line_size;
+
+	struct servent * serv;
+	char * buffer;
+	size_t bufsize;
+	int * errnop;
+	
+	char *lastkey, *resultbuf;
+	int resultbuflen;
+	int rv;
+
+	rv = nis_getstate(&ns);
+	if (rv != 0)
+		return (NS_UNAVAIL);	
+	
+	serv = va_arg(ap, struct servent *);
+	buffer = va_arg(ap, char *);
+	bufsize = va_arg(ap, size_t);
+	errnop = va_arg(ap, int *);	
+
+	SERVENT_BUFFER_UNPACK(buffer,bufsize,line,line_size,aliases);
+	
+	if (!ns->yp_domain) {
+		if (yp_get_default_domain(&ns->yp_domain))
+			return (NS_UNAVAIL);
+	}
+
+	do {
+		memset(serv,0,sizeof(*serv));
+		*aliases='\0';
+		
+		if (!ns->yp_stepping) {
+			free(ns->yp_key);
+			rv = yp_first(ns->yp_domain, "services.byname", &ns->yp_key,
+				&ns->yp_keylen, &resultbuf, &resultbuflen);
+			if (rv) {
+				ns->yp_stepping = 0;
+				return(NS_RETURN);
+			}
+			ns->yp_stepping = 1;
+		} else {
+			lastkey = ns->yp_key;
+			rv = yp_next(ns->yp_domain, "services.byname", ns->yp_key,
+				ns->yp_keylen, &ns->yp_key, &ns->yp_keylen, &resultbuf,
+				&resultbuflen);
+			free(lastkey);
+			if (rv) {
+				ns->yp_stepping = 0;
+				return (NS_RETURN);
+			}
+		}
+
+		snprintf(buffer, bufsize, "%.*s\n", resultbuflen, resultbuf);	
+		rv = (servent_unpack(buffer,serv,aliases,_MAXALIASES)==-1) ? (NS_NOTFOUND) : (NS_SUCCESS);
+		free(resultbuf);
+	} while (!(rv & NS_TERMINATE ));
+
+	/* getservent() expects lines terminated with \n -- make it happy */
+	return rv == NS_RETURN ? NS_NOTFOUND : rv;	
+}
+
+static int 
+nis_setservent(void *result, void *mdata, va_list ap)
+{
+	return (NS_SUCCESS);
+}
+
+static int 
+nis_endservent(void *result, void *mdata, va_list ap)
+{
+	struct nis_state * ns;
+	int rv;
+	
+	rv = nis_getstate(&ns);
+	if (rv != 0)
+		return (NS_UNAVAIL);
+	
+	/* these 2 lines possibly should be moved into the function 
+	or nis_endstate should be called */
+	free(ns->yp_key);
+	ns->yp_key = NULL;
+	
+	ns->yp_stepping = 0;
+	ns->yp_domain = NULL;
+	
+	return (NS_SUCCESS);
+}
+
+/* nis backend implementation - end */
+
+int 
+my_getservbyname_r(const char * name, const char * proto, 
+	struct servent * serv, char * buffer, size_t bufsize, struct servent ** result)
+{
+	static const ns_dtab dtab[] = {
+		{ NSSRC_FILES, files_servent, (void *)nss_lt_name },
+//#ifdef YP
+		//{ NSSRC_NIS, nis_servent, (void *)nss_lt_name },
+//#endif
+//		{ NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
+		{ NULL, NULL, NULL }
+	};
+	int	rv, ret_errno;
+
+	servent_init(serv);
+	ret_errno = 0;
+	*result = NULL;
+	rv = nsdispatch(result, dtab, NSDB_SERVICES, "getservbyname_r", defaultsrc,
+	    name, proto, serv, buffer, bufsize, &ret_errno);
+	if (rv == NS_SUCCESS)
+		return (0);
+	else
+		return (ret_errno);	
+}
+
+int 
+my_getservbyport_r(int port, const char * proto, struct servent * serv, char * buffer, 
+	size_t bufsize, struct servent ** result)
+{
+	static const ns_dtab dtab[] = {
+		{ NSSRC_FILES, files_servent, (void *)nss_lt_id },
+//#ifdef YP
+	//	{ NSSRC_NIS, nis_servent, (void *)nss_lt_id },
+//#endif
+//		{ NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
+		{ NULL, NULL, NULL }
+	};
+	int	rv, ret_errno;
+
+	servent_init(serv);
+	ret_errno = 0;
+	*result = NULL;
+	rv = nsdispatch(result, dtab, NSDB_SERVICES, "getservbyport_r", defaultsrc,
+	    port, proto, serv, buffer, bufsize, &ret_errno);
+	if (rv == NS_SUCCESS)
+		return (0);
+	else
+		return (ret_errno);		
+}
+
+int
+my_getservent_r(struct servent * serv, char * buffer, size_t bufsize,
+	struct servent ** result)
+{
+	static const ns_dtab dtab[] = {
+		{ NSSRC_FILES, files_servent, (void *)nss_lt_id },
+//#ifdef YP
+//		{ NSSRC_NIS, nis_servent, (void *)nss_lt_id },
+//#endif
+//		{ NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
+		{ NULL, NULL, NULL }
+	};
+	int	rv, ret_errno;
+
+	servent_init(serv);
+	ret_errno = 0;
+	*result = NULL;
+	rv = nsdispatch(result, dtab, NSDB_SERVICES, "getservent_r", defaultsrc,
+	    serv, buffer, bufsize, &ret_errno);
+	if (rv == NS_SUCCESS)
+		return (0);
+	else
+		return (ret_errno);		
+}
+
+void 
+my_setservent(int stayopen)
+{
+	static const ns_dtab dtab[] = {
+		{ NSSRC_FILES, files_setservent, NULL },
+//#ifdef YP
+//		{ NSSRC_NIS, nis_setservent, NULL },
+//#endif
+//		{ NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
+		{ NULL, NULL, NULL }
+	};
+
+	(void)nsdispatch(NULL, dtab, NSDB_SERVICES, "setservent", defaultsrc, stayopen);
+}
+
+void 
+my_endservent()
+{
+	static const ns_dtab dtab[] = {
+		{ NSSRC_FILES, files_endservent, NULL },
+#ifdef YP
+		{ NSSRC_NIS, nis_endservent, NULL },
+#endif
+//		{ NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
+		{ NULL, NULL, NULL }
+	};
+
+	(void) nsdispatch(NULL, dtab, NSDB_SERVICES, "endservent", defaultsrc);
+}
+
+/*
 static struct servdata servdata;
 static thread_key_t servdata_key;
 static once_t servdata_init_once = ONCE_INITIALIZER;
@@ -130,7 +901,7 @@
 			return (0);
 	}
 
-	/*
+	*
 	 * We have to be a little flexible here. Ideally you're supposed
 	 * to have both a services.byname and a services.byport map, but
 	 * some systems have only services.byname. FreeBSD cheats a little
@@ -138,7 +909,7 @@
 	 * services.byname so that either case will work. We allow for both
 	 * possibilities here: if there is no services.byport map, we try
 	 * services.byname instead.
-	 */
+	 *
 	if ((rv = yp_match(sed->yp_domain, "services.byport", buf, strlen(buf),
 						&result, &resultlen))) {
 		if (rv == YPERR_MAP) {
@@ -149,7 +920,7 @@
 			return(0);
 	}
 		
-	/* getservent() expects lines terminated with \n -- make it happy */
+	// getservent() expects lines terminated with \n -- make it happy 
 	snprintf(sed->line, sizeof sed->line, "%.*s\n", resultlen, result);
 
 	free(result);
@@ -178,7 +949,7 @@
 		return(0);
 	}
 		
-	/* getservent() expects lines terminated with \n -- make it happy */
+	// getservent() expects lines terminated with \n -- make it happy 
 	snprintf(sed->line, sizeof sed->line, "%.*s\n", resultlen, result);
 
 	free(result);
@@ -218,7 +989,7 @@
 		}
 	}
 
-	/* getservent() expects lines terminated with \n -- make it happy */
+	// getservent() expects lines terminated with \n -- make it happy 
 	snprintf(sed->line, sizeof sed->line, "%.*s\n", resultlen, result);
 
 	free(result);
@@ -353,3 +1124,4 @@
 		return (NULL);
 	return (&sd->serv);
 }
+*/



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200507021306.j62D6E9U089205>