Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 Jul 2005 13:27:14 GMT
From:      soc-bushman <soc-bushman@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 79472 for review
Message-ID:  <200507031327.j63DREGt089482@repoman.freebsd.org>

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

Change 79472 by soc-bushman@soc-bushman_stinger on 2005/07/03 13:26:45

	getservent sandbox test is mostly completed. compat source is left for tomorrow

Affected files ...

.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservent.c#4 edit
.. //depot/projects/soc2005/nsswitch_cached/tests/getservent/getservent.c#2 edit

Differences ...

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

@@ -719,6 +719,75 @@
 
 /* nis backend implementation - end */
 
+/* compat backend implementation - begin */
+
+
+int compat_servent(void * retval, void * mdata, va_list ap)
+{
+}
+
+int compat_setservent(void * retval, void * mdata, va_list ap)
+{
+	static const ns_src compatsrc[] = {
+#ifdef YP
+		{ NSSRC_NIS, NS_SUCCESS },
+#endif
+		{ NULL, 0 }
+	};
+	ns_dtab dtab[] = {
+#ifdef YP
+		{ NSSRC_NIS, nis_setservent, NULL },
+#endif
+		{ NULL, NULL, NULL }
+	};
+	struct compat_state *st;
+	int		 rv, stayopen;
+
+/*#define set_setent(x, y) do {	 				\
+	int i;							\
+								\
+	for (i = 0; i < (sizeof(x)/sizeof(x[0])) - 1; i++)	\
+		x[i].mdata = (void *)y;				\
+} while (0)*/
+
+	rv = compat_getstate(&st);
+	if (rv != 0) 
+		return (NS_UNAVAIL);
+/*	switch ((enum constants)mdata) {
+	case SETGRENT:*/
+		stayopen = va_arg(ap, int);
+		if (st->fp != NULL)
+			rewind(st->fp);
+		else if (stayopen)
+			st->fp = fopen(_PATH_GROUP, "r");
+		set_setent(dtab, mdata);
+		(void)_nsdispatch(NULL, dtab, NSDB_GROUP_COMPAT, "setgrent",
+		    compatsrc, 0);
+		break;
+/*	case ENDGRENT:
+		if (st->fp != NULL) {
+			fclose(st->fp);
+			st->fp = NULL;
+		}
+		set_setent(dtab, mdata);
+		(void)_nsdispatch(NULL, dtab, NSDB_GROUP_COMPAT, "endgrent",
+		    compatsrc, 0);
+		break;
+	default:
+		break;
+	}
+	st->compat = COMPAT_MODE_OFF;
+	free(st->name);
+	st->name = NULL;*/
+	return (NS_UNAVAIL);
+/* #undef set_setent	*/
+}
+
+int compat_endservent(void * retval, void * mdata, va_list ap)
+{
+}
+/* compat backend implementation - end */
+
 int 
 my_getservbyname_r(const char * name, const char * proto, 
 	struct servent * serv, char * buffer, size_t bufsize, struct servent ** result)

==== //depot/projects/soc2005/nsswitch_cached/tests/getservent/getservent.c#2 (text+ko) ====

@@ -57,62 +57,111 @@
 #include "netdb_private.h"
 
 /* debug part - begin */
+#define TRACE_WANTED 3
+
 static int trace_level=0;
+static int trace_level_bk=0;
 
