int __close_cached_mp_read_session(struct cached_connection_ *rs) { __close_cached_connection(rs); return (0); }
int __nss_common_cache_write_negative(void* mdata) { struct cached_connection_params params; cached_connection connection; int res; nss_cache_info const* cache_info; nss_cache_data* cache_data; cache_data = (nss_cache_data*)mdata; cache_info = cache_data->info; if (cache_data->key == NULL) { return (NS_UNAVAIL); } memset(¶ms, 0, sizeof(struct cached_connection_params)); params.socket_path = CACHED_SOCKET_PATH; connection = __open_cached_connection(¶ms); if (connection == NULL) { free(cache_data->key); return (NS_UNAVAIL); } res = __cached_write(connection, cache_info->entry_name, cache_data->key, cache_data->key_size, NULL, 0); __close_cached_connection(connection); free(cache_data->key); return (res == 0 ? NS_SUCCESS : NS_UNAVAIL); }
/* * Gracefully closes the write session. The data, that were previously written * to the session, are committed. */ int __close_cached_mp_write_session(struct cached_connection_ *ws) { int notification; int result; notification = CET_MP_WRITE_SESSION_CLOSE_NOTIFICATION; result = safe_write(ws, ¬ification, sizeof(int)); __close_cached_connection(ws); return (0); }
struct cached_connection_ * __open_cached_mp_read_session(struct cached_connection_params const *params, const char *entry_name) { struct cached_connection_ *connection, *retval; size_t name_size; int error_code; int result; retval = NULL; connection = __open_cached_connection(params); if (connection == NULL) return (NULL); connection->mp_flag = 1; result = send_credentials(connection, CET_MP_READ_SESSION_REQUEST); if (result != 0) goto fin; name_size = strlen(entry_name); result = safe_write(connection, &name_size, sizeof(size_t)); if (result != 0) goto fin; result = safe_write(connection, entry_name, name_size); if (result != 0) goto fin; result = safe_read(connection, &error_code, sizeof(int)); if (result != 0) goto fin; if (error_code != 0) result = error_code; fin: if (result != 0) __close_cached_connection(connection); else retval = connection; return (retval); }
int __nss_common_cache_read(void* retval, void* mdata, va_list ap) { struct cached_connection_params params; cached_connection connection; char* buffer; size_t buffer_size, size; nss_cache_info const* cache_info; nss_cache_data* cache_data; va_list ap_new; int res; cache_data = (nss_cache_data*)mdata; cache_info = cache_data->info; memset(¶ms, 0, sizeof(struct cached_connection_params)); params.socket_path = CACHED_SOCKET_PATH; cache_data->key = (char*)malloc(NSS_CACHE_KEY_INITIAL_SIZE); memset(cache_data->key, 0, NSS_CACHE_KEY_INITIAL_SIZE); cache_data->key_size = NSS_CACHE_KEY_INITIAL_SIZE; va_copy(ap_new, ap); do { size = cache_data->key_size; res = cache_info->id_func(cache_data->key, &size, ap_new, cache_info->mdata); va_end(ap_new); if (res == NS_RETURN) { if (cache_data->key_size > NSS_CACHE_KEY_SIZE_LIMIT) { break; } cache_data->key_size <<= 1; cache_data->key = realloc(cache_data->key, cache_data->key_size); memset(cache_data->key, 0, cache_data->key_size); va_copy(ap_new, ap); } } while (res == NS_RETURN); if (res != NS_SUCCESS) { free(cache_data->key); cache_data->key = NULL; cache_data->key_size = 0; return (res); } else { cache_data->key_size = size; } buffer_size = NSS_CACHE_BUFFER_INITIAL_SIZE; buffer = (char*)malloc(NSS_CACHE_BUFFER_INITIAL_SIZE); memset(buffer, 0, NSS_CACHE_BUFFER_INITIAL_SIZE); do { connection = __open_cached_connection(¶ms); if (connection == NULL) { res = -1; break; } res = __cached_read(connection, cache_info->entry_name, cache_data->key, cache_data->key_size, buffer, &buffer_size); __close_cached_connection(connection); if (res == -2 && buffer_size < NSS_CACHE_BUFFER_SIZE_LIMIT) { buffer = (char*)realloc(buffer, buffer_size); memset(buffer, 0, buffer_size); } } while (res == -2); if (res == 0) { if (buffer_size == 0) { free(buffer); free(cache_data->key); cache_data->key = NULL; cache_data->key_size = 0; return (NS_RETURN); } va_copy(ap_new, ap); res = cache_info->unmarshal_func(buffer, buffer_size, retval, ap_new, cache_info->mdata); va_end(ap_new); if (res != NS_SUCCESS) { free(buffer); free(cache_data->key); cache_data->key = NULL; cache_data->key_size = 0; return (res); } else { res = 0; } } if (res == 0) { free(cache_data->key); cache_data->key = NULL; cache_data->key_size = 0; } free(buffer); return (res == 0 ? NS_SUCCESS : NS_NOTFOUND); }
int __nss_common_cache_write(void* retval, void* mdata, va_list ap) { struct cached_connection_params params; cached_connection connection; char* buffer; size_t buffer_size; nss_cache_info const* cache_info; nss_cache_data* cache_data; va_list ap_new; int res; cache_data = (nss_cache_data*)mdata; cache_info = cache_data->info; if (cache_data->key == NULL) { return (NS_UNAVAIL); } memset(¶ms, 0, sizeof(struct cached_connection_params)); params.socket_path = CACHED_SOCKET_PATH; connection = __open_cached_connection(¶ms); if (connection == NULL) { free(cache_data->key); return (NS_UNAVAIL); } buffer_size = NSS_CACHE_BUFFER_INITIAL_SIZE; buffer = (char*)malloc(NSS_CACHE_BUFFER_INITIAL_SIZE); memset(buffer, 0, NSS_CACHE_BUFFER_INITIAL_SIZE); do { size_t size; size = buffer_size; va_copy(ap_new, ap); res = cache_info->marshal_func(buffer, &size, retval, ap_new, cache_info->mdata); va_end(ap_new); if (res == NS_RETURN) { if (buffer_size > NSS_CACHE_BUFFER_SIZE_LIMIT) { break; } buffer_size <<= 1; buffer = (char*)realloc(buffer, buffer_size); memset(buffer, 0, buffer_size); } } while (res == NS_RETURN); if (res != NS_SUCCESS) { __close_cached_connection(connection); free(cache_data->key); free(buffer); return (res); } res = __cached_write(connection, cache_info->entry_name, cache_data->key, cache_data->key_size, buffer, buffer_size); __close_cached_connection(connection); free(cache_data->key); free(buffer); return (res == 0 ? NS_SUCCESS : NS_UNAVAIL); }