PERFORCE change 99809 for review
Michael Bushkov
bushman at FreeBSD.org
Thu Jun 22 13:59:32 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=99809
Change 99809 by bushman at bushman_nss_ldap_cached on 2006/06/22 13:29:29
Cached has now agents (i.e. "perform-actual-lookup" option support) for all implemented nsswitch-databases, except shells. Shells database implementation should be reworked (nss-modules share the same static variables there) to allow this.
Affected files ...
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/Makefile.inc#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/group.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/group.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/hosts.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/hosts.h#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/net.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/net.h#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/passwd.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/passwd.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/proto.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/proto.h#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/rpc.c#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/rpc.h#2 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/services.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/services.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cached.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/debug.h#3 edit
Differences ...
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.c#3 (text) ====
@@ -29,8 +29,10 @@
__FBSDID("$FreeBSD: src/usr.sbin/cached/agent.c,v 1.1 2006/04/28 12:03:37 ume Exp $");
#include <assert.h>
+#include <nsswitch.h>
#include <string.h>
#include <stdlib.h>
+#include <stdarg.h>
#include "agent.h"
#include "debug.h"
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.h#3 (text) ====
@@ -29,9 +29,6 @@
#ifndef __CACHED_AGENT_H__
#define __CACHED_AGENT_H__
-#include <stdarg.h>
-#include <nsswitch.h>
-
extern int __isthreaded;
/* TLS handling routine obtained from libc/include/nss_tls.h */
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/Makefile.inc#3 (text) ====
@@ -1,3 +1,3 @@
# $FreeBSD: src/usr.sbin/cached/agents/Makefile.inc,v 1.1 2006/04/28 12:03:38 ume Exp $
-SRCS += passwd.c group.c services.c hosts.c
+SRCS += group.c hosts.c net.c passwd.c proto.c rpc.c services.c
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/group.c#3 (text) ====
@@ -40,6 +40,7 @@
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
+#include "../agent.h"
#include "../debug.h"
#include "group.h"
@@ -223,9 +224,8 @@
if ((result == NS_RETURN) && (error == ERANGE)) {
AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
if (AGENT_BUFFER_TLS_HANDLING_CHECK(st) != 0) {
- free(name);
- TRACE_OUT(group_lookup_func);
- return (NS_UNAVAIL);
+ result = NS_UNAVAIL;
+ break;
}
}
} while ((result == NS_RETURN) && (error == ERANGE));
@@ -246,8 +246,8 @@
if ((result == NS_RETURN) && (error == ERANGE)) {
AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
if (AGENT_BUFFER_TLS_HANDLING_CHECK(st) != 0) {
- TRACE_OUT(group_lookup_func);
- return (NS_UNAVAIL);
+ result = NS_UNAVAIL;
+ break;
}
}
} while ((result == NS_RETURN) && (error == ERANGE));
@@ -319,6 +319,7 @@
group_mp_destroy_func(void *mdata)
{
TRACE_IN(group_mp_destroy_func);
+ endgrent();
TRACE_OUT(group_mp_destroy_func);
}
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/group.h#3 (text) ====
@@ -26,7 +26,5 @@
* $FreeBSD: src/usr.sbin/cached/agents/group.h,v 1.1 2006/04/28 12:03:38 ume Exp $
*/
-#include "../agent.h"
-
extern struct agent *init_group_agent();
extern struct agent *init_group_mp_agent();
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/hosts.c#2 (text+ko) ====
@@ -28,7 +28,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-
#include <arpa/inet.h>
#include <arpa/nameser.h>
#include <sys/param.h>
@@ -46,6 +45,7 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
+#include "../agent.h"
#include "../debug.h"
#include "hosts.h"
@@ -61,7 +61,17 @@
AGENT_DECLARE_BUFFER_TLS_HANDLING(hostent);
+#ifndef _ALIGNBYTES
+#define _ALIGNBYTES ALIGNBYTES
+#endif
+#ifndef _ALIGN
+#define _ALIGN(x) ALIGN(x)
+#endif
+
+#define GETADDRINFO_OP_ID 0
+#define GETHOSTBY_OP_ID 1
+
static int
hostent_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
void *cache_mdata)
@@ -236,7 +246,7 @@
socklen_t len;
int type;
struct addrinfo hints, *ai_retval;
- int error, result, op_id;
+ int error, h_error, result, op_id;
size_t size;
TRACE_IN(hosts_lookup_func);
@@ -245,12 +255,12 @@
statp = __res_state();
if (statp == NULL) {
- TRACE_OUT(passwd_lookup_func);
+ TRACE_OUT(hosts_lookup_func);
return (NS_UNAVAIL);
}
if (key_size < sizeof(res_options) + sizeof(int)) {
- TRACE_OUT(passwd_lookup_func);
+ TRACE_OUT(hosts_lookup_func);
return (NS_UNAVAIL);
}
@@ -267,7 +277,7 @@
str = NULL;
switch (op_id) {
- case 0: /* getaddrinfo() */
+ case GETADDRINFO_OP_ID: /* getaddrinfo() */
memset(&hints, 0, sizeof(struct addrinfo));
if (key_size < sizeof(int) * 4) {
TRACE_OUT(hosts_lookup_func);
@@ -298,8 +308,8 @@
old_options = statp->options;
statp->options |= res_options;
- result = nsdispatch(&ai_retval, emptydtab, NSDB_HOSTS, "getaddrinfo",
- defaultsrc, str, &hints);
+ result = nsdispatch(&ai_retval, emptydtab, NSDB_HOSTS,
+ "getaddrinfo", defaultsrc, str, &hints);
if (result == NS_SUCCESS)
result = agent_marshal_results(out_buffer, out_size,
@@ -308,7 +318,7 @@
statp->options = old_options;
break;
- case 1: /* gethostby**() */
+ case GETHOSTBY_OP_ID: /* gethostby**() */
if (key_size < sizeof(enum nss_lookup_type) + sizeof(int)) {
TRACE_OUT(hosts_lookup_func);
return (NS_UNAVAIL);
@@ -318,12 +328,12 @@
key += sizeof(enum nss_lookup_type);
key_size -= sizeof(enum nss_lookup_type);
+ memcpy(&type, key, sizeof(int));
+ key += sizeof(int);
+ key_size -= sizeof(int);
+
switch (lookup_type) {
- case nss_lt_name:
- memcpy(&type, key, sizeof(int));
- key += sizeof(int);
- key_size -= sizeof(int);
-
+ case nss_lt_name:
size = key_size + 1;
str = (char *)malloc(size);
assert(str != NULL);
@@ -331,10 +341,6 @@
memcpy(str, key, key_size);
break;
case nss_lt_id:
- memcpy(&type, key, sizeof(int));
- key += sizeof(int);
- key_size -= sizeof(int);
-
memcpy(&len, key, sizeof(socklen_t));
key += sizeof(socklen_t);
key_size -= sizeof(socklen_t);
@@ -363,48 +369,52 @@
switch (lookup_type) {
case nss_lt_name:
do {
- result = nsdispatch(&h_retval, emptydtab, NSDB_HOSTS,
- "gethostbyname2_r", defaultsrc, str, type,
- &he, h_st->buffer, h_st->bufsize, &error);
+ result = nsdispatch(&h_retval, emptydtab,
+ NSDB_HOSTS, "gethostbyname2_r",
+ defaultsrc, str, type,
+ &he, h_st->buffer, h_st->bufsize,
+ &error, &h_error);
- if ((result == NS_RETURN) && (error == ERANGE)) {
- AGENT_BUFFER_TLS_HANDLING_RESIZE(h_st);
- if (AGENT_BUFFER_TLS_HANDLING_CHECK(h_st) != 0) {
- free(str);
- statp->options = old_options;
- TRACE_OUT(hosts_lookup_func);
- return (NS_UNAVAIL);
- }
+ if ((result == NS_RETURN) && (error == ERANGE)) {
+ AGENT_BUFFER_TLS_HANDLING_RESIZE(h_st);
+ if (AGENT_BUFFER_TLS_HANDLING_CHECK(h_st) != 0) {
+ free(str);
+ statp->options = old_options;
+ TRACE_OUT(hosts_lookup_func);
+ return (NS_UNAVAIL);
+ }
}
} while ((result == NS_RETURN) && (error == ERANGE));
if (result == NS_SUCCESS)
- result = agent_marshal_results(out_buffer, out_size,
- hostent_marshal_func, (void *)nss_lt_name,
- &h_retval, str, type, &he,
- h_st->buffer, h_st->bufsize, &error);
+ result = agent_marshal_results(out_buffer, out_size,
+ hostent_marshal_func, (void *)nss_lt_name,
+ &h_retval, str, type, &he,
+ h_st->buffer, h_st->bufsize,
+ &error, &h_error);
break;
case nss_lt_all:
do {
- result = nsdispatch(&h_retval, emptydtab, NSDB_HOSTS,
- "gethostbyaddr_r", defaultsrc, (void *)addr, len, type,
- &he, h_st->buffer, h_st->bufsize, &error);
+ result = nsdispatch(&h_retval, emptydtab, NSDB_HOSTS,
+ "gethostbyaddr_r", defaultsrc, (void *)addr,
+ len, type, &he, h_st->buffer, h_st->bufsize,
+ &error);
- if ((result == NS_RETURN) && (error == ERANGE)) {
- AGENT_BUFFER_TLS_HANDLING_RESIZE(h_st);
- if (AGENT_BUFFER_TLS_HANDLING_CHECK(h_st) != 0) {
- statp->options = old_options;
- TRACE_OUT(hosts_lookup_func);
- return (NS_UNAVAIL);
- }
+ if ((result == NS_RETURN) && (error == ERANGE)) {
+ AGENT_BUFFER_TLS_HANDLING_RESIZE(h_st);
+ if (AGENT_BUFFER_TLS_HANDLING_CHECK(h_st) != 0) {
+ statp->options = old_options;
+ TRACE_OUT(hosts_lookup_func);
+ return (NS_UNAVAIL);
}
+ }
} while ((result == NS_RETURN) && (error == ERANGE));
if (result == NS_SUCCESS)
- result = agent_marshal_results(out_buffer, out_size,
- hostent_marshal_func, (void *)nss_lt_name,
- &h_retval, (void *)addr, len, type, &he,
- h_st->buffer, h_st->bufsize, &error);
+ result = agent_marshal_results(out_buffer, out_size,
+ hostent_marshal_func, (void *)nss_lt_name,
+ &h_retval, (void *)addr, len, type, &he,
+ h_st->buffer, h_st->bufsize, &error);
break;
default:
/*SHOULD NOT BE REACHED */
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/hosts.h#2 (text+ko) ====
@@ -26,6 +26,4 @@
* $FreeBSD$
*/
-#include "../agent.h"
-
extern struct agent *init_hosts_agent();
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/net.c#2 (text+ko) ====
@@ -1,0 +1,288 @@
+/*-
+ * Copyright (c) 2006 Michael Bushkov <bushman at freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+ #include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <assert.h>
+#include <netdb.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+#include <pthread.h>
+#include <pthread_np.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include <nsswitch.h>
+#include "../agent.h"
+#include "../debug.h"
+#include "net.h"
+
+static const ns_src defaultsrc[] = {
+ { NSSRC_FILES, NS_SUCCESS },
+ { NSSRC_DNS, NS_SUCCESS },
+ { 0 }
+};
+
+static int networks_marshal_func(char *, size_t *, void *, va_list, void *);
+static int networks_lookup_func(const char *, size_t, char **, size_t *);
+
+AGENT_DECLARE_BUFFER_TLS_HANDLING(netent);
+
+#ifndef _ALIGNBYTES
+#define _ALIGNBYTES ALIGNBYTES
+#endif
+
+#ifndef _ALIGN
+#define _ALIGN(x) ALIGN(x)
+#endif
+
+static int
+networks_marshal_func(char *buffer, size_t *buffer_size, void *retval,
+ va_list ap, void *cache_mdata)
+{
+ char *name;
+ uint32_t net;
+ int type;
+ struct netent *ne;
+ char *orig_buf;
+ size_t orig_buf_size;
+
+ struct netent new_ne;
+ size_t desired_size, size, aliases_size;
+ char *p;
+ char **alias;
+
+ switch ((enum nss_lookup_type)cache_mdata) {
+ case nss_lt_name:
+ name = va_arg(ap, char *);
+ break;
+ case nss_lt_id:
+ net = va_arg(ap, uint32_t);
+ type = va_arg(ap, int);
+ break;
+ case nss_lt_all:
+ break;
+ default:
+ /* should be unreachable */
+ return (NS_UNAVAIL);
+ }
+
+ ne = va_arg(ap, struct netent *);
+ orig_buf = va_arg(ap, char *);
+ orig_buf_size = va_arg(ap, size_t);
+
+ desired_size = _ALIGNBYTES + sizeof(struct netent) + sizeof(char *);
+ if (ne->n_name != NULL)
+ desired_size += strlen(ne->n_name) + 1;
+
+ if (ne->n_aliases != NULL) {
+ aliases_size = 0;
+ for (alias = ne->n_aliases; *alias; ++alias) {
+ desired_size += strlen(*alias) + 1;
+ ++aliases_size;
+ }
+
+ desired_size += _ALIGNBYTES +
+ (aliases_size + 1) * sizeof(char *);
+ }
+
+ if (*buffer_size < desired_size) {
+ /* this assignment is here for future use */
+ *buffer_size = desired_size;
+ return (NS_RETURN);
+ }
+
+ memcpy(&new_ne, ne, sizeof(struct netent));
+
+ *buffer_size = desired_size;
+ memset(buffer, 0, desired_size);
+ p = buffer + sizeof(struct netent) + sizeof(char *);
+ memcpy(buffer + sizeof(struct netent), &p, sizeof(char *));
+ p = (char *)_ALIGN(p);
+
+ if (new_ne.n_name != NULL) {
+ size = strlen(new_ne.n_name);
+ memcpy(p, new_ne.n_name, size);
+ new_ne.n_name = p;
+ p += size + 1;
+ }
+
+ if (new_ne.n_aliases != NULL) {
+ p = (char *)_ALIGN(p);
+ memcpy(p, new_ne.n_aliases, sizeof(char *) * aliases_size);
+ new_ne.n_aliases = (char **)p;
+ p += sizeof(char *) * (aliases_size + 1);
+
+ for (alias = new_ne.n_aliases; *alias; ++alias) {
+ size = strlen(*alias);
+ memcpy(p, *alias, size);
+ *alias = p;
+ p += size + 1;
+ }
+ }
+
+ memcpy(buffer, &new_ne, sizeof(struct netent));
+ return (NS_SUCCESS);
+}
+
+static int
+networks_lookup_func(const char *key, size_t key_size, char **out_buffer,
+ size_t *out_size)
+{
+ struct netent_state *st;
+ struct netent ne, *retval;
+ enum nss_lookup_type lookup_type;
+ char *name;
+ uint32_t net;
+ int type;
+ int error, h_error, result;
+ size_t size;
+
+ TRACE_IN(networks_lookup_func);
+ assert(out_buffer != NULL);
+ assert(out_size != NULL);
+
+ if (key_size < sizeof(enum nss_lookup_type)) {
+ TRACE_OUT(networks_lookup_func);
+ return (NS_UNAVAIL);
+ }
+ memcpy(&lookup_type, key, sizeof(enum nss_lookup_type));
+
+ name = NULL;
+ switch (lookup_type) {
+ case nss_lt_name:
+ size = key_size - sizeof(enum nss_lookup_type) + 1;
+ name = (char *)malloc(size);
+ assert(name != NULL);
+ memset(name, 0, size);
+ memcpy(name, key + sizeof(enum nss_lookup_type), size - 1);
+ break;
+ case nss_lt_id:
+ if (key_size < sizeof(enum nss_lookup_type) +
+ sizeof(uint32_t) + sizeof(int)) {
+ TRACE_OUT(networks_lookup_func);
+ return (NS_UNAVAIL);
+ }
+
+ memcpy(&net, key + sizeof(enum nss_lookup_type),
+ sizeof(uint32_t));
+ memcpy(&type, key + sizeof(enum nss_lookup_type) +
+ sizeof(uint32_t), sizeof(int));
+ break;
+ default:
+ TRACE_OUT(networks_lookup_func);
+ return (NS_UNAVAIL);
+ }
+
+ result = netent_getstate(&st);
+ AGENT_BUFFER_TLS_HANDLING_INIT(st);
+ if (AGENT_BUFFER_TLS_HANDLING_CHECK(st) != 0) {
+ free(name);
+ TRACE_OUT(networks_lookup_func);
+ return (NS_UNAVAIL);
+ }
+
+ switch (lookup_type) {
+ case nss_lt_name:
+ do {
+ result = nsdispatch(&retval, emptydtab, NSDB_NETWORKS,
+ "getnetbyname_r", defaultsrc, name,
+ &ne, st->buffer, st->bufsize, &error, &h_error);
+
+ if ((result == NS_RETURN) && (error == ERANGE)) {
+ AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
+ if (AGENT_BUFFER_TLS_HANDLING_CHECK(st) != 0) {
+ result = NS_UNAVAIL;
+ break;
+ }
+ }
+ } while ((result == NS_RETURN) && (error == ERANGE));
+
+ if (result == NS_SUCCESS)
+ result = agent_marshal_results(out_buffer, out_size,
+ networks_marshal_func, (void *)nss_lt_name,
+ retval, name, &ne,
+ st->buffer, st->bufsize, &error, &h_error);
+
+ break;
+ case nss_lt_id:
+ do {
+ result = nsdispatch(&retval, emptydtab, NSDB_NETWORKS,
+ "getnetbyaddr_r", defaultsrc, net, type,
+ &ne, st->buffer, st->bufsize, &error, &h_error);
+
+ if ((result == NS_RETURN) && (error == ERANGE)) {
+ AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
+ if (AGENT_BUFFER_TLS_HANDLING_CHECK(st) != 0) {
+ result = NS_UNAVAIL;
+ break;
+ }
+ }
+ } while ((result == NS_RETURN) && (error == ERANGE));
+
+ if (result == NS_SUCCESS)
+ result = agent_marshal_results(out_buffer, out_size,
+ networks_marshal_func,
+ (void *)nss_lt_id, retval, net, type,
+ &ne, st->buffer, st->bufsize, &error);
+ break;
+ default:
+ /* SHOULD NOT BE REACHED */
+ break;
+ }
+
+ free(name);
+ TRACE_OUT(networks_lookup_func);
+ return (result);
+}
+
+struct agent *
+init_networks_agent()
+{
+ struct common_agent *retval;
+
+ TRACE_IN(init_networks_agent);
+ retval = (struct common_agent *)malloc(sizeof(struct common_agent));
+ assert(retval != NULL);
+ memset(retval, 0, sizeof(struct common_agent));
+
+ retval->parent.name = strdup("networks");
+ assert(retval->parent.name != NULL);
+
+ retval->parent.type = COMMON_AGENT;
+ retval->lookup_func = networks_lookup_func;
+
+ TRACE_OUT(init_networks_agent);
+ return ((struct agent *)retval);
+}
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/net.h#2 (text+ko) ====
@@ -1,0 +1,29 @@
+/*-
+ * Copyright (c) 2006 Michael Bushkov <bushman at freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+extern struct agent *init_networks_agent();
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/passwd.c#3 (text) ====
@@ -38,6 +38,7 @@
#include <pwd.h>
#include <string.h>
#include <stdlib.h>
+#include "../agent.h"
#include "../debug.h"
#include "passwd.h"
@@ -175,7 +176,7 @@
assert(out_buffer != NULL);
assert(out_size != NULL);
- if (key_size < sizeof(enum nss_lookup_type) + 1) {
+ if (key_size < sizeof(enum nss_lookup_type)) {
TRACE_OUT(passwd_lookup_func);
return (NS_UNAVAIL);
}
@@ -222,9 +223,8 @@
if ((result == NS_RETURN) && (error == ERANGE)) {
AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
if (AGENT_BUFFER_TLS_HANDLING_CHECK(st) != 0) {
- free(login);
- TRACE_OUT(passwd_lookup_func);
- return (NS_UNAVAIL);
+ result = NS_UNAVAIL;
+ break;
}
}
} while ((result == NS_RETURN) && (error == ERANGE));
@@ -238,15 +238,15 @@
break;
case nss_lt_id:
do {
- result = nsdispatch(&retval, emptydtab, NSDB_SERVICES,
+ result = nsdispatch(&retval, emptydtab, NSDB_PASSWD,
"getpwuid_r", defaultsrc, uid,
&pwd, st->buffer, st->bufsize, &error);
if ((result == NS_RETURN) && (error == ERANGE)) {
AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
if (AGENT_BUFFER_TLS_HANDLING_CHECK(st) != 0) {
- TRACE_OUT(passwd_lookup_func);
- return (NS_UNAVAIL);
+ result = NS_UNAVAIL;
+ break;
}
}
} while ((result == NS_RETURN) && (error == ERANGE));
@@ -318,6 +318,7 @@
passwd_mp_destroy_func(void *mdata)
{
TRACE_IN(passwd_mp_destroy_func);
+ endpwent();
TRACE_OUT(passwd_mp_destroy_func);
}
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/passwd.h#3 (text) ====
@@ -26,7 +26,5 @@
* $FreeBSD: src/usr.sbin/cached/agents/passwd.h,v 1.1 2006/04/28 12:03:38 ume Exp $
*/
-#include "../agent.h"
-
extern struct agent *init_passwd_agent();
extern struct agent *init_passwd_mp_agent();
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/proto.c#2 (text+ko) ====
@@ -1,0 +1,362 @@
+/*-
+ * Copyright (c) 2006 Michael Bushkov <bushman at freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+ #include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <assert.h>
+#include <errno.h>
+#include <limits.h>
+#include <netdb.h>
+#include <pthread.h>
+#include <pthread_np.h>
+#include <nsswitch.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "../agent.h"
+#include "../debug.h"
+#include "proto.h"
+
+static const ns_src defaultsrc[] = {
+ { NSSRC_FILES, NS_SUCCESS },
+ { NULL, 0 }
+};
+
+static int protocols_marshal_func(char *, size_t *, void *, va_list, void *);
+static int protocols_lookup_func(const char *, size_t, char **, size_t *);
+static void *protocols_mp_init_func();
+static int protocols_mp_lookup_func(char **out_buffer, size_t *out_size, void *mdata);
+static void protocols_mp_destroy_func(void *mdata);
+
+AGENT_DECLARE_BUFFER_TLS_HANDLING(protoent);
+
+#ifndef _ALIGNBYTES
+#define _ALIGNBYTES ALIGNBYTES
+#endif
+
+#ifndef _ALIGN
+#define _ALIGN(x) ALIGN(x)
+#endif
+
+static int
+protocols_marshal_func(char *buffer, size_t *buffer_size, void *retval,
+ va_list ap, void *cache_mdata)
+{
+ char *name;
+ int num;
+ struct protoent *proto;
+ char *orig_buf;
+ size_t orig_buf_size;
+
+ struct protoent new_proto;
+ size_t desired_size, size, aliases_size;
+ char *p;
+ char **alias;
+
+ switch ((enum nss_lookup_type)cache_mdata) {
+ case nss_lt_name:
+ name = va_arg(ap, char *);
+ break;
+ case nss_lt_id:
+ num = va_arg(ap, int);
+ break;
+ case nss_lt_all:
+ break;
+ default:
+ /* should be unreachable */
+ return (NS_UNAVAIL);
+ }
+
+ proto = va_arg(ap, struct protoent *);
+ orig_buf = va_arg(ap, char *);
+ orig_buf_size = va_arg(ap, size_t);
+
+ desired_size = _ALIGNBYTES + sizeof(struct protoent) + sizeof(char *);
+ if (proto->p_name != NULL)
+ desired_size += strlen(proto->p_name) + 1;
+
+ if (proto->p_aliases != NULL) {
+ aliases_size = 0;
+ for (alias = proto->p_aliases; *alias; ++alias) {
+ desired_size += strlen(*alias) + 1;
+ ++aliases_size;
+ }
+
+ desired_size += _ALIGNBYTES + (aliases_size + 1) *
+ sizeof(char *);
+ }
+
+ if (*buffer_size < desired_size) {
+ /* this assignment is here for future use */
+ *buffer_size = desired_size;
+ return (NS_RETURN);
+ }
+
+ memcpy(&new_proto, proto, sizeof(struct protoent));
+
+ *buffer_size = desired_size;
+ memset(buffer, 0, desired_size);
+ p = buffer + sizeof(struct protoent) + sizeof(char *);
+ memcpy(buffer + sizeof(struct protoent), &p, sizeof(char *));
+ p = (char *)_ALIGN(p);
+
+ if (new_proto.p_name != NULL) {
+ size = strlen(new_proto.p_name);
+ memcpy(p, new_proto.p_name, size);
+ new_proto.p_name = p;
+ p += size + 1;
+ }
+
+ if (new_proto.p_aliases != NULL) {
+ p = (char *)_ALIGN(p);
+ memcpy(p, new_proto.p_aliases, sizeof(char *) * aliases_size);
+ new_proto.p_aliases = (char **)p;
+ p += sizeof(char *) * (aliases_size + 1);
+
+ for (alias = new_proto.p_aliases; *alias; ++alias) {
+ size = strlen(*alias);
+ memcpy(p, *alias, size);
+ *alias = p;
+ p += size + 1;
+ }
+ }
+
+ memcpy(buffer, &new_proto, sizeof(struct protoent));
+ return (NS_SUCCESS);
+}
+
+static int
+protocols_lookup_func(const char *key, size_t key_size, char **out_buffer,
+ size_t *out_size)
+{
+ struct protoent_state *st;
+ struct protoent pe, *retval;
+ enum nss_lookup_type lookup_type;
+ char *name;
+ int num;
+ int error, result;
+ size_t size;
+
+ TRACE_IN(protocols_lookup_func);
+ assert(out_buffer != NULL);
+ assert(out_size != NULL);
+
+ if (key_size < sizeof(enum nss_lookup_type)) {
+ TRACE_OUT(protocols_lookup_func);
+ return (NS_UNAVAIL);
+ }
+ memcpy(&lookup_type, key, sizeof(enum nss_lookup_type));
+
+ name = NULL;
+ switch (lookup_type) {
+ case nss_lt_name:
+ size = key_size - sizeof(enum nss_lookup_type) + 1;
+ name = (char *)malloc(size);
+ assert(name != NULL);
+ memset(name, 0, size);
+ memcpy(name, key + sizeof(enum nss_lookup_type), size - 1);
+ break;
+ case nss_lt_id:
+ if (key_size < sizeof(enum nss_lookup_type) +
+ sizeof(int)) {
+ TRACE_OUT(protocols_lookup_func);
+ return (NS_UNAVAIL);
+ }
+
+ memcpy(&num, key + sizeof(enum nss_lookup_type), sizeof(int));
+ break;
+ default:
+ TRACE_OUT(protocols_lookup_func);
+ return (NS_UNAVAIL);
+ }
+
+ result = protoent_getstate(&st);
+ AGENT_BUFFER_TLS_HANDLING_INIT(st);
+ if (AGENT_BUFFER_TLS_HANDLING_CHECK(st) != 0) {
+ free(name);
+ TRACE_OUT(protocols_lookup_func);
+ return (NS_UNAVAIL);
+ }
+
+ switch (lookup_type) {
+ case nss_lt_name:
+ do {
+ result = nsdispatch(&retval, emptydtab, NSDB_PROTOCOLS,
+ "getprotobyname_r", defaultsrc, name,
+ &pe, st->buffer, st->bufsize, &error);
+
+ if ((result == NS_RETURN) && (error == ERANGE)) {
+ AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
+ if (AGENT_BUFFER_TLS_HANDLING_CHECK(st) != 0) {
+ result = NS_UNAVAIL;
+ break;
+ }
+ }
+ } while ((result == NS_RETURN) && (error == ERANGE));
+
+ if (result == NS_SUCCESS)
+ result = agent_marshal_results(out_buffer, out_size,
+ protocols_marshal_func, (void *)nss_lt_name,
+ retval, name, &pe,
+ st->buffer, st->bufsize, &error);
+
+ break;
+ case nss_lt_id:
+ do {
+ result = nsdispatch(&retval, emptydtab, NSDB_PROTOCOLS,
+ "getprotobynumber_r", defaultsrc, num,
+ &pe, st->buffer, st->bufsize, &error);
+
+ if ((result == NS_RETURN) && (error == ERANGE)) {
+ AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
+ if (AGENT_BUFFER_TLS_HANDLING_CHECK(st) != 0) {
+ result = NS_UNAVAIL;
+ break;
+ }
+ }
+ } while ((result == NS_RETURN) && (error == ERANGE));
+
+ if (result == NS_SUCCESS)
+ result = agent_marshal_results(out_buffer, out_size,
+ protocols_marshal_func,
+ (void *)nss_lt_id, retval, num,
+ &pe, st->buffer, st->bufsize, &error);
+ break;
+ default:
+ /* SHOULD NOT BE REACHED */
+ break;
+ }
+
+ free(name);
+ TRACE_OUT(protocols_lookup_func);
+ return (result);
+}
+
+static void *
+protocols_mp_init_func()
+{
+ TRACE_IN(protocols_mp_init_func);
+ setprotoent(1);
+ TRACE_OUT(protocols_mp_init_func);
+
+ return (NULL);
+}
+
+static int
+protocols_mp_lookup_func(char **out_buffer, size_t *out_size, void *mdata)
+{
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list