+#define TRACE_IN(x) __trace_in(#x,__FILE__,__LINE__)
+#define TRACE_POINT() __trace_point(__FILE__,__LINE__)
+#define TRACE_PTR(p) __trace_ptr(#p, p, __FILE__,__LINE__)
+#define TRACE_INT(i) __trace_int(#i, i, __FILE__,__LINE__)
+#define TRACE_STR(s) __trace_str(#s, s, __FILE__,__LINE__)
+#define TRACE_OUT(x) __trace_out(#x,__FILE__,__LINE__)
+#define TRACE_ON() __trace_on()
+#define TRACE_OFF() __trace_off()
+
 static void __trace_in(char *s,char *f, int l)
 {
 	int i;
-	for (i=0;i<trace_level;++i)
-		printf("\t");
+	if (trace_level<TRACE_WANTED)
+	{
+		for (i=0;i<trace_level;++i)
+			printf("\t");
+	
+		printf("=> %s\n",s);
+	}
 	
-	printf("=> %s\n",s);
 	++trace_level;
 }
 
 static void __trace_point(char *f, int l)
 {
 	int i;
-	for (i=0;i<trace_level-1;++i)
-		printf("\t");
+	
+	if (trace_level<TRACE_WANTED) 
+	{
+		for (i=0;i<trace_level-1;++i)
+			printf("\t");
 
-	printf("= %s: %d\n",f,l);
+		printf("= %s: %d\n",f,l);
+	}
 }
 
 static void __trace_ptr(char *desc, void *p, char *f, int l)
 {
 	int i;
-	for (i=0;i<trace_level-1;++i)
-		printf("\t");
+	
+	if (trace_level<TRACE_WANTED)
+	{
+		for (i=0;i<trace_level-1;++i)
+			printf("\t");
+
+		printf("= PTR %s: %p, %s: %d\n",desc,p,f,l);	
+	}
+}
+
+static void __trace_int(char * desc, int i, char *f, int l)
+{
+	int j;
+	
+	if (trace_level<TRACE_WANTED)
+	{
+		for (j=0;i<trace_level-1;++j)
+			printf("\t");
 
-	printf("= PTR %s: %p, %s: %d\n",desc,p,f,l);	
+		printf("= INT %s: %i, %s: %d\n",desc,i,f,l);	
+	}
 }
 
 static void __trace_str(char *desc, char *s, char *f, int l)
 {
 	int i;
-	for (i=0;i<trace_level-1;++i)
-		printf("\t");
+	
+	if (trace_level<TRACE_WANTED)
+	{
+		for (i=0;i<trace_level-1;++i)
+			printf("\t");
 
-	printf("= PTR %s: '%s', %s: %d\n",desc,s,f,l);	
+		printf("= PTR %s: '%s', %s: %d\n",desc,s,f,l);	
+	}
 }
 
 static void __trace_out(char *s,char *f, int l)
 {
 	int i;
 
-	--trace_level;
-	for (i=0;i<trace_level;++i)
-		printf("\t");
+	--trace_level;	
+	if (trace_level<TRACE_WANTED)
+	{
+		for (i=0;i<trace_level;++i)
+			printf("\t");
 	
-	printf("<= %s\n",s);
+		printf("<= %s\n",s);
+	}
 }
 
-#define TRACE_IN(x) __trace_in(#x,__FILE__,__LINE__)
-#define TRACE_POINT() __trace_point(__FILE__,__LINE__)
-#define TRACE_PTR(p) __trace_ptr(#p, p, __FILE__,__LINE__);
-#define TRACE_STR(s) __trace_str(#s, s, __FILE__,__LINE__);
-#define TRACE_OUT(x) __trace_out(#x,__FILE__,__LINE__)
+static void __trace_on()
+{
+	trace_level=trace_level_bk;
+	trace_level_bk=0;
+}
 
+static void __trace_off()
+{
+	trace_level_bk=trace_level;
+	trace_level=1024;
+}
 /* debug part - end */
 
 /* nsswitch part - begin */
@@ -138,7 +187,8 @@
 
 static const ns_src defaultsrc[] = {
 	//{ NSSRC_COMPAT, NS_SUCCESS },
-	{ NSSRC_FILES, NS_SUCCESS },
+	//{ NSSRC_FILES, NS_SUCCESS },
+	{ NSSRC_NIS, NS_SUCCESS },
 	{ NULL, 0 }
 };
 
@@ -186,15 +236,13 @@
 {
 	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);
