PERFORCE change 104649 for review
Michael Bushkov
bushman at FreeBSD.org
Mon Aug 21 02:32:32 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=104649
Change 104649 by bushman at bushman_nss_ldap_cached_make on 2006/08/21 02:31:48
- Precaching implemented
- Malloc style and some issues fixed
- DUPLICATE_RUNTIME_ENV condition and duplicate_runtime_env function added
Affected files ...
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/Makefile#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.c#6 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.h#6 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/Makefile.inc#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/group.c#6 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/group.h#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/hosts.c#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/hosts.h#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/net.c#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/net.h#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/passwd.c#6 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/passwd.h#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/proto.c#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/proto.h#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/rpc.c#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/rpc.h#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/services.c#6 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/services.h#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cached.8#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cached.c#6 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cached.conf.5#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cachedcli.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cachedcli.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cachelib.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cachelib.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cacheplcs.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/cacheplcs.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/config.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/config.h#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/debug.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/debug.h#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/hashtable.h#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/log.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/log.h#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/mp_rs_query.c#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/mp_rs_query.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/mp_ws_query.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/mp_ws_query.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/parser.c#4 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/parser.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/protocol.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/protocol.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/query.c#5 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/query.h#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/singletons.c#3 edit
.. //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/singletons.h#3 edit
Differences ...
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/Makefile#4 (text) ====
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.c#6 (text) ====
@@ -33,8 +33,14 @@
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
+#include "cachelib.h"
+#include "config.h"
+#include "debug.h"
+#include "log.h"
+#include "singletons.h"
#include "agent.h"
-#include "debug.h"
+
+#define EIDSTR_SIZE (sizeof(uid_t) + sizeof(gid_t))
const ns_dtab emptydtab[] = {
{ NULL, NULL, NULL }
@@ -82,7 +88,8 @@
if (rv == NS_RETURN) {
*bufsize = size;
if (*bufsize <= AGENT_BUFFER_STORAGE_MAX) {
- *buffer = (char *)realloc(*buffer, *bufsize);
+ free(*buffer);
+ *buffer = malloc(*bufsize);
if (*buffer == NULL)
return (NS_UNAVAIL);
@@ -96,6 +103,52 @@
free(*buffer);
*buffer = NULL;
*bufsize = 0;
+ } else
+ *bufsize = size;
+
+ va_end(ap);
+ return (rv);
+}
+
+int
+agent_id_args(char **buffer, size_t *bufsize,
+ agent_id_func id_func, void *cache_mdata, ...)
+{
+ va_list ap;
+ size_t size;
+ int rv;
+
+ va_start(ap, cache_mdata);
+ if (*buffer == NULL) {
+ *buffer = malloc(AGENT_KEY_BUFFER_STORAGE_INITIAL);
+ if (*buffer == NULL)
+ return (NS_UNAVAIL);
+ *bufsize = AGENT_KEY_BUFFER_STORAGE_INITIAL;
+ }
+
+ size = *bufsize - EIDSTR_SIZE;
+ rv = id_func(*buffer + EIDSTR_SIZE, &size, ap, cache_mdata);
+ if (rv == NS_RETURN) {
+ *bufsize = size;
+ if (*bufsize <= AGENT_KEY_BUFFER_STORAGE_MAX) {
+ free(*buffer);
+ *buffer = malloc(*bufsize);
+ if (*buffer == NULL)
+ return (NS_UNAVAIL);
+
+ size = *bufsize - EIDSTR_SIZE;
+ rv = id_func(*buffer + EIDSTR_SIZE, &size, ap,
+ cache_mdata);
+ }
+ }
+
+ if (rv != NS_SUCCESS) {
+ free(*buffer);
+ *buffer = NULL;
+ *bufsize = 0;
+ } else {
+ *bufsize = size + EIDSTR_SIZE;
+ memset(*buffer, 0, EIDSTR_SIZE);
}
va_end(ap);
@@ -108,7 +161,7 @@
struct agent_table *retval;
TRACE_IN(init_agent_table);
- retval = (struct agent_table *)malloc(sizeof(struct agent_table));
+ retval = malloc(sizeof(struct agent_table));
if (retval == NULL) {
TRACE_OUT(init_agent_table);
return (NULL);
@@ -134,8 +187,7 @@
}
new_agents_num = at->agents_num + 1;
- new_agents = (struct agent **)malloc(sizeof(struct agent *) *
- new_agents_num);
+ new_agents = malloc(sizeof(struct agent *) * new_agents_num);
if (new_agents == NULL) {
TRACE_OUT(register_agent);
return (-1);
@@ -187,3 +239,120 @@
free(at);
TRACE_OUT(destroy_agent_table);
}
+
+int
+agent_precache_results(struct configuration_entry *config_entry,
+ struct multipart_agent *mp_agent)
+{
+ cache_mp_write_session ws;
+ char *buffer, *keybuf, *dec_name, *en_bkp;
+ size_t buffer_size, keybuf_size;
+ void *mdata, *keygen_mdata, *retval;
+ cache_entry c_entry;
+ int res, res2;
+
+ TRACE_IN(agent_precache_results);
+
+ if (mp_agent->mp_keygen_func == NULL) {
+ LOG_ERR_2("agent_precache_results",
+ "'%s' does not support precaching", config_entry->name);
+ TRACE_OUT(agent_precache_results);
+ return (NS_UNAVAIL);
+ }
+
+ configuration_lock_rdlock(s_configuration);
+ c_entry = find_cache_entry(s_cache,
+ config_entry->mp_cache_params.entry_name);
+ configuration_unlock(s_configuration);
+
+ configuration_lock_entry(config_entry, CELT_MULTIPART);
+ if (c_entry == INVALID_CACHE) {
+ dec_name = strdup(config_entry->mp_cache_params.entry_name);
+ if (dec_name == NULL) {
+ configuration_unlock_entry(config_entry, CELT_MULTIPART);
+ TRACE_OUT(agent_precache_results);
+ return (NS_UNAVAIL);
+ }
+
+ en_bkp = config_entry->mp_cache_params.entry_name;
+ config_entry->mp_cache_params.entry_name = dec_name;
+ register_cache_entry(s_cache, (struct cache_entry_params *)
+ &config_entry->mp_cache_params);
+ config_entry->mp_cache_params.entry_name = en_bkp;
+
+ configuration_lock_rdlock(s_configuration);
+ c_entry = find_cache_entry(s_cache,
+ config_entry->mp_cache_params.entry_name);
+ configuration_unlock(s_configuration);
+
+ if (c_entry == INVALID_CACHE) {
+ configuration_unlock_entry(config_entry, CELT_MULTIPART);
+ LOG_ERR_2("agent_precache_results",
+ "can't register multipart cache entry'%s'",
+ config_entry->name);
+ TRACE_OUT(agent_precache_results);
+ return (NS_UNAVAIL);
+ }
+ configuration_entry_add_mp_cache_entry(config_entry,
+ c_entry);
+ }
+
+ ws = open_cache_mp_write_session(c_entry);
+ configuration_unlock_entry(config_entry, CELT_MULTIPART);
+
+ keygen_mdata = NULL;
+ mdata = mp_agent->mp_init_func();
+ if (ws != NULL) {
+ do {
+ buffer = NULL;
+
+ res = mp_agent->mp_lookup_func(&buffer, &buffer_size, &retval,
+ mdata);
+ if ((res & NS_TERMINATE) && (buffer != NULL)) {
+ configuration_lock_entry(config_entry, CELT_MULTIPART);
+ if (cache_mp_write(ws, buffer, buffer_size) != 0) {
+ abandon_cache_mp_write_session(ws);
+ ws = NULL;
+ }
+ configuration_unlock_entry(config_entry,
+ CELT_MULTIPART);
+
+ configuration_lock_entry(config_entry, CELT_POSITIVE);
+
+ keybuf = NULL;
+ keybuf_size = 0;
+ while ((res2 = mp_agent->mp_keygen_func(&keybuf,
+ &keybuf_size, retval, &keygen_mdata)) ==
+ NS_SUCCESS) {
+ if (keybuf == NULL)
+ break;
+
+ cache_write(config_entry->positive_cache_entry,
+ keybuf, keybuf_size, buffer,
+ buffer_size);
+
+ free(keybuf);
+ keybuf = NULL;
+ keybuf_size = 0;
+ }
+ configuration_unlock_entry(config_entry, CELT_POSITIVE);
+
+ free(buffer);
+ buffer = NULL;
+ } else {
+ configuration_lock_entry(config_entry,
+ CELT_MULTIPART);
+ close_cache_mp_write_session(ws);
+ ws = NULL;
+ configuration_unlock_entry(config_entry,
+ CELT_MULTIPART);
+
+ buffer = NULL;
+ }
+ } while ((res & NS_TERMINATE) && (ws != NULL));
+ mp_agent->mp_keygen_func(NULL, NULL, NULL, &keygen_mdata);
+ }
+
+ TRACE_OUT(agent_precache_results);
+ return (NS_SUCCESS);
+}
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agent.h#6 (text) ====
@@ -76,6 +76,7 @@
#define AGENT_DECLARE_BUFFER_TLS_HANDLING(name) \
struct name##_state { \
+ struct name inst; \
char *buffer; \
size_t bufsize; \
}; \
@@ -94,6 +95,12 @@
AGENT_BUFFER_STORAGE_MAX = 1 << 20, /* 1 MByte */
};
+enum agent_key_buffer_constants
+{
+ AGENT_KEY_BUFFER_STORAGE_INITIAL = 1 << 8,
+ AGENT_KEY_BUFFER_STORAGE_MAX = 1 << 20,
+};
+
#define AGENT_BUFFER_TLS_HANDLING_INIT(st) \
{ \
if (st->buffer == NULL) { \
@@ -125,9 +132,11 @@
};
typedef int (*agent_marshal_func)(char *, size_t *, void *, va_list, void *);
+typedef int (*agent_id_func)(char *, size_t *, va_list, void *);
typedef int (*agent_lookup_func)(const char *, size_t, char **, size_t *);
typedef void *(*agent_mp_init_func)();
-typedef int (*agent_mp_lookup_func)(char **, size_t *, void *);
+typedef int (*agent_mp_lookup_func)(char **, size_t *, void *, void *);
+typedef int (*agent_mp_keygen_func)(char **, size_t *, void *, void *);
typedef void (*agent_mp_destroy_func)(void *);
struct agent {
@@ -145,6 +154,7 @@
agent_mp_init_func mp_init_func;
agent_mp_lookup_func mp_lookup_func;
+ agent_mp_keygen_func mp_keygen_func;
agent_mp_destroy_func mp_destroy_func;
};
@@ -157,10 +167,15 @@
extern int agent_marshal_results(char **, size_t *, agent_marshal_func,
void *, void *, ...);
+extern int agent_id_args(char **, size_t *, agent_id_func,
+ void *, ...);
extern struct agent_table *init_agent_table();
extern int register_agent(struct agent_table *, struct agent *);
extern struct agent *find_agent(struct agent_table *, const char *,
enum agent_type);
extern void destroy_agent_table(struct agent_table *);
+
+extern int agent_precache_results(struct configuration_entry *,
+ struct multipart_agent *);
#endif
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/Makefile.inc#5 (text) ====
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/group.c#6 (text) ====
@@ -40,20 +40,30 @@
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
+#include "../debug.h"
+#include "../cachelib.h"
+#include "../config.h"
+#include "../debug.h"
+#include "../log.h"
+#include "../singletons.h"
#include "../agent.h"
-#include "../debug.h"
#include "group.h"
+#define GROUP_KEYGEN_BYNAME (0)
+#define GROUP_KEYGEN_BYGID (1)
+#define GROUP_KEYGEN_END (2)
+
static const ns_src defaultsrc[] = {
{ NSSRC_COMPAT, NS_SUCCESS },
{ NULL, 0 }
};
-
+static int group_id_func(char *, size_t *, va_list, void *);
static int group_marshal_func(char *, size_t *, void *, va_list, void *);
static int group_lookup_func(const char *, size_t, char **, size_t *);
static void *group_mp_init_func();
-static int group_mp_lookup_func(char **out_buffer, size_t *out_size, void *mdata);
+static int group_mp_lookup_func(char **, size_t *, void *, void *);
+static int group_mp_keygen_func(char **, size_t *, void *, void *);
static void group_mp_destroy_func(void *mdata);
AGENT_DECLARE_BUFFER_TLS_HANDLING(group);
@@ -67,6 +77,58 @@
#endif
static int
+group_id_func(char *buffer, size_t *buffer_size, va_list ap, void *cache_mdata)
+{
+ char *name;
+ gid_t gid;
+
+ size_t desired_size, size;
+ int res = NS_UNAVAIL;
+ enum nss_lookup_type lookup_type;
+
+
+ lookup_type = (enum nss_lookup_type)cache_mdata;
+ switch (lookup_type) {
+ case nss_lt_name:
+ name = va_arg(ap, char *);
+ size = strlen(name);
+ desired_size = sizeof(enum nss_lookup_type) + size + 1;
+ if (desired_size > *buffer_size) {
+ res = NS_RETURN;
+ goto fin;
+ }
+
+ memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type));
+ memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1);
+
+ res = NS_SUCCESS;
+ break;
+ case nss_lt_id:
+ gid = va_arg(ap, gid_t);
+ desired_size = sizeof(enum nss_lookup_type) + sizeof(gid_t);
+ if (desired_size > *buffer_size) {
+ res = NS_RETURN;
+ goto fin;
+ }
+
+ memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type));
+ memcpy(buffer + sizeof(enum nss_lookup_type), &gid,
+ sizeof(gid_t));
+
+ res = NS_SUCCESS;
+ break;
+ default:
+ /* should be unreachable */
+ return (NS_UNAVAIL);
+ }
+
+fin:
+ *buffer_size = desired_size;
+ return (res);
+}
+
+
+static int
group_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
void *cache_mdata)
{
@@ -122,7 +184,7 @@
}
memcpy(&new_grp, grp, sizeof(struct group));
- //memset(buffer, 0, desired_size);
+ memset(buffer, 0, desired_size);
*buffer_size = desired_size;
p = buffer + sizeof(struct group) + sizeof(char *);
@@ -166,7 +228,7 @@
size_t *out_size)
{
struct group_state *st;
- struct group grp, *retval;
+ struct group *retval;
enum nss_lookup_type lookup_type;
char *name;
gid_t gid;
@@ -187,12 +249,11 @@
switch (lookup_type) {
case nss_lt_name:
size = key_size - sizeof(enum nss_lookup_type) + 1;
- name = (char *)malloc(size);
+ name = malloc(size);
if (name == NULL) {
TRACE_OUT(group_lookup_func);
return (NS_UNAVAIL);
}
- //memset(name, 0, size);
name[size - 1] = '\0';
memcpy(name, key + sizeof(enum nss_lookup_type), size - 1);
break;
@@ -223,7 +284,7 @@
do {
result = nsdispatch(&retval, emptydtab, NSDB_GROUP,
"getgrnam_r", defaultsrc, name,
- &grp, st->buffer, st->bufsize, &error);
+ &st->inst, st->buffer, st->bufsize, &error);
if ((result == NS_RETURN) && (error == ERANGE)) {
AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
@@ -237,7 +298,7 @@
if (result == NS_SUCCESS)
result = agent_marshal_results(out_buffer, out_size,
group_marshal_func, (void *)nss_lt_name,
- retval, name, &grp,
+ retval, name, &st->inst,
st->buffer, st->bufsize, &error);
break;
@@ -245,7 +306,7 @@
do {
result = nsdispatch(&retval, emptydtab, NSDB_GROUP,
"getgrgid_r", defaultsrc, gid,
- &grp, st->buffer, st->bufsize, &error);
+ &st->inst, st->buffer, st->bufsize, &error);
if ((result == NS_RETURN) && (error == ERANGE)) {
AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
@@ -260,7 +321,7 @@
result = agent_marshal_results(out_buffer, out_size,
group_marshal_func,
(void *)nss_lt_id, retval, gid,
- &grp, st->buffer, st->bufsize, &error);
+ &st->inst, st->buffer, st->bufsize, &error);
break;
default:
/* SHOULD NOT BE REACHED */
@@ -283,10 +344,10 @@
}
static int
-group_mp_lookup_func(char **out_buffer, size_t *out_size, void *mdata)
+group_mp_lookup_func(char **out_buffer, size_t *out_size, void *retval,
+ void *mdata)
{
struct group_state *st;
- struct group grp, *retval;
int result, error;
TRACE_IN(group_mp_lookup_func);
@@ -297,8 +358,8 @@
return (NS_UNAVAIL);
do {
- result = nsdispatch(&retval, emptydtab, NSDB_GROUP,
- "getgrent_r", defaultsrc, &grp, st->buffer,
+ result = nsdispatch(retval, emptydtab, NSDB_GROUP,
+ "getgrent_r", defaultsrc, &st->inst, st->buffer,
st->bufsize, &error);
if ((result == NS_RETURN) && (error == ERANGE)) {
@@ -311,14 +372,59 @@
if (result == NS_SUCCESS) {
result = agent_marshal_results(out_buffer,
out_size, group_marshal_func,
- (void *)nss_lt_all, retval, &grp,
- st->buffer, st->bufsize, &error);
+ (void *)nss_lt_all, *((void **)retval),
+ &st->inst, st->buffer, st->bufsize, &error);
}
TRACE_OUT(group_mp_lookup_func);
return (result);
}
+int
+group_mp_keygen_func(char **out_buffer, size_t *out_size,
+ void *result, void *mdata)
+{
+ struct group *grp;
+ int rv, *conv_type;
+
+ TRACE_IN(group_mp_keygen_func);
+ grp = (struct group *)result;
+ conv_type = *((int **)mdata);
+
+ if (grp == NULL) {
+ free(conv_type);
+ *((int **)mdata) = NULL;
+ return (NS_UNAVAIL);
+ }
+
+ if (conv_type == NULL) {
+ conv_type = malloc(sizeof(int));
+ *conv_type = GROUP_KEYGEN_BYNAME;
+ *((int **)mdata) = conv_type;
+ }
+
+ switch (*conv_type) {
+ case GROUP_KEYGEN_BYNAME:
+ rv = agent_id_args(out_buffer, out_size, group_id_func,
+ (void *)nss_lt_name, grp->gr_name);
+ *conv_type = GROUP_KEYGEN_BYGID;
+ break;
+ case GROUP_KEYGEN_BYGID:
+ rv = agent_id_args(out_buffer, out_size, group_id_func,
+ (void *)nss_lt_id, grp->gr_gid);
+ *conv_type = GROUP_KEYGEN_END;
+ break;
+ case GROUP_KEYGEN_END:
+ default:
+ *conv_type = GROUP_KEYGEN_BYNAME;
+ rv = NS_NOTFOUND;
+ break;
+ }
+
+ TRACE_OUT(group_mp_keygen_func);
+ return (rv);
+}
+
static void
group_mp_destroy_func(void *mdata)
{
@@ -333,7 +439,7 @@
struct common_agent *retval;
TRACE_IN(init_group_agent);
- retval = (struct common_agent *)malloc(sizeof(struct common_agent));
+ retval = malloc(sizeof(struct common_agent));
if (retval == NULL) {
TRACE_OUT(init_group_agent);
return (NULL);
@@ -360,8 +466,7 @@
struct multipart_agent *retval;
TRACE_IN(init_group_mp_agent);
- retval = (struct multipart_agent *)malloc(
- sizeof(struct multipart_agent));
+ retval = malloc(sizeof(struct multipart_agent));
if (retval == NULL) {
TRACE_OUT(init_group_mp_agent);
return (NULL);
@@ -377,6 +482,7 @@
retval->parent.type = MULTIPART_AGENT;
retval->mp_init_func = group_mp_init_func;
retval->mp_lookup_func = group_mp_lookup_func;
+ retval->mp_keygen_func = group_mp_keygen_func;
retval->mp_destroy_func = group_mp_destroy_func;
TRACE_OUT(init_group_mp_agent);
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/group.h#5 (text) ====
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/hosts.c#5 (text+ko) ====
@@ -45,8 +45,13 @@
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
+#include "../debug.h"
+#include "../cachelib.h"
+#include "../config.h"
+#include "../debug.h"
+#include "../log.h"
+#include "../singletons.h"
#include "../agent.h"
-#include "../debug.h"
#include "hosts.h"
static const ns_src defaultsrc[] = {
@@ -133,7 +138,7 @@
}
memcpy(&new_ht, ht, sizeof(struct hostent));
- //memset(buffer, 0, desired_size);
+ memset(buffer, 0, desired_size);
*buffer_size = desired_size;
p = buffer + sizeof(struct hostent) + sizeof(char *);
@@ -205,7 +210,7 @@
return (NS_RETURN);
}
- //memset(buffer, 0, desired_size);
+ memset(buffer, 0, desired_size);
p = buffer;
memcpy(p, &ai_size, sizeof(size_t));
@@ -301,12 +306,11 @@
key_size -= sizeof(int);
size = key_size + 1;
- str = (char *)malloc(size);
+ str = malloc(size);
if (str == NULL) {
TRACE_OUT(hosts_lookup_func);
return (NS_UNAVAIL);
}
- //memset(str, 0, size);
str[size - 1] = '\0';
memcpy(str, key, key_size);
@@ -339,12 +343,11 @@
switch (lookup_type) {
case nss_lt_name:
size = key_size + 1;
- str = (char *)malloc(size);
+ str = malloc(size);
if (str == NULL) {
TRACE_OUT(hosts_lookup_func);
return (NS_UNAVAIL);
}
- //memset(str, 0, size);
str[size - 1] = '\0';
memcpy(str, key, key_size);
break;
@@ -447,7 +450,7 @@
struct common_agent *retval;
TRACE_IN(init_hosts_agent);
- retval = (struct common_agent *)malloc(sizeof(struct common_agent));
+ retval = malloc(sizeof(struct common_agent));
if (retval == NULL) {
TRACE_OUT(init_hosts_agent);
return (NULL);
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/hosts.h#4 (text+ko) ====
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/net.c#5 (text+ko) ====
@@ -44,8 +44,13 @@
#include <string.h>
#include <stdarg.h>
#include <nsswitch.h>
+#include "../debug.h"
+#include "../cachelib.h"
+#include "../config.h"
+#include "../debug.h"
+#include "../log.h"
+#include "../singletons.h"
#include "../agent.h"
-#include "../debug.h"
#include "net.h"
static const ns_src defaultsrc[] = {
@@ -126,7 +131,7 @@
memcpy(&new_ne, ne, sizeof(struct netent));
*buffer_size = desired_size;
- //memset(buffer, 0, 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);
@@ -183,12 +188,11 @@
switch (lookup_type) {
case nss_lt_name:
size = key_size - sizeof(enum nss_lookup_type) + 1;
- name = (char *)malloc(size);
+ name = malloc(size);
if (name == NULL) {
TRACE_OUT(networks_lookup_func);
return (NS_UNAVAIL);
}
- //memset(name, 0, size);
name[size - 1] = '\0';
memcpy(name, key + sizeof(enum nss_lookup_type), size - 1);
break;
@@ -277,7 +281,7 @@
struct common_agent *retval;
TRACE_IN(init_networks_agent);
- retval = (struct common_agent *)malloc(sizeof(struct common_agent));
+ retval = malloc(sizeof(struct common_agent));
if (retval == NULL) {
TRACE_OUT(init_networks_agent);
return (NULL);
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/net.h#4 (text+ko) ====
==== //depot/projects/soc2006/nss_ldap_cached/src/usr.sbin/cached/agents/passwd.c#6 (text) ====
@@ -38,25 +38,84 @@
#include <pwd.h>
#include <string.h>
#include <stdlib.h>
+#include "../debug.h"
+#include "../cachelib.h"
+#include "../config.h"
+#include "../debug.h"
+#include "../log.h"
+#include "../singletons.h"
#include "../agent.h"
-#include "../debug.h"
#include "passwd.h"
+#define PASSWD_KEYGEN_BYNAME (0)
+#define PASSWD_KEYGEN_BYUID (1)
+#define PASSWD_KEYGEN_END (2)
+
static const ns_src defaultsrc[] = {
{ NSSRC_COMPAT, NS_SUCCESS },
{ NULL, 0 }
};
-
+static int passwd_id_func(char *, size_t *, va_list, void *);
static int passwd_marshal_func(char *, size_t *, void *, va_list, void *);
static int passwd_lookup_func(const char *, size_t, char **, size_t *);
static void *passwd_mp_init_func();
-static int passwd_mp_lookup_func(char **out_buffer, size_t *out_size, void *mdata);
-static void passwd_mp_destroy_func(void *mdata);
+static int passwd_mp_lookup_func(char **, size_t *, void *, void *);
+static int passwd_mp_keygen_func(char **, size_t *, void *, void *);
+static void passwd_mp_destroy_func(void *);
AGENT_DECLARE_BUFFER_TLS_HANDLING(passwd);
static int
+passwd_id_func(char *buffer, size_t *buffer_size, va_list ap, void *cache_mdata)
+{
+ char *name;
+ uid_t uid;
+ size_t size, desired_size;
+ int res = NS_UNAVAIL;
+ enum nss_lookup_type lookup_type;
+
+ lookup_type = (enum nss_lookup_type)cache_mdata;
+ switch (lookup_type) {
+ case nss_lt_name:
+ name = va_arg(ap, char *);
+ size = strlen(name);
+ desired_size = sizeof(enum nss_lookup_type) + size + 1;
+ if (desired_size > *buffer_size) {
+ res = NS_RETURN;
+ goto fin;
+ }
+
+ memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type));
+ memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1);
+
+ res = NS_SUCCESS;
+ break;
+ case nss_lt_id:
+ uid = va_arg(ap, uid_t);
+ desired_size = sizeof(enum nss_lookup_type) + sizeof(uid_t);
+ if (desired_size > *buffer_size) {
+ res = NS_RETURN;
+ goto fin;
+ }
+
+ memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type));
+ memcpy(buffer + sizeof(enum nss_lookup_type), &uid,
+ sizeof(uid_t));
+
+ res = NS_SUCCESS;
+ break;
+ default:
+ /* should be unreachable */
+ return (NS_UNAVAIL);
+ }
+
+fin:
+ *buffer_size = desired_size;
+ return (res);
+}
+
+static int
passwd_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
void *cache_mdata)
{
@@ -108,7 +167,7 @@
}
memcpy(&new_pwd, pwd, sizeof(struct passwd));
- //memset(buffer, 0, desired_size);
+ memset(buffer, 0, desired_size);
*buffer_size = desired_size;
p = buffer + sizeof(struct passwd) + sizeof(char *);
@@ -165,7 +224,7 @@
size_t *out_size)
{
struct passwd_state *st;
- struct passwd pwd, *retval;
+ struct passwd *retval;
enum nss_lookup_type lookup_type;
char *login;
uid_t uid;
@@ -186,12 +245,11 @@
switch (lookup_type) {
case nss_lt_name:
size = key_size - sizeof(enum nss_lookup_type) + 1;
- login = (char *)malloc(size);
+ login = malloc(size);
if (login == NULL) {
TRACE_OUT(passwd_lookup_func);
return (NS_UNAVAIL);
}
- //memset(login, 0, size);
login[size - 1] ='\0';
memcpy(login, key + sizeof(enum nss_lookup_type), size - 1);
break;
@@ -222,7 +280,7 @@
do {
result = nsdispatch(&retval, emptydtab, NSDB_PASSWD,
"getpwnam_r", defaultsrc, login,
- &pwd, st->buffer, st->bufsize, &error);
+ &st->inst, st->buffer, st->bufsize, &error);
if ((result == NS_RETURN) && (error == ERANGE)) {
AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
@@ -236,7 +294,7 @@
if (result == NS_SUCCESS)
result = agent_marshal_results(out_buffer, out_size,
passwd_marshal_func, (void *)nss_lt_name,
- retval, login, &pwd,
+ retval, login, &st->inst,
st->buffer, st->bufsize, &error);
break;
@@ -244,7 +302,7 @@
do {
result = nsdispatch(&retval, emptydtab, NSDB_PASSWD,
"getpwuid_r", defaultsrc, uid,
- &pwd, st->buffer, st->bufsize, &error);
+ &st->inst, st->buffer, st->bufsize, &error);
if ((result == NS_RETURN) && (error == ERANGE)) {
AGENT_BUFFER_TLS_HANDLING_RESIZE(st);
@@ -259,7 +317,7 @@
result = agent_marshal_results(out_buffer, out_size,
passwd_marshal_func,
(void *)nss_lt_id, retval, uid,
- &pwd, st->buffer, st->bufsize, &error);
+ &st->inst, st->buffer, st->bufsize, &error);
break;
default:
/* SHOULD NOT BE REACHED */
@@ -282,10 +340,10 @@
}
static int
-passwd_mp_lookup_func(char **out_buffer, size_t *out_size, void *mdata)
+passwd_mp_lookup_func(char **out_buffer, size_t *out_size, void *retval,
+ void *mdata)
{
struct passwd_state *st;
- struct passwd pwd, *retval;
int result, error;
TRACE_IN(passwd_mp_lookup_func);
@@ -296,8 +354,8 @@
return (NS_UNAVAIL);
do {
- result = nsdispatch(&retval, emptydtab, NSDB_PASSWD,
- "getpwent_r", defaultsrc, &pwd, st->buffer,
+ result = nsdispatch(retval, emptydtab, NSDB_PASSWD,
+ "getpwent_r", defaultsrc, &st->inst, st->buffer,
st->bufsize, &error);
if ((result == NS_RETURN) && (error == ERANGE)) {
@@ -309,15 +367,60 @@
if (result == NS_SUCCESS) {
result = agent_marshal_results(out_buffer,
- out_size, passwd_marshal_func,
- (void *)nss_lt_all, retval, &pwd,
- st->buffer, st->bufsize, &error);
+ out_size, passwd_marshal_func, (void *)nss_lt_all,
+ *((void **)retval), &st->inst, st->buffer,
+ st->bufsize, &error);
}
TRACE_OUT(passwd_mp_lookup_func);
return (result);
}
+static int
+passwd_mp_keygen_func(char **out_buffer, size_t *out_size,
+ void *result, void *mdata)
+{
+ struct passwd *pwd;
+ int rv, *conv_type;
+
+ TRACE_IN(passwd_mp_keygen_type);
+ pwd = (struct passwd *)result;
+ conv_type = *((int **)mdata);
+
+ if (pwd == NULL) {
+ free(conv_type);
+ *((int **)mdata) = NULL;
+ return (NS_UNAVAIL);
+ }
+
+ if (conv_type == NULL) {
+ conv_type = malloc(sizeof(int));
+ *conv_type = PASSWD_KEYGEN_BYNAME;
+ *((int **)mdata) = conv_type;
+ }
+
+ switch (*conv_type) {
+ case PASSWD_KEYGEN_BYNAME:
+ rv = agent_id_args(out_buffer, out_size, passwd_id_func,
+ (void *)nss_lt_name, pwd->pw_name);
+ *conv_type = PASSWD_KEYGEN_BYUID;
+ break;
+ case PASSWD_KEYGEN_BYUID:
+ rv = agent_id_args(out_buffer, out_size, passwd_id_func,
+ (void *)nss_lt_id, pwd->pw_uid);
+ *conv_type = PASSWD_KEYGEN_END;
+ break;
+ case PASSWD_KEYGEN_END:
+ default:
+ *conv_type = PASSWD_KEYGEN_BYNAME;
+ rv = NS_NOTFOUND;
+ break;
+ }
+
+ TRACE_OUT(passwd_mp_keygen_type);
+ return (rv);
+}
+
static void
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list