PERFORCE change 79429 for review
soc-bushman
soc-bushman at FreeBSD.org
Sat Jul 2 13:06:15 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=79429
Change 79429 by soc-bushman at 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);
}
+*/
More information about the p4-projects
mailing list