+static void compat_endstate(void *);
+NSS_TLS_HANDLING(compat);
+
+static int compat_servent(void *, void *, va_list);
+static int compat_setservent(void *, void *, va_list);
+static int compat_setservent(void *, void *, va_list);
 	
 /* nsswitch part - end */
 
@@ -215,6 +263,7 @@
 	if (cp != NULL)
 		*cp = '\0';
 	serv->s_name = p;
+	TRACE_STR(serv->s_name);
 	p = strpbrk(p, " \t");
 	if (p == NULL) {
 		TRACE_POINT();
@@ -222,6 +271,7 @@
 		return -1;
 	}
 	*p++ = '\0';
+	TRACE_STR(serv->s_name);
 	while (*p == ' ' || *p == '\t')
 		p++;
 	cp = strpbrk(p, ",/");
@@ -237,28 +287,37 @@
 		TRACE_OUT(servent_unpack);
 		return -1;
 	}
+	TRACE_STR(serv->s_name);
 	serv->s_port = htons((in_port_t)l);
 	serv->s_proto = cp;
 	q = serv->s_aliases = aliases;
 	cp = strpbrk(cp, " \t");
+	TRACE_STR(serv->s_name);
 	if (cp != NULL)
 		*cp++ = '\0';
+	TRACE_STR(serv->s_name);
 	while (cp && *cp) {
 		if (*cp == ' ' || *cp == '\t') {
 			cp++;
+			TRACE_STR(serv->s_name);
 			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
+			TRACE_STR(serv->s_name);
 		}
 		cp = strpbrk(cp, " \t");
 		if (cp != NULL)
 			*cp++ = '\0';
+		TRACE_STR(serv->s_name);
 	}		
+	TRACE_STR(serv->s_name);
 	*q = NULL;
+	TRACE_STR(serv->s_name);	
 
 	TRACE_POINT();
+	TRACE_STR(serv->s_name);
 	TRACE_OUT(servent_unpack);	
 	return 0;
 }
