From owner-p4-projects@FreeBSD.ORG Sun Jul 3 13:27:15 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4454B16A420; Sun, 3 Jul 2005 13:27:15 +0000 (GMT) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 18A2F16A41C for ; Sun, 3 Jul 2005 13:27:15 +0000 (GMT) (envelope-from soc-bushman@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id E527543D46 for ; Sun, 3 Jul 2005 13:27:14 +0000 (GMT) (envelope-from soc-bushman@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id j63DRECm089485 for ; Sun, 3 Jul 2005 13:27:14 GMT (envelope-from soc-bushman@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id j63DREGt089482 for perforce@freebsd.org; Sun, 3 Jul 2005 13:27:14 GMT (envelope-from soc-bushman@freebsd.org) Date: Sun, 3 Jul 2005 13:27:14 GMT Message-Id: <200507031327.j63DREGt089482@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to soc-bushman@freebsd.org using -f From: soc-bushman To: Perforce Change Reviews Cc: Subject: PERFORCE change 79472 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 03 Jul 2005 13:27:16 -0000 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 %s\n",s); + } - printf("=> %s\n",s); ++trace_level; } static void __trace_point(char *f, int l) { int i; - for (i=0;is_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