From owner-p4-projects@FreeBSD.ORG Tue Nov 22 14:36:38 2005 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 82F1616A421; Tue, 22 Nov 2005 14:36:37 +0000 (GMT) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3C19D16A420 for ; Tue, 22 Nov 2005 14:36:37 +0000 (GMT) (envelope-from soc-bushman@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 9B73043D7E for ; Tue, 22 Nov 2005 14:36:20 +0000 (GMT) (envelope-from soc-bushman@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.1/8.13.1) with ESMTP id jAMEaHWR051683 for ; Tue, 22 Nov 2005 14:36:17 GMT (envelope-from soc-bushman@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.1/8.13.1/Submit) id jAMEaHsi051680 for perforce@freebsd.org; Tue, 22 Nov 2005 14:36:17 GMT (envelope-from soc-bushman@freebsd.org) Date: Tue, 22 Nov 2005 14:36:17 GMT Message-Id: <200511221436.jAMEaHsi051680@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to soc-bushman@freebsd.org using -f From: soc-bushman To: Perforce Change Reviews Cc: Subject: PERFORCE change 87074 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Nov 2005 14:36:38 -0000 http://perforce.freebsd.org/chv.cgi?CH=87074 Change 87074 by soc-bushman@soc-bushman_stinger on 2005/11/22 14:36:04 comments added to the libc sources several significant bugfixes in the daemon Affected files ... .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/Makefile#10 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/Makefile#15 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agent.c#7 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agent.h#7 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/Makefile.inc#10 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/group.c#7 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/group.h#7 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/hosts.c#10 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/hosts.h#10 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/passwd.c#10 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/passwd.h#10 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/services.c#10 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/services.h#10 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.8#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf.5#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/hashtable.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.c#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.h#14 edit .. //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/startup/cached#9 edit .. //depot/projects/soc2005/nsswitch_cached/src/include/nscache.h#7 edit .. //depot/projects/soc2005/nsswitch_cached/src/include/nscachedcli.h#5 edit .. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nscache.c#7 edit .. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nscachedcli.c#7 edit .. //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nsdispatch.c#11 edit Differences ... ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/Makefile#10 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/Makefile#15 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agent.c#7 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agent.h#7 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/Makefile.inc#10 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/group.c#7 (text+ko) ==== @@ -128,16 +128,14 @@ assert(buffer != NULL); assert(buffer_size != NULL); - TRACE_INT(key_size); if (key_size < sizeof(enum nss_lookup_type)) { TRACE_OUT(group_lookup_func); return (NS_UNAVAIL); } memcpy(&lookup_type, key, sizeof(enum nss_lookup_type)); - TRACE_INT(lookup_type); + switch (lookup_type) { case nss_lt_name: - TRACE_POINT(); size = key_size - sizeof(enum nss_lookup_type) + 1; name = (char *)malloc(size); assert(name != NULL); @@ -145,18 +143,15 @@ memcpy(name, key + sizeof(enum nss_lookup_type), size - 1); break; case nss_lt_id: - TRACE_POINT(); if (key_size < sizeof(enum nss_lookup_type) + sizeof(gid_t)) { TRACE_OUT(passwd_lookup_func); return (NS_UNAVAIL); } - TRACE_POINT(); memcpy(&gid, key + sizeof(enum nss_lookup_type), sizeof(gid_t)); break; default: - TRACE_POINT(); TRACE_OUT(group_lookup_func); return (NS_UNAVAIL); } @@ -168,7 +163,6 @@ free(name); break; case nss_lt_id: - TRACE_INT(gid); result = getgrgid(gid); break; default: @@ -177,7 +171,6 @@ } if (result != NULL) { - TRACE_POINT(); group_marshal_func(result, NULL, buffer_size); *buffer = (char *)malloc(*buffer_size); assert(*buffer != NULL); ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/group.h#7 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/hosts.c#10 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/hosts.h#10 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/passwd.c#10 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/passwd.h#10 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/services.c#10 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/agents/services.h#10 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.8#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.c#14 (text+ko) ==== @@ -253,7 +253,7 @@ retval->queue = kqueue(); assert(retval->queue != -1); - EV_SET(&eventlist, retval->sockfd, EVFILT_READ, EV_ADD | EV_CLEAR, + EV_SET(&eventlist, retval->sockfd, EVFILT_READ, EV_ADD | EV_ONESHOT, 0, 0, 0); memset(&timeout, 0, sizeof(struct timespec)); kevent(retval->queue, &eventlist, 1, NULL, 0, &timeout); @@ -281,8 +281,6 @@ struct timespec timeout; struct query_state *qstate; - struct sockaddr addr; - socklen_t addr_len; int fd; int res; @@ -290,11 +288,10 @@ gid_t egid; TRACE_IN(accept_connection); - addr_len = sizeof(struct sockaddr); - fd = accept(event_data->ident, &addr, &addr_len); + fd = accept(event_data->ident, NULL, NULL); if (fd == -1) { LOG_ERR_2("accept_connection", "error %d during accept()", - errno); + errno); TRACE_OUT(accept_connection); return; } @@ -319,7 +316,7 @@ EV_SET(&eventlist[1], fd, EVFILT_READ, EV_ADD | EV_ONESHOT, NOTE_LOWAT, qstate->kevent_watermark, qstate); res = kevent(env->queue, eventlist, 2, NULL, 0, &timeout); - + TRACE_OUT(accept_connection); } @@ -519,7 +516,7 @@ struct query_state *qstate; TRACE_IN(process_timer_event); - LOG_MSG_2("processing_timer_event", "timer event received - " + LOG_MSG_2("process_timer_event", "timer event received - " "abandoning request"); qstate = (struct query_state *)event_data->udata; destroy_query_state(qstate); @@ -538,7 +535,7 @@ struct timespec timeout; const int eventlist_size = 1; struct kevent eventlist[eventlist_size]; - int nevents; + int nevents, i; TRACE_MSG("=> processing_loop"); memset(&timeout, 0, sizeof(struct timespec)); @@ -555,9 +552,19 @@ struct kevent *event_data; event_data = &eventlist[0]; - if (event_data->ident == env->sockfd) - accept_connection(event_data, env, config); - else { + if (event_data->ident == env->sockfd) { + for (i = 0; i < event_data->data; ++i) + accept_connection(event_data, env, config); + + EV_SET(eventlist, s_runtime_env->sockfd, + EVFILT_READ, EV_ADD | EV_ONESHOT, + 0, 0, 0); + memset(&timeout, 0, + sizeof(struct timespec)); + kevent(s_runtime_env->queue, eventlist, + 1, NULL, 0, &timeout); + + } else { switch (event_data->filter) { case EVFILT_READ: case EVFILT_WRITE: ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf#14 (text+ko) ==== @@ -1,7 +1,6 @@ # # Default caching daemon configuration file # - enable-cache passwd yes enable-cache group yes enable-cache hosts yes ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cached.conf.5#14 (text+ko) ==== @@ -97,4 +97,4 @@ .Aq bushman@rsu.ru .Sh "BUGS" To report bugs or suggestions please mail me -.Aq bushman@rsu.ru. +.Aq bushman@rsu.ru ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.c#14 (text+ko) ==== @@ -381,7 +381,6 @@ item = policy->get_first_item_func(policy); while ((item != NULL) && (continue_func(entry, item) == 1)) { next_item = policy->get_next_item_func(policy, item); - TRACE_PTR(next_item); connected_item = item->connected_item; policy->remove_item_func(policy, item); @@ -390,30 +389,20 @@ ht_key.key = item->key; ht_key.key_size = item->key_size; - TRACE_POINT(); hash = HASHTABLE_CALCULATE_HASH(cache_ht_, &entry->items, &ht_key); assert(hash >= 0); assert(hash < HASHTABLE_ENTRIES_COUNT(&entry->items)); - TRACE_POINT(); ht_item = HASHTABLE_GET_ENTRY(&(entry->items), hash); - TRACE_POINT(); ht_item_data = HASHTABLE_ENTRY_FIND(cache_ht_, ht_item, &ht_key); assert(ht_item_data != NULL); - TRACE_POINT(); - TRACE_POINT(); - TRACE_PTR(ht_item_data->key); - TRACE_INT(ht_item_data->key_size); free(ht_item_data->key); - TRACE_POINT(); free(ht_item_data->value); - TRACE_POINT(); HASHTABLE_ENTRY_REMOVE(cache_ht_, ht_item, ht_item_data); --entry->items_size; - TRACE_POINT(); policy->destroy_item_func(item); if (connected_item != NULL) { @@ -756,7 +745,6 @@ free(find_res->key); free(find_res->value); - HASHTABLE_ENTRY_REMOVE(cache_ht_, item, find_res); connected_item = find_res->fifo_policy_item->connected_item; @@ -774,6 +762,7 @@ common_entry->policies[0]->destroy_item_func( find_res->fifo_policy_item); + HASHTABLE_ENTRY_REMOVE(cache_ht_, item, find_res); --common_entry->items_size; } } @@ -1213,7 +1202,6 @@ if (ht_item_data != NULL) { item = ht_item_data->fifo_policy_item; connected_item = item->connected_item; - common_entry->policies[0]->remove_item_func( common_entry->policies[0], ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cachelib.h#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.c#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/cacheplcs.h#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.c#14 (text+ko) ==== @@ -353,10 +353,12 @@ config_entry->mp_cache_entries_size); assert(new_mp_entries != NULL); new_mp_entries[0] = c_entry; + if (config_entry->mp_cache_entries_size - 1 > 0) { memcpy(new_mp_entries + 1, config_entry->mp_cache_entries, - config_entry->mp_cache_entries_size - 1); + (config_entry->mp_cache_entries_size - 1) * + sizeof(cache_entry)); } old_mp_entries = config_entry->mp_cache_entries; @@ -369,7 +371,6 @@ configuration_entry_cache_mp_sort_cmp); TRACE_OUT(configuration_entry_add_mp_cache_entry); - return (0); } ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/config.h#14 (text+ko) ==== @@ -40,16 +40,16 @@ #define DEFAULT_COMMON_ENTRY_TIMEOUT 10 #define DEFAULT_MP_ENTRY_TIMEOUT 60 -#define DEFAULT_CACHE_HT_SIZE 1 //257 +#define DEFAULT_CACHE_HT_SIZE 257 #define INITIAL_ENTRIES_CAPACITY 8 #define DEFAULT_SOCKET_PATH "/var/run/cached" #define DEFAULT_PIDFILE_PATH "/var/run/cached.pid" -#define DEFAULT_POSITIVE_ELEMENTS_SIZE 1 // (2048) +#define DEFAULT_POSITIVE_ELEMENTS_SIZE (2048) #define DEFAULT_POSITIVE_LIFETIME (60 * 60 * 12) -#define DEFAULT_NEGATIVE_ELEMENTS_SIZE 2 // (512) +#define DEFAULT_NEGATIVE_ELEMENTS_SIZE (512) #define DEFAULT_NEGATIVE_LIFETIME (60 * 60) #define DEFAULT_MULTIPART_ELEMENTS_SIZE (1024 * 8) ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.c#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/debug.h#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/hashtable.h#14 (text+ko) ==== @@ -191,7 +191,7 @@ \ memmove(del_elm, del_elm + 1, \ (&the_entry->field.values[--the_entry->field.size] - del_elm) *\ - sizeof(type)); \ + sizeof(type)); \ } /* ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.c#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/log.h#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.c#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_rs_query.h#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.c#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/mp_ws_query.h#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.c#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/parser.h#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.c#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/protocol.h#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.c#14 (text+ko) ==== @@ -132,7 +132,6 @@ CTT_CLEAR, eid_str, eid_str_length, KPPT_LEFT); configuration_unlock_entry(config_entry, CELT_NEGATIVE); - configuration_lock_entry(config_entry, CELT_MULTIPART); if (configuration_entry_find_mp_cache_entries(config_entry, eid_str, &start, &finish) == 0) { @@ -950,21 +949,15 @@ switch (transform_request->transformation_type) { case TT_USER: if (transform_request->entry == NULL) { - configuration_lock_rdlock(s_configuration); - size = configuration_get_entries_size(s_configuration); for (i = 0; i < size; ++i) { clear_config_entry_part(configuration_get_entry( s_configuration, i), qstate->eid_str, qstate->eid_str_length); } - - configuration_unlock(s_configuration); } else { - configuration_lock_rdlock(s_configuration); qstate->config_entry = configuration_find_entry( s_configuration, transform_request->entry); - configuration_unlock(s_configuration); if (qstate->config_entry == NULL) { LOG_ERR_2("transform_request", @@ -984,8 +977,6 @@ transform_response->error_code = -1; else { if (transform_request->entry == NULL) { - configuration_lock_rdlock(s_configuration); - size = configuration_get_entries_size( s_configuration); for (i = 0; i < size; ++i) { @@ -993,14 +984,10 @@ configuration_get_entry( s_configuration, i)); } - - configuration_unlock(s_configuration); } else { - configuration_lock_rdlock(s_configuration); qstate->config_entry = configuration_find_entry( s_configuration, transform_request->entry); - configuration_unlock(s_configuration); if (qstate->config_entry == NULL) { LOG_ERR_2("transform_request", ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/query.h#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.c#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/cached/singletons.h#14 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/release/cached-0.2/startup/cached#9 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/src/include/nscache.h#7 (text+ko) ==== @@ -34,27 +34,40 @@ typedef int (*nss_cache_unmarshal_func_t)(char *, size_t, void *, va_list, void *); -typedef void (*nss_set_mp_ws_func_t)(cached_mp_write_session); +typedef void (*nss_set_mp_ws_func_t)(cached_mp_write_session); typedef cached_mp_write_session (*nss_get_mp_ws_func_t)(void); -typedef void (*nss_set_mp_rs_func_t)(cached_mp_read_session); +typedef void (*nss_set_mp_rs_func_t)(cached_mp_read_session); typedef cached_mp_read_session (*nss_get_mp_rs_func_t)(void); typedef struct _nss_cache_info { char *entry_name; void *mdata; - nss_cache_id_func_t id_func; - nss_cache_marshal_func_t marshal_func; - nss_cache_unmarshal_func_t unmarshal_func; + /* + * These 3 functions should be implemented specifically for each + * nsswitch database. + */ + nss_cache_id_func_t id_func; /* marshals the request parameters */ + nss_cache_marshal_func_t marshal_func; /* marshals response */ + nss_cache_unmarshal_func_t unmarshal_func; /* unmarshals response */ - nss_set_mp_ws_func_t set_mp_ws_func; - nss_get_mp_ws_func_t get_mp_ws_func; + /* + * These 4 functions should be generated with NSS_MP_CACHE_HANDLING + * macro. + */ + nss_set_mp_ws_func_t set_mp_ws_func; /* sets current write session */ + nss_get_mp_ws_func_t get_mp_ws_func; /* gets current write session */ - nss_set_mp_rs_func_t set_mp_rs_func; - nss_get_mp_rs_func_t get_mp_rs_func; + nss_set_mp_rs_func_t set_mp_rs_func; /* sets current read session */ + nss_get_mp_rs_func_t get_mp_rs_func; /* gets current read session */ } nss_cache_info; +/* + * NSS_MP_CACHE_HANDLING implements the set_mp_ws, get_mp_ws, set_mp_rs, + * get_mp_rs functions, that are used in _nss_cache_info. It uses + * NSS_TLS_HANDLING macro to organize thread local storage. + */ #define NSS_MP_CACHE_HANDLING(name) \ struct name##_mp_state { \ cached_mp_write_session mp_write_session; \ @@ -126,12 +139,21 @@ return (mp_state->mp_read_session); \ } +/* + * These macros should be used to initialize _nss_cache_info structure. For + * multipart queries in setXXXent and getXXXent functions mf and uf + * (marshal function and unmarshal function) should be both NULL. + */ #define NS_COMMON_CACHE_INFO_INITIALIZER(name, mdata, if, mf, uf) \ {#name, mdata, if, mf, uf, NULL, NULL, NULL, NULL} #define NS_MP_CACHE_INFO_INITIALIZER(name, mdata, mf, uf) \ - {#name, mdata, NULL, mf, uf, name##_set_mp_ws, name##_get_mp_ws, \ + {#name, mdata, NULL, mf, uf, name##_set_mp_ws, name##_get_mp_ws,\ name##_set_mp_rs, name##_get_mp_rs } +/* + * 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) }, /* args are: current pointer, current buffer, initial buffer, pointer type */ @@ -139,7 +161,7 @@ if ((cp) != NULL) \ (cp) = (p_type)((char *)(cb) + (size_t)(cp) - (size_t)(ib)) /* - * gets new pointer from the marshalled buffer by uisng initial address + * Gets new pointer from the marshalled buffer by uisng initial address * and initial buffer address */ #define NS_GET_NEWP(cp, cb, ib) \ @@ -153,6 +175,7 @@ } nss_cache_data; __BEGIN_DECLS +/* dummy function, which is needed to make nss_method_lookup happy */ extern int nss_cache_handler(void *, void *, va_list); #ifdef _NS_PRIVATE ==== //depot/projects/soc2005/nsswitch_cached/src/include/nscachedcli.h#5 (text+ko) ==== @@ -58,16 +58,17 @@ struct cached_connection_ { int sockfd; - int read_queue; - int write_queue; + int read_queue; + int write_queue; - int mp_flag; + int mp_flag; /* shows if the connection is used for + * multipart operations */ }; /* simple abstractions for not to write "struct" every time */ -typedef struct cached_connection_ *cached_connection; -typedef struct cached_connection_ *cached_mp_write_session; -typedef struct cached_connection_ *cached_mp_read_session; +typedef struct cached_connection_ *cached_connection; +typedef struct cached_connection_ *cached_mp_write_session; +typedef struct cached_connection_ *cached_mp_read_session; #define INVALID_CACHED_CONNECTION (NULL) #define INVALID_CACHED_MP_WRITE_SESSION (NULL) @@ -76,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 *, 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( 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/nscache.c#7 (text+ko) ==== ==== //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nscachedcli.c#7 (text+ko) ==== @@ -45,6 +45,12 @@ static int safe_read(struct cached_connection_ *, void *, size_t); static int send_credentials(struct cached_connection_ *, int); +/* + * safe_write writes data to the specified connection and tries to do it in + * the very safe manner. We ensure, that we can write to the socket with + * kevent. If the data_size can't be send in one piece, then it would be + * splitted. + */ static int safe_write(struct cached_connection_ *connection, const void *data, size_t data_size) @@ -82,6 +88,12 @@ return (0); } +/* + * safe_read reads data from connection and tries to do it in the very safe + * and stable way. It uses kevent to ensure, that the data are availabe for + * reading. If the amount of data to be read is too large, then they would + * be splitted. + */ static int safe_read(struct cached_connection_ *connection, void *data, size_t data_size) { @@ -118,6 +130,10 @@ return (0); } +/* + * Sends the credentials information to the connection along with the + * communication element type. + */ static int send_credentials(struct cached_connection_ *connection, int type) { @@ -164,6 +180,9 @@ return (-1); } +/* + * Opens the connection with the specified params. Initializes all kqueues. + */ struct cached_connection_ * open_cached_connection(struct cached_connection_params const *params) { @@ -224,6 +243,11 @@ free(connection); } +/* + * This function is very close to the cache_write function of the caching + * library, which is used in the caching daemon. It caches the data with the + * specified key in the cache entry with entry_name. + */ int cached_write(struct cached_connection_ *connection, const char *entry_name, const char *key, size_t key_size, const char *data, size_t data_size) @@ -271,6 +295,11 @@ return (error_code); } +/* + * This function is very close to the cache_read function of the caching + * library, which is used in the caching daemon. It reads cached data with the + * specified key from the cache entry with entry_name. + */ int cached_read(struct cached_connection_ *connection, const char *entry_name, const char *key, size_t key_size, char *data, size_t *data_size) @@ -334,6 +363,13 @@ return (error_code); } +/* + * Initializes the mp_write_session. For such a session the new connection + * would be opened. The data should be written to the session with + * cached_mp_write function. The close_cached_mp_write_session function + * should be used to submit session and abandon_cached_mp_write_session - to + * abandon it. When the session is submitted, the whole se + */ struct cached_connection_ * open_cached_mp_write_session(struct cached_connection_params const *params, const char *entry_name) ==== //depot/projects/soc2005/nsswitch_cached/src/lib/libc/net/nsdispatch.c#11 (text+ko) ====