@@ -390,7 +449,8 @@
 	TRACE_POINT();
 	rv=NS_NOTFOUND;
 	do {
-		memset(serv,0,sizeof(*serv));
+		TRACE_PTR(serv);
+		memset(serv,0,sizeof(struct servent));
 		*aliases='\0';
 				
 		if ((p = fgets(line,line_size, st->fp)) == NULL) {
@@ -585,6 +645,8 @@
 /* files backend implementation - end */
 
 /* nis backend implementation - begin */
+#ifdef YP
+
 static 	void
 nis_endstate(void *p)
 {
@@ -595,6 +657,194 @@
 	free(p);
 }
 
+static int
+nis_servent(void * retval, void * mdata, va_list ap)
+{
+	char *resultbuf,*lastkey;
+	int resultbuflen;
+	char buf[YPMAXRECORD + 2];
+	
+	struct nis_state * ns;
+	int rv;
+	int stayopen;
+	
+	enum nss_lookup_type how;	
+	char * name;
+	char * proto;
+	int port;
+	
+	struct servent * serv;
+	char * buffer;
+	size_t bufsize;
+	int * errnop;
+	
+	char **aliases;
+	char * line;
+	size_t line_size;
+
+	char *p;
+	char **cp;//, **q, *endp;
+//	long l;	
+			
+	TRACE_IN(nis_servent);
+	rv = nis_getstate(&ns);
+	if (rv != 0) {
+		TRACE_OUT(nis_servent);
+		return (NS_UNAVAIL);
+	}
+	
+/*	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);*/
+
+	TRACE_POINT();
+	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;
+			TRACE_POINT();
+			break;
+		case nss_lt_id:
+			port = va_arg(ap, int);
+			proto = va_arg(ap, char *);
+			stayopen=0;
+			TRACE_POINT();
+			break;
+		case nss_lt_all:
+			stayopen=1;
+			TRACE_POINT();
+			break;		
+		default:
+			TRACE_OUT(nis_servent);
+			return NS_NOTFOUND;
+	};
+	
+	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)
+	TRACE_PTR(buffer);
+	TRACE_PTR(line);
+	TRACE_PTR(aliases);
+	
+	if (!ns->yp_domain) {
+		if (yp_get_default_domain(&ns->yp_domain)) {
+			TRACE_OUT(nis_servent);
+			return (NS_UNAVAIL);
+		}
+	}
+
+	TRACE_POINT();
+	do {
+		switch (how)
+		{
+			case nss_lt_name:
+					snprintf(buf, sizeof(buf), "%s/%s", name, proto);
+					if (yp_match(ns->yp_domain, "services.byname", buf, strlen(buf), &resultbuf, &resultbuflen)) {
+						TRACE_STR(ns->yp_domain);
+						TRACE_STR(buf);
+						TRACE_POINT();
+						rv = (NS_NOTFOUND);
+					} else {					
+						snprintf(line, line_size, "%.*s\n", resultbuflen, resultbuf);	
+						rv = (servent_unpack(line,serv,aliases,_MAXALIASES)==-1) ? (NS_NOTFOUND) : (NS_SUCCESS);
+						free(resultbuf);				
+					}
+				break;
+			case nss_lt_id:
+				snprintf(buf, sizeof(buf), "%d/%s", ntohs(port), proto);	
+			
+				/*
+				 * 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))
+							rv = (NS_NOTFOUND);
+						else
+							rv = (NS_SUCCESS);
+					} else
+						rv = (NS_NOTFOUND);
+				} else
+					rv = (NS_SUCCESS);
+				/* TODO: eliminate rv = (NS_SUCCESS) from the above fragment - make it
+				look better */
+					
+				if (rv == NS_SUCCESS) {
+					snprintf(line, line_size, "%.*s\n", resultbuflen, resultbuf);	
+					rv = (servent_unpack(line,serv,aliases,_MAXALIASES)==-1) ? (NS_NOTFOUND) : (NS_SUCCESS);
+					free(resultbuf);				
+				}
+				break;
+			case nss_lt_all:
+				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;
+						rv = (NS_RETURN);
+					} else
+						rv = (NS_SUCCESS);
+					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;
+						rv = (NS_RETURN);
+					} else
+						rv = (NS_SUCCESS);
+				}
+				/* TODO: same as above - eliminate rv = (NS_SUCCESS). Probably by
+				using labels */
+		
+				if (rv == NS_SUCCESS) {
+					snprintf(line, line_size, "%.*s\n", resultbuflen, resultbuf);	
+					rv = (servent_unpack(line,serv,aliases,_MAXALIASES)==-1) ? (NS_NOTFOUND) : (NS_SUCCESS);
+					free(resultbuf);				
+				}
+				break;
+		};
+		
+		TRACE_INT(rv);
+		TRACE_INT(!(rv & NS_TERMINATE));
+	} while (!(rv & NS_TERMINATE) && (how==nss_lt_all));
+	
+	if (rv==NS_SUCCESS) {
+		*(struct servent **)retval=serv;
+		TRACE_POINT();
+	}
+	
+	TRACE_OUT(nis_servent);
+	return rv;
+}
+
 static int 
 nis_getservbyname_r(void * result, void * mdata, va_list ap)
 {
@@ -698,8 +948,7 @@
 	
 //	snprintf(buf, sizeof(buf), "%d/%s", ntohs(sed->yp_port),
 //	    sed->yp_proto);
-	snprintf(buf, sizeof(buf), "%d/%s", ntohs(port),
-	    proto);	
+	snprintf(buf, sizeof(buf), "%d/%s", ntohs(port), proto);	
 
 //	sed->yp_port = 0;
 //	sed->yp_proto = NULL;
@@ -830,17 +1079,53 @@
 	return (NS_SUCCESS);
 }
 
+#endif
+
 /* nis backend implementation - end */
 
