PERFORCE change 95995 for review
soc-bushman
soc-bushman at FreeBSD.org
Mon Apr 24 13:55:28 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=95995
Change 95995 by soc-bushman at soc-bushman_stinger on 2006/04/24 13:54:31
changes that was needed for patch submission
Affected files ...
.. //depot/projects/soc2005/nsswitch_cached/src/include/nsswitch.h#9 edit
.. //depot/projects/soc2005/nsswitch_cached/src/include/rpc/rpcent.h#4 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/include/nscache.h#2 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/include/nscachedcli.h#2 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getproto.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getprotoent.c#10 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getprotoname.c#5 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservbyname.c#8 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservbyport.c#8 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getservent.c#21 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/netdb_private.h#10 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nscache.c#10 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nscachedcli.c#11 edit
.. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nsdispatch.c#16 edit
.. //depot/projects/soc2005/nsswitch_cached/src/usr.sbin/cached/cached.c#2 edit
Differences ...
==== //depot/projects/soc2005/nsswitch_cached/src/include/nsswitch.h#9 (text+ko) ====
@@ -195,11 +195,6 @@
nss_lt_all = 3
};
-#ifdef NS_CACHING
-#include "nscachedcli.h"
-#include "nscache.h"
-#endif /* NS_CACHING */
-
#ifdef _NS_PRIVATE
/*
* private data structures for back-end nsswitch implementation
==== //depot/projects/soc2005/nsswitch_cached/src/include/rpc/rpcent.h#4 (text+ko) ====
@@ -53,11 +53,6 @@
};
__BEGIN_DECLS
-extern struct rpcent *getrpcbyname_r(const char *, struct rpcent *, char *,
- int);
-extern struct rpcent *getrpcbynumber_r(int, struct rpcent *, char *, int);
-extern struct rpcent *getrpcent_r(struct rpcent *, char *, int);
-
/* These interfaces are currently implemented through nsswitch and MT-safe */
extern struct rpcent *getrpcbyname(char *);
extern struct rpcent *getrpcbynumber(int);
==== //depot/projects/soc2005/nsswitch_cached/src/lib/libc/include/nscache.h#2 (text+ko) ====
@@ -28,6 +28,8 @@
#ifndef __NS_CACHE_H__
#define __NS_CACHE_H__
+#include "nscachedcli.h"
+
typedef int (*nss_cache_id_func_t)(char *, size_t *, va_list, void *);
typedef int (*nss_cache_marshal_func_t)(char *, size_t *, void *, va_list,
void *);
@@ -80,10 +82,10 @@
\
mp_state = (struct name##_mp_state *)s; \
if (mp_state->mp_write_session != INVALID_CACHED_MP_WRITE_SESSION)\
- abandon_cached_mp_write_session(mp_state->mp_write_session);\
+ __abandon_cached_mp_write_session(mp_state->mp_write_session);\
\
if (mp_state->mp_read_session != INVALID_CACHED_MP_READ_SESSION)\
- close_cached_mp_read_session(mp_state->mp_read_session); \
+ __close_cached_mp_read_session(mp_state->mp_read_session); \
} \
NSS_TLS_HANDLING(name##_mp); \
\
@@ -154,7 +156,7 @@
* Analog of other XXX_CB macros. Has the pointer to _nss_cache_info
* structure as the only argument.
*/
-#define NS_CACHE_CB(cinfo) {NSSRC_CACHE, nss_cache_handler, (void *)(cinfo) },
+#define NS_CACHE_CB(cinfo) {NSSRC_CACHE, __nss_cache_handler, (void *)(cinfo) },
/* args are: current pointer, current buffer, initial buffer, pointer type */
#define NS_APPLY_OFFSET(cp, cb, ib, p_type) \
@@ -176,17 +178,17 @@
__BEGIN_DECLS
/* dummy function, which is needed to make nss_method_lookup happy */
-extern int nss_cache_handler(void *, void *, va_list);
+extern int __nss_cache_handler(void *, void *, va_list);
#ifdef _NS_PRIVATE
-extern int nss_common_cache_read(void *, void *, va_list);
-extern int nss_common_cache_write(void *, void *, va_list);
-extern int nss_common_cache_write_negative(void *);
+extern int __nss_common_cache_read(void *, void *, va_list);
+extern int __nss_common_cache_write(void *, void *, va_list);
+extern int __nss_common_cache_write_negative(void *);
-extern int nss_mp_cache_read(void *, void *, va_list);
-extern int nss_mp_cache_write(void *, void *, va_list);
-extern int nss_mp_cache_write_submit(void *, void *, va_list);
-extern int nss_mp_cache_end(void *, void *, va_list);
+extern int __nss_mp_cache_read(void *, void *, va_list);
+extern int __nss_mp_cache_write(void *, void *, va_list);
+extern int __nss_mp_cache_write_submit(void *, void *, va_list);
+extern int __nss_mp_cache_end(void *, void *, va_list);
#endif /* _NS_PRIVATE */
__END_DECLS
==== //depot/projects/soc2005/nsswitch_cached/src/lib/libc/include/nscachedcli.h#2 (text+ko) ====
@@ -77,27 +77,27 @@
__BEGIN_DECLS
/* initialization/destruction routines */
-extern cached_connection open_cached_connection(
+extern cached_connection __open_cached_connection(
struct cached_connection_params const *);
-extern void close_cached_connection(cached_connection);
+extern void __close_cached_connection(cached_connection);
/* simple read/write operations */
-extern int cached_write(cached_connection, const char *, const char *,
+extern int __cached_write(cached_connection, const char *, const char *,
size_t, const char *, size_t);
-extern int cached_read(cached_connection, const char *, const char *,
+extern int __cached_read(cached_connection, const char *, const char *,
size_t, char *, size_t *);
/* multipart read/write operations */
-extern cached_mp_write_session open_cached_mp_write_session(
+extern cached_mp_write_session __open_cached_mp_write_session(
struct cached_connection_params const *, const char *);
-extern int cached_mp_write(cached_mp_write_session, const char *, size_t);
-extern int abandon_cached_mp_write_session(cached_mp_write_session);
-extern int close_cached_mp_write_session(cached_mp_write_session);
+extern int __cached_mp_write(cached_mp_write_session, const char *, size_t);
+extern int __abandon_cached_mp_write_session(cached_mp_write_session);
+extern int __close_cached_mp_write_session(cached_mp_write_session);
-extern cached_mp_read_session open_cached_mp_read_session(
+extern cached_mp_read_session __open_cached_mp_read_session(
struct cached_connection_params const *, const char *);
-extern int cached_mp_read(cached_mp_read_session, char *, size_t *);
-extern int close_cached_mp_read_session(cached_mp_read_session);
+extern int __cached_mp_read(cached_mp_read_session, char *, size_t *);
+extern int __close_cached_mp_read_session(cached_mp_read_session);
__END_DECLS
==== //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getproto.c#5 (text+ko) ====
@@ -38,4 +38,108 @@
__FBSDID("$FreeBSD: src/lib/libc/net/getproto.c,v 1.5 2006/04/15 16:20:27 ume Exp $");
#include <netdb.h>
+#include <nsswitch.h>
#include "netdb_private.h"
+#ifdef NS_CACHING
+#include "nscache.h"
+#endif
+#include "nss_tls.h"
+
+static const ns_src defaultsrc[] = {
+ { NSSRC_FILES, NS_SUCCESS },
+ { NULL, 0 }
+};
+
+#ifdef NS_CACHING
+extern int __proto_id_func(char *, size_t *, va_list, void *);
+extern int __proto_marshal_func(char *, size_t *, void *, va_list, void *);
+extern int __proto_unmarshal_func(char *, size_t, void *, va_list, void *);
+#endif
+
+int
+__files_getprotobynumber(void *retval, void *mdata, va_list ap)
+{
+ struct protoent pe;
+ struct protoent_data *ped;
+ int error;
+
+ int number;
+ struct protoent *pptr;
+ char *buffer;
+ size_t buflen;
+ int *errnop;
+
+ number = va_arg(ap, int);
+ pptr = va_arg(ap, struct protoent *);
+ buffer = va_arg(ap, char *);
+ buflen = va_arg(ap, size_t);
+ errnop = va_arg(ap, int *);
+
+ if ((ped = __protoent_data_init()) == NULL) {
+ *errnop = -1;
+ return (NS_NOTFOUND);
+ }
+
+ __setprotoent_p(ped->stayopen, ped);
+ while ((error = __getprotoent_p(&pe, ped)) == 0)
+ if (pe.p_proto == number)
+ break;
+ if (!ped->stayopen)
+ __endprotoent_p(ped);
+ if (error != 0) {
+ *errnop = -1;
+ return (NS_NOTFOUND);
+ }
+ if (__copy_protoent(&pe, pptr, buffer, buflen) != 0) {
+ *errnop = -1;
+ return (NS_NOTFOUND);
+ }
+
+ *((struct protoent **)retval) = pptr;
+ return (NS_SUCCESS);
+}
+
+int
+getprotobynumber_r(int proto, struct protoent *pptr, char *buffer,
+ size_t buflen, struct protoent **result)
+{
+#ifdef NS_CACHING
+ static const nss_cache_info cache_info =
+ NS_COMMON_CACHE_INFO_INITIALIZER(
+ protocols, (void *)nss_lt_id,
+ __proto_id_func, __proto_marshal_func, __proto_unmarshal_func);
+#endif
+
+ static const ns_dtab dtab[] = {
+ { NSSRC_FILES, __files_getprotobynumber, NULL },
+#ifdef NS_CACHING
+ NS_CACHE_CB(&cache_info)
+#endif
+ { NULL, NULL, NULL }
+ };
+ int rv, ret_errno;
+
+ ret_errno = 0;
+ *result = NULL;
+ rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotobynumber_r",
+ defaultsrc, proto, pptr, buffer, buflen, &ret_errno);
+
+ if (rv == NS_SUCCESS)
+ return (0);
+ else
+ return (ret_errno);
+}
+
+struct protoent *
+getprotobynumber(int proto)
+{
+ struct protodata *pd;
+ struct protoent *rval;
+
+ if ((pd = __protodata_init()) == NULL)
+ return (NULL);
+ if (getprotobynumber_r(proto, &pd->proto, pd->data, sizeof(pd->data),
+ &rval) != 0)
+ return (NULL);
+ return (rval);
+}
==== //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/getprotoent.c#10 (text+ko) ====
@@ -35,311 +35,62 @@
static char sccsid[] = "@(#)getprotoent.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libc/net/getprotoent.c,v 1.6 2005/08/20 07:59:13 stefanf Exp $");
+__FBSDID("$FreeBSD: src/lib/libc/net/getprotoent.c,v 1.7 2006/04/15 16:20:27 ume Exp $");
+#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <errno.h>
#include <limits.h>
-#include <errno.h>
#include <netdb.h>
#include <nsswitch.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "namespace.h"
-#include "nss_tls.h"
#include "reentrant.h"
#include "un-namespace.h"
#include "netdb_private.h"
+#ifdef NS_CACHING
#include "nscache.h"
+#endif
+#include "nss_tls.h"
-/* nsswitch declarations */
-enum constants
-{
- SETPROTOENT = 1,
- ENDPROTOENT = 2,
- PROTOENT_STORAGE_INITIAL = 1 << 10, /* 1 KByte */
- PROTOENT_STORAGE_MAX = 1 << 20, /* 1 MByte */
-};
-
static const ns_src defaultsrc[] = {
{ NSSRC_FILES, NS_SUCCESS },
{ NULL, 0 }
};
-/* files backend declarations */
-struct files_state
-{
- FILE *fp;
- int stayopen;
-};
-static void files_endstate(void *);
-NSS_TLS_HANDLING(files);
+NETDB_THREAD_ALLOC(protoent_data)
+NETDB_THREAD_ALLOC(protodata)
-static int files_protoent(void *, void *, va_list);
-static int files_setprotoent(void *, void *, va_list);
-
-/* get** wrappers for get**_r functions declarations */
-struct protoent_state {
- struct protoent pe;
- char *buffer;
- size_t bufsize;
-};
-static void protoent_endstate(void *);
-NSS_TLS_HANDLING(protoent);
-
-union key {
- const char *name;
- int proto;
-};
-
-static int wrap_getprotobyname_r(union key, struct protoent *, char *,
- size_t, struct protoent **);
-static int wrap_getprotobynumber_r(union key, struct protoent *, char *,
- size_t, struct protoent **);
-static int wrap_getprotoent_r(union key, struct protoent *, char *,
- size_t, struct protoent **);
-static struct protoent *getpe(int (*fn)(union key, struct protoent *, char *,
- size_t, struct protoent **), union key);
-
-#ifdef NS_CACHING
-static int proto_id_func(char *, size_t *, va_list, void *);
-static int proto_marshal_func(char *, size_t *, void *, va_list, void *);
-static int proto_unmarshal_func(char *, size_t, void *, va_list, void *);
-#endif /* NS_CACHING */
-
-static int
-protoent_unpack(char *p, struct protoent *pe, char **aliases,
- size_t aliases_size, int *errnop)
+static void
+protoent_data_clear(struct protoent_data *ped)
{
- char *cp, **q, *endp;
- long l;
-
- if (*p == '#')
- return (-1);
- cp = strpbrk(p, "#\n");
- if (cp != NULL)
- *cp = '\0';
- pe->p_name = p;
- cp = strpbrk(p, " \t");
- if (cp == NULL)
- return (-1);
- *cp++ = '\0';
- while (*cp == ' ' || *cp == '\t')
- cp++;
- p = strpbrk(cp, " \t");
- if (p != NULL)
- *p++ = '\0';
- l = strtol(cp, &endp, 10);
- if (endp == cp || *endp != '\0' || l < 0 || l > USHRT_MAX)
- return -1;
- pe->p_proto = l;
- q = pe->p_aliases = aliases;
- if (p != NULL) {
- cp = p;
- while (cp && *cp) {
- if (*cp == ' ' || *cp == '\t') {
- cp++;
- continue;
- }
- if (q < &(aliases[aliases_size - 1]))
- *q++ = cp;
- else {
- *errnop = ERANGE;
- return -1;
- }
- cp = strpbrk(cp, " \t");
- if (cp != NULL)
- *cp++ = '\0';
- }
+ if (ped->fp) {
+ fclose(ped->fp);
+ ped->fp = NULL;
}
- *q = NULL;
- return (0);
-}
-
-/* files backend implementation */
-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);
}
-static int
-files_protoent(void *retval, void *mdata, va_list ap)
+static void
+protoent_data_free(void *ptr)
{
- char *name;
- int number;
- struct protoent *pe;
- char *buffer;
- size_t bufsize;
- int *errnop;
-
- char *line;
- size_t linesize;
- char **aliases;
- int aliases_size;
- char **rp;
-
- struct files_state *st;
- int rv;
- int stayopen;
- enum nss_lookup_type how;
-
- how = (enum nss_lookup_type)mdata;
- switch (how)
- {
- case nss_lt_name:
- name = va_arg(ap, char *);
- break;
- case nss_lt_id:
- number = va_arg(ap, int);
- break;
- case nss_lt_all:
- break;
- default:
- return (NS_NOTFOUND);
- }
-
- pe = va_arg(ap, struct protoent *);
- buffer = va_arg(ap, char *);
- bufsize = va_arg(ap, size_t);
- errnop = va_arg(ap, int *);
-
- *errnop = files_getstate(&st);
- if (*errnop != 0)
- return (NS_UNAVAIL);
-
- if (st->fp == NULL && (st->fp = fopen(_PATH_PROTOCOLS, "r")) == NULL) {
- *errnop = errno;
- return (NS_UNAVAIL);
- }
-
- if (how == nss_lt_all)
- stayopen = 1;
- else {
- rewind(st->fp);
- stayopen = st->stayopen;
- }
-
- do {
- if ((line = fgetln(st->fp, &linesize)) == NULL) {
- *errnop = errno;
- rv = NS_RETURN;
- break;
- }
-
- if (bufsize <= linesize + _ALIGNBYTES + sizeof(char *)) {
- *errnop = ERANGE;
- rv = NS_RETURN;
- break;
- }
+ struct protoent_data *ped = ptr;
- aliases = (char **)_ALIGN(&buffer[linesize+1]);
- aliases_size = (buffer + bufsize - (char *)aliases) /
- sizeof(char *);
- if (aliases_size < 1) {
- *errnop = ERANGE;
- rv = NS_RETURN;
- break;
- }
-
- memcpy(buffer, line, linesize);
- buffer[linesize] = '\0';
-
- rv = protoent_unpack(buffer, pe, aliases, aliases_size, errnop);
- if (rv != 0) {
- if (*errnop == 0) {
- rv = NS_NOTFOUND;
- continue;
- }
- else {
- rv = NS_RETURN;
- break;
- }
- }
-
- switch (how)
- {
- case nss_lt_name:
- if (strcmp(pe->p_name, name) == 0)
- goto done;
- for (rp = pe->p_aliases; *rp != NULL; rp++) {
- if (strcmp(*rp, name) == 0)
- goto done;
- }
- rv = NS_NOTFOUND;
- continue;
-done:
- rv = NS_SUCCESS;
- break;
- case nss_lt_id:
- rv = (pe->p_proto == number) ? NS_SUCCESS : NS_NOTFOUND;
- break;
- case nss_lt_all:
- rv = NS_SUCCESS;
- break;
- }
-
- } while (!(rv & NS_TERMINATE));
-
- if (!stayopen && st->fp!=NULL) {
- fclose(st->fp);
- st->fp = NULL;
- }
-
- if ((rv == NS_SUCCESS) && (retval != NULL))
- *((struct protoent **)retval) = pe;
-
- return (rv);
+ protoent_data_clear(ped);
+ free(ped);
}
-static int
-files_setprotoent(void *retval, void *mdata, va_list ap)
+static void
+protodata_free(void *ptr)
{
- struct files_state *st;
- int rv;
- int f;
-
- rv = files_getstate(&st);
- if (rv != 0)
- return (NS_UNAVAIL);
-
- switch ((enum constants)mdata)
- {
- case SETPROTOENT:
- f = va_arg(ap,int);
- if (st->fp == NULL)
- st->fp = fopen(_PATH_PROTOCOLS, "r");
- else
- rewind(st->fp);
- st->stayopen |= f;
- break;
- case ENDPROTOENT:
- if (st->fp != NULL) {
- fclose(st->fp);
- st->fp = NULL;
- }
- st->stayopen = 0;
- break;
- default:
- break;
- }
-
- return (NS_UNAVAIL);
+ free(ptr);
}
#ifdef NS_CACHING
-static int
-proto_id_func(char *buffer, size_t *buffer_size, va_list ap, void *cache_mdata)
+int
+__proto_id_func(char *buffer, size_t *buffer_size, va_list ap, void *cache_mdata)
{
char *name;
int proto;
@@ -391,8 +142,8 @@
}
-static int
-proto_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
+int
+__proto_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
void *cache_mdata)
{
char *name;
@@ -478,8 +229,8 @@
return (NS_SUCCESS);
}
-static int
-proto_unmarshal_func(char *buffer, size_t buffer_size, void *retval, va_list ap,
+int
+__proto_unmarshal_func(char *buffer, size_t buffer_size, void *retval, va_list ap,
void *cache_mdata)
{
char *name;
@@ -544,94 +295,206 @@
NSS_MP_CACHE_HANDLING(protocols);
#endif /* NS_CACHING */
+int
+__copy_protoent(struct protoent *pe, struct protoent *pptr, char *buf,
+ size_t buflen)
+{
+ char *cp;
+ int i, n;
+ int numptr, len;
+
+ /* Find out the amount of space required to store the answer. */
+ numptr = 1; /* NULL ptr */
+ len = (char *)ALIGN(buf) - buf;
+ for (i = 0; pe->p_aliases[i]; i++, numptr++) {
+ len += strlen(pe->p_aliases[i]) + 1;
+ }
+ len += strlen(pe->p_name) + 1;
+ len += numptr * sizeof(char*);
-/* get**_r functions implementation */
+ if (len > (int)buflen) {
+ errno = ERANGE;
+ return (-1);
+ }
+
+ /* copy protocol value*/
+ pptr->p_proto = pe->p_proto;
+
+ cp = (char *)ALIGN(buf) + numptr * sizeof(char *);
+
+ /* copy official name */
+ n = strlen(pe->p_name) + 1;
+ strcpy(cp, pe->p_name);
+ pptr->p_name = cp;
+ cp += n;
+
+ /* copy aliases */
+ pptr->p_aliases = (char **)ALIGN(buf);
+ for (i = 0 ; pe->p_aliases[i]; i++) {
+ n = strlen(pe->p_aliases[i]) + 1;
+ strcpy(cp, pe->p_aliases[i]);
+ pptr->p_aliases[i] = cp;
+ cp += n;
+ }
+ pptr->p_aliases[i] = NULL;
+
+ return (0);
+}
+
+void
+__setprotoent_p(int f, struct protoent_data *ped)
+{
+ if (ped->fp == NULL)
+ ped->fp = fopen(_PATH_PROTOCOLS, "r");
+ else
+ rewind(ped->fp);
+ ped->stayopen |= f;
+}
+
+void
+__endprotoent_p(struct protoent_data *ped)
+{
+ if (ped->fp) {
+ fclose(ped->fp);
+ ped->fp = NULL;
+ }
+ ped->stayopen = 0;
+}
+
+int
+__getprotoent_p(struct protoent *pe, struct protoent_data *ped)
+{
+ char *p;
+ char *cp, **q, *endp;
+ long l;
+
+ if (ped->fp == NULL && (ped->fp = fopen(_PATH_PROTOCOLS, "r")) == NULL)
+ return (-1);
+again:
+ if ((p = fgets(ped->line, sizeof ped->line, ped->fp)) == NULL)
+ return (-1);
+ if (*p == '#')
+ goto again;
+ cp = strpbrk(p, "#\n");
+ if (cp != NULL)
+ *cp = '\0';
+ pe->p_name = p;
+ cp = strpbrk(p, " \t");
+ if (cp == NULL)
+ goto again;
+ *cp++ = '\0';
+ while (*cp == ' ' || *cp == '\t')
+ cp++;
+ p = strpbrk(cp, " \t");
+ if (p != NULL)
+ *p++ = '\0';
+ l = strtol(cp, &endp, 10);
+ if (endp == cp || *endp != '\0' || l < 0 || l > USHRT_MAX)
+ goto again;
+ pe->p_proto = l;
+ q = pe->p_aliases = ped->aliases;
+ if (p != NULL) {
+ cp = p;
+ while (cp && *cp) {
+ if (*cp == ' ' || *cp == '\t') {
+ cp++;
+ continue;
+ }
+ if (q < &ped->aliases[_MAXALIASES - 1])
+ *q++ = cp;
+ cp = strpbrk(cp, " \t");
+ if (cp != NULL)
+ *cp++ = '\0';
+ }
+ }
+ *q = NULL;
+ return (0);
+}
+
int
-getprotobyname_r(const char *name, struct protoent *pe, char *buffer,
- size_t bufsize, struct protoent **result)
+__files_getprotoent_r(void *retval, void *mdata, va_list ap)
{
-#ifdef NS_CACHING
- static const nss_cache_info cache_info =
- NS_COMMON_CACHE_INFO_INITIALIZER(
- protocols, (void *)nss_lt_name,
- proto_id_func, proto_marshal_func, proto_unmarshal_func);
-#endif
+ struct protoent pe;
+ struct protoent_data *ped;
+
+ struct protoent *pptr;
+ char *buffer;
+ size_t buflen;
+ int *errnop;
+
+ pptr = va_arg(ap, struct protoent *);
+ buffer = va_arg(ap, char *);
+ buflen = va_arg(ap, size_t);
+ errnop = va_arg(ap, int *);
- static const ns_dtab dtab[] = {
- { NSSRC_FILES, files_protoent, (void *)nss_lt_name },
-#ifdef NS_CACHING
- NS_CACHE_CB(&cache_info)
-#endif
- { NULL, NULL, NULL }
- };
+ if ((ped = __protoent_data_init()) == NULL)
+ return (-1);
- int rv, ret_errno;
+ if (__getprotoent_p(&pe, ped) != 0) {
+ *errnop = errno;
+ return (NS_NOTFOUND);
+ }
- ret_errno = 0;
- *result = NULL;
- rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotobyname_r",
- defaultsrc, name, pe, buffer, bufsize, &ret_errno);
+ if (__copy_protoent(&pe, pptr, buffer, buflen) != 0) {
+ *errnop = errno;
+ return (NS_NOTFOUND);
+ }
- if (rv == NS_SUCCESS)
- return (0);
- else
- return (ret_errno);
+ *((struct protoent **)retval) = pptr;
+ return (NS_SUCCESS);
}
-int
-getprotobynumber_r(int number, struct protoent *pe, char *buffer,
- size_t bufsize, struct protoent **result)
+int
+__files_setprotoent(void *retval, void *mdata, va_list ap)
{
-#ifdef NS_CACHING
- static const nss_cache_info cache_info =
- NS_COMMON_CACHE_INFO_INITIALIZER(
- protocols, (void *)nss_lt_id,
- proto_id_func, proto_marshal_func, proto_unmarshal_func);
-#endif
+ struct protoent_data *ped;
+ int f;
+
+ f = va_arg(ap, int);
+ if ((ped = __protoent_data_init()) == NULL)
+ return (NS_UNAVAIL);
- static const ns_dtab dtab[] = {
- { NSSRC_FILES, files_protoent, (void *)nss_lt_id },
-#ifdef NS_CACHING
- NS_CACHE_CB(&cache_info)
-#endif
- { NULL, NULL, NULL }
- };
- int rv, ret_errno;
+ __setprotoent_p(f, ped);
+ return (NS_UNAVAIL);
+}
+
+int
+__files_endprotoent(void *retval, void *mdata, va_list ap)
+{
+ struct protoent_data *ped;
- ret_errno = 0;
- *result = NULL;
- rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotobynumber_r",
- defaultsrc, number, pe, buffer, bufsize, &ret_errno);
+ if ((ped = __protoent_data_init()) == NULL)
+ return (NS_UNAVAIL);
- if (rv == NS_SUCCESS)
- return (0);
- else
- return (ret_errno);
+ __endprotoent_p(ped);
+ return (NS_UNAVAIL);
}
int
-getprotoent_r(struct protoent *pe, char *buffer, size_t bufsize,
- struct protoent **result)
+getprotoent_r(struct protoent *pptr, char *buffer, size_t buflen,
+ struct protoent **result)
{
#ifdef NS_CACHING
static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER(
protocols, (void *)nss_lt_all,
- proto_marshal_func, proto_unmarshal_func);
+ __proto_marshal_func, __proto_unmarshal_func);
#endif
static const ns_dtab dtab[] = {
- { NSSRC_FILES, files_protoent, (void *)nss_lt_all },
+ { NSSRC_FILES, __files_getprotoent_r, (void *)nss_lt_all },
#ifdef NS_CACHING
NS_CACHE_CB(&cache_info)
#endif
{ NULL, NULL, NULL }
};
- int rv, ret_errno;
+
+ int rv, ret_errno;
+
ret_errno = 0;
*result = NULL;
rv = nsdispatch(result, dtab, NSDB_PROTOCOLS, "getprotoent_r",
- defaultsrc, pe, buffer, bufsize, &ret_errno);
+ defaultsrc, pptr, buffer, buflen, &ret_errno);
if (rv == NS_SUCCESS)
return (0);
@@ -649,7 +512,7 @@
#endif
static const ns_dtab dtab[] = {
- { NSSRC_FILES, files_setprotoent, (void *)SETPROTOENT },
+ { NSSRC_FILES, __files_setprotoent, NULL },
#ifdef NS_CACHING
NS_CACHE_CB(&cache_info)
#endif
@@ -660,8 +523,8 @@
stayopen);
}
-void
-endprotoent()
+void
+endprotoent(void)
{
#ifdef NS_CACHING
static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER(
@@ -670,7 +533,7 @@
#endif
static const ns_dtab dtab[] = {
- { NSSRC_FILES, files_setprotoent, (void *)ENDPROTOENT },
+ { NSSRC_FILES, __files_endprotoent, NULL },
#ifdef NS_CACHING
NS_CACHE_CB(&cache_info)
#endif
@@ -680,105 +543,15 @@
(void)nsdispatch(NULL, dtab, NSDB_PROTOCOLS, "endprotoent", defaultsrc);
}
-/* get** wrappers for get**_r functions implementation */
-static void
-protoent_endstate(void *p)
-{
- if (p == NULL)
- return;
-
- free(((struct protoent_state *)p)->buffer);
- free(p);
-}
-
-static int
-wrap_getprotobyname_r(union key key, struct protoent *pe, char *buffer,
- size_t bufsize, struct protoent **res)
-{
- return (getprotobyname_r(key.name, pe, buffer, bufsize, res));
-}
-
-static int
-wrap_getprotobynumber_r(union key key, struct protoent *pe, char *buffer,
- size_t bufsize, struct protoent **res)
-{
- return (getprotobynumber_r(key.proto, pe, buffer, bufsize, res));
-}
-
-static int
-wrap_getprotoent_r(union key key, struct protoent *pe, char *buffer,
- size_t bufsize, struct protoent **res)
-{
- return (getprotoent_r(pe, buffer, bufsize, res));
-}
-
-static struct protoent *
-getpe(int (*fn)(union key, struct protoent *, char *, size_t,
- struct protoent **), union key key)
-{
- int rv;
- struct protoent *res;
- struct protoent_state * st;
-
- rv=protoent_getstate(&st);
- if (rv != 0) {
- errno = rv;
- return NULL;
- }
-
- if (st->buffer == NULL) {
- st->buffer = malloc(PROTOENT_STORAGE_INITIAL);
- if (st->buffer == NULL)
- return (NULL);
- st->bufsize = PROTOENT_STORAGE_INITIAL;
- }
- do {
- rv = fn(key, &st->pe, st->buffer, st->bufsize, &res);
- if (res == NULL && rv == ERANGE) {
- free(st->buffer);
- if ((st->bufsize << 1) > PROTOENT_STORAGE_MAX) {
- st->buffer = NULL;
- errno = ERANGE;
- return (NULL);
- }
- st->bufsize <<= 1;
- st->buffer = malloc(st->bufsize);
- if (st->buffer == NULL)
- return (NULL);
- }
- } while (res == NULL && rv == ERANGE);
- if (rv != 0)
- errno = rv;
-
- return (res);
-}
-
struct protoent *
-getprotobyname(const char *name)
+getprotoent(void)
{
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list