Esempio n. 1
0
int
__close_cached_mp_read_session(struct cached_connection_ *rs)
{

	__close_cached_connection(rs);
	return (0);
}
Esempio n. 2
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(&params, 0, sizeof(struct cached_connection_params));
    params.socket_path = CACHED_SOCKET_PATH;
    connection = __open_cached_connection(&params);

    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);
}
Esempio n. 3
0
/*
 * 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, &notification, sizeof(int));
	__close_cached_connection(ws);
	return (0);
}
Esempio n. 4
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);
}
Esempio n. 5
0
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(&params, 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(&params);

        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);
}
Esempio n. 6
0
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(&params, 0, sizeof(struct cached_connection_params));
    params.socket_path = CACHED_SOCKET_PATH;
    connection = __open_cached_connection(&params);

    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);
}