+/* compat backend implementation - begin */
+static 	void
+compat_endstate(void *p)
+{
+	TRACE_IN(compat_endstate);
+	
+	FILE * f;
+	
+	if (p == NULL)
+		return;
+	
+	f = ((struct files_state *)p)->fp;
+	if (f != NULL)
+		fclose(f);
+	
+	free(p);
+	TRACE_OUT(compat_endstate);
+}
+
+static int
+compat_servent(void * retval, void * mdata, va_list ap)
+{
+}
+
+static int
+compat_setservent(void * retval, void * mdata, va_list ap)
+{
+}
+
+compat_endservent(void * retval, void * mdata, va_list ap)
+{
+}
+/* compat 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
+#ifdef YP
+		{ NSSRC_NIS, nis_servent, (void *)nss_lt_name },
+#endif
 //		{ NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
 		{ NULL, NULL, NULL }
 	};
@@ -869,9 +1154,9 @@
 {
 	static const ns_dtab dtab[] = {
 		{ NSSRC_FILES, files_servent, (void *)nss_lt_id },
-//#ifdef YP
-	//	{ NSSRC_NIS, nis_servent, (void *)nss_lt_id },
-//#endif
+#ifdef YP
+		{ NSSRC_NIS, nis_servent, (void *)nss_lt_id },
+#endif
 //		{ NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
 		{ NULL, NULL, NULL }
 	};
@@ -893,10 +1178,10 @@
 	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_FILES, files_servent, (void *)nss_lt_all },
+#ifdef YP
+		{ NSSRC_NIS, nis_servent, (void *)nss_lt_all },
+#endif
 //		{ NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
 		{ NULL, NULL, NULL }
 	};
@@ -918,9 +1203,9 @@
 {
 	static const ns_dtab dtab[] = {
 		{ NSSRC_FILES, files_setservent, NULL },
-//#ifdef YP
-//		{ NSSRC_NIS, nis_setservent, NULL },
-//#endif
+#ifdef YP
+		{ NSSRC_NIS, nis_setservent, NULL },
+#endif
 //		{ NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
 		{ NULL, NULL, NULL }
 	};
@@ -1245,6 +1530,7 @@
 }
 */
 
+static 
 void result_info(int rv, struct servent * result)
 {
 	if (rv == 0) {
@@ -1269,37 +1555,167 @@
 		printf("failure: code=%d, detailts='%s\n'",rv,strerror(rv));
 }
 
-void byname_test1_r()
+static 
+int result_compare(struct servent * serv1, struct servent * serv2)
+{
+	char **c1, **c2;
+	
+	if (serv1 == serv2)
+		return 0;
+	
+	if ((serv1 == NULL) || (serv2 == NULL))
+		return -1;
+	
+	if ( (strcmp(serv1->s_name,serv2->s_name)!=0) ||
+		(strcmp(serv1->s_proto,serv2->s_proto)!=0) ||
+		(serv1->s_port != serv2->s_port))
+		return -1;
+	
+	c1=serv1->s_aliases;
+	c2=serv2->s_aliases;
+	for (;*c1 && *c2; ++c1, ++c2)
+		if (strcmp(*c1,*c2)!=0)
+			return -1;
+		
+	if ((*c1!='\0') || (*c2!='\0'))
+		return -1;
+	
+	return 0;
+}
+
+static void 
+byname_test1_r()
 {	
 	char buffer[SERVENT_BUFFER_SIZE];
 	struct servent serv;
 	struct servent * result;
 		
-	int rv;
+	int rv, i;
+	
+	char *s[] = { 
+		"ssh",
+		"ftp",
+		"rpc",
+		"http",
+		"https" };
+	
+	printf("\ntesting getservbyname_r function\n");
+	for (i=0;i<sizeof s / sizeof(char *); ++i)
+	{
+		struct servent * result2;
+		
+		printf("\n%s\n",s[i]);		
+		rv=my_getservbyname_r(s[i],"tcp",&serv,buffer,sizeof buffer,&result);
+		result_info(rv,result);
+
+		result2=getservbyname(s[i],"tcp");
+		if (result_compare(result,result2)==0)
+			printf("EQUAL RESULTS\n");
+		else
+			printf("WARNING: DIFFERENT RESULTS\n");
+	}		
+}
+
+static void 
+byport_test1_r()
+{
+	char buffer[SERVENT_BUFFER_SIZE];
+	struct servent serv;
+	struct servent * result;
+		
+	int rv, i;
+	
+	int p[] = { 
+		22,
+		80,
+		8080,
+		19,
+		14 };
+	
+	printf("\ntesting getservbyname_r function\n");
+	for (i=0;i<sizeof p / sizeof(int); ++i)
+	{
+		struct servent * result2;
+		
+		printf("\n%d\n",p[i]);		
+		rv=my_getservbyport_r(p[i],NULL,&serv,buffer,sizeof buffer,&result);
+		result_info(rv,result);
+
+		result2=getservbyport(p[i],NULL);
+		if (result_compare(result,result2)==0)
+			printf("EQUAL RESULTS\n");
+		else
+			printf("WARNING: DIFFERENT RESULTS\n");
+	}		
+}
+
+static void
+ent_test1_r()
+{
+	char buffer[SERVENT_BUFFER_SIZE];
+	struct servent serv;
+	struct servent * result;
+		
+	int rv, i;	
+	struct servent * result2;
 	
-	printf("\ntesting getservbyname_r function\n");	
+	printf("\ntesting getservent_r function\n");	
+	my_setservent(1);
+	setservent(1);
+	do
+	{
+		TRACE_OFF();
+		rv=my_getservent_r(&serv,buffer,sizeof buffer,&result);
+		//result_info(rv,result);
 		
-	printf("\n%s\n","ssh");
-	rv=my_getservbyname_r("ssh",NULL,&serv,buffer,sizeof buffer,&result);
-	result_info(rv,result);
+		result2=getservent();
+		if (result_compare(result,result2)==0)
+			printf(".");
+		else {
+			printf("\nWARNING: DIFFERENT RESULTS\n");
+			break;
+		}
 
-	printf("\n%s\n","ftp");
-	rv=my_getservbyname_r("ftp",NULL,&serv,buffer,sizeof buffer,&result);
-	result_info(rv,result);
+		TRACE_ON();		
+	} while ((result!=NULL) && (result2!=NULL));
+	
+	if ((result==NULL) && (result2==NULL))
+		printf("\nSUCCESS\n");
+	else
+		printf("\nFAILURE\n");
+}
 
-	printf("\n%s\n","rpc");
-	rv=my_getservbyname_r("rpc",NULL,&serv,buffer,sizeof buffer,&result);
-	result_info(rv,result);	
+static void
+ent_test2_r()
+{
+	char buffer[SERVENT_BUFFER_SIZE];
+	struct servent serv;
+	struct servent * result;
+		
+	int rv;
 	
-	printf("\n%s\n","http");
-	rv=my_getservbyname_r("http",NULL,&serv,buffer,sizeof buffer,&result);
-	result_info(rv,result);
+	printf("\ntesting getservent_r function - simple iteration\n");	
+	my_setservent(1);
+	do
+	{
+		//TRACE_OFF();
+		rv=my_getservent_r(&serv,buffer,sizeof buffer,&result);
+		result_info(rv,result);
+		//TRACE_ON();		
+	} while (rv == 0 && result!=NULL );
+
+	if (rv == 0)
+		printf("\nSUCCESS\n");
+	else
+		printf("\nFAILURE\n");
 }
 
 int main()
 {
 	printf("getserv* functions sandbox test (02.07.05)\n");
 	
-	byname_test1_r();
+//	byname_test1_r();
+//	byport_test1_r();
+	ent_test2_r();
 	return 0;
 }



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