summaryrefslogtreecommitdiffstats
path: root/usr.sbin/nscd/config.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/nscd/config.c')
-rw-r--r--usr.sbin/nscd/config.c586
1 files changed, 0 insertions, 586 deletions
diff --git a/usr.sbin/nscd/config.c b/usr.sbin/nscd/config.c
deleted file mode 100644
index 856cf97..0000000
--- a/usr.sbin/nscd/config.c
+++ /dev/null
@@ -1,586 +0,0 @@
-/*-
- * Copyright (c) 2005 Michael Bushkov <bushman@rsu.ru>
- * 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/stat.h>
-#include <sys/time.h>
-
-#include <assert.h>
-#include <math.h>
-#include <nsswitch.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "config.h"
-#include "debug.h"
-#include "log.h"
-
-/*
- * Default entries, which always exist in the configuration
- */
-const char *c_default_entries[6] = {
- NSDB_PASSWD,
- NSDB_GROUP,
- NSDB_HOSTS,
- NSDB_SERVICES,
- NSDB_PROTOCOLS,
- NSDB_RPC
- };
-
-static int configuration_entry_cmp(const void *, const void *);
-static int configuration_entry_sort_cmp(const void *, const void *);
-static int configuration_entry_cache_mp_sort_cmp(const void *, const void *);
-static int configuration_entry_cache_mp_cmp(const void *, const void *);
-static int configuration_entry_cache_mp_part_cmp(const void *, const void *);
-static struct configuration_entry *create_configuration_entry(const char *,
- struct timeval const *, struct timeval const *,
- struct common_cache_entry_params const *,
- struct common_cache_entry_params const *,
- struct mp_cache_entry_params const *);
-
-static int
-configuration_entry_sort_cmp(const void *e1, const void *e2)
-{
- return (strcmp((*((struct configuration_entry **)e1))->name,
- (*((struct configuration_entry **)e2))->name
- ));
-}
-
-static int
-configuration_entry_cmp(const void *e1, const void *e2)
-{
- return (strcmp((const char *)e1,
- (*((struct configuration_entry **)e2))->name
- ));
-}
-
-static int
-configuration_entry_cache_mp_sort_cmp(const void *e1, const void *e2)
-{
- return (strcmp((*((cache_entry *)e1))->params->entry_name,
- (*((cache_entry *)e2))->params->entry_name
- ));
-}
-
-static int
-configuration_entry_cache_mp_cmp(const void *e1, const void *e2)
-{
- return (strcmp((const char *)e1,
- (*((cache_entry *)e2))->params->entry_name
- ));
-}
-
-static int
-configuration_entry_cache_mp_part_cmp(const void *e1, const void *e2)
-{
- return (strncmp((const char *)e1,
- (*((cache_entry *)e2))->params->entry_name,
- strlen((const char *)e1)
- ));
-}
-
-static struct configuration_entry *
-create_configuration_entry(const char *name,
- struct timeval const *common_timeout,
- struct timeval const *mp_timeout,
- struct common_cache_entry_params const *positive_params,
- struct common_cache_entry_params const *negative_params,
- struct mp_cache_entry_params const *mp_params)
-{
- struct configuration_entry *retval;
- size_t size;
- int res;
-
- TRACE_IN(create_configuration_entry);
- assert(name != NULL);
- assert(positive_params != NULL);
- assert(negative_params != NULL);
- assert(mp_params != NULL);
-
- retval = calloc(1,
- sizeof(*retval));
- assert(retval != NULL);
-
- res = pthread_mutex_init(&retval->positive_cache_lock, NULL);
- if (res != 0) {
- free(retval);
- LOG_ERR_2("create_configuration_entry",
- "can't create positive cache lock");
- TRACE_OUT(create_configuration_entry);
- return (NULL);
- }
-
- res = pthread_mutex_init(&retval->negative_cache_lock, NULL);
- if (res != 0) {
- pthread_mutex_destroy(&retval->positive_cache_lock);
- free(retval);
- LOG_ERR_2("create_configuration_entry",
- "can't create negative cache lock");
- TRACE_OUT(create_configuration_entry);
- return (NULL);
- }
-
- res = pthread_mutex_init(&retval->mp_cache_lock, NULL);
- if (res != 0) {
- pthread_mutex_destroy(&retval->positive_cache_lock);
- pthread_mutex_destroy(&retval->negative_cache_lock);
- free(retval);
- LOG_ERR_2("create_configuration_entry",
- "can't create negative cache lock");
- TRACE_OUT(create_configuration_entry);
- return (NULL);
- }
-
- memcpy(&retval->positive_cache_params, positive_params,
- sizeof(struct common_cache_entry_params));
- memcpy(&retval->negative_cache_params, negative_params,
- sizeof(struct common_cache_entry_params));
- memcpy(&retval->mp_cache_params, mp_params,
- sizeof(struct mp_cache_entry_params));
-
- size = strlen(name);
- retval->name = calloc(1, size + 1);
- assert(retval->name != NULL);
- memcpy(retval->name, name, size);
-
- memcpy(&retval->common_query_timeout, common_timeout,
- sizeof(struct timeval));
- memcpy(&retval->mp_query_timeout, mp_timeout,
- sizeof(struct timeval));
-
- asprintf(&retval->positive_cache_params.cep.entry_name, "%s+", name);
- assert(retval->positive_cache_params.cep.entry_name != NULL);
-
- asprintf(&retval->negative_cache_params.cep.entry_name, "%s-", name);
- assert(retval->negative_cache_params.cep.entry_name != NULL);
-
- asprintf(&retval->mp_cache_params.cep.entry_name, "%s*", name);
- assert(retval->mp_cache_params.cep.entry_name != NULL);
-
- TRACE_OUT(create_configuration_entry);
- return (retval);
-}
-
-/*
- * Creates configuration entry and fills it with default values
- */
-struct configuration_entry *
-create_def_configuration_entry(const char *name)
-{
- struct common_cache_entry_params positive_params, negative_params;
- struct mp_cache_entry_params mp_params;
- struct timeval default_common_timeout, default_mp_timeout;
-
- struct configuration_entry *res = NULL;
-
- TRACE_IN(create_def_configuration_entry);
- memset(&positive_params, 0,
- sizeof(struct common_cache_entry_params));
- positive_params.cep.entry_type = CET_COMMON;
- positive_params.cache_entries_size = DEFAULT_CACHE_HT_SIZE;
- positive_params.max_elemsize = DEFAULT_POSITIVE_ELEMENTS_SIZE;
- positive_params.satisf_elemsize = DEFAULT_POSITIVE_ELEMENTS_SIZE / 2;
- positive_params.max_lifetime.tv_sec = DEFAULT_POSITIVE_LIFETIME;
- positive_params.policy = CPT_LRU;
-
- memcpy(&negative_params, &positive_params,
- sizeof(struct common_cache_entry_params));
- negative_params.max_elemsize = DEFAULT_NEGATIVE_ELEMENTS_SIZE;
- negative_params.satisf_elemsize = DEFAULT_NEGATIVE_ELEMENTS_SIZE / 2;
- negative_params.max_lifetime.tv_sec = DEFAULT_NEGATIVE_LIFETIME;
- negative_params.policy = CPT_FIFO;
-
- memset(&default_common_timeout, 0, sizeof(struct timeval));
- default_common_timeout.tv_sec = DEFAULT_COMMON_ENTRY_TIMEOUT;
-
- memset(&default_mp_timeout, 0, sizeof(struct timeval));
- default_mp_timeout.tv_sec = DEFAULT_MP_ENTRY_TIMEOUT;
-
- memset(&mp_params, 0,
- sizeof(struct mp_cache_entry_params));
- mp_params.cep.entry_type = CET_MULTIPART;
- mp_params.max_elemsize = DEFAULT_MULTIPART_ELEMENTS_SIZE;
- mp_params.max_sessions = DEFAULT_MULITPART_SESSIONS_SIZE;
- mp_params.max_lifetime.tv_sec = DEFAULT_MULITPART_LIFETIME;
-
- res = create_configuration_entry(name, &default_common_timeout,
- &default_mp_timeout, &positive_params, &negative_params,
- &mp_params);
-
- TRACE_OUT(create_def_configuration_entry);
- return (res);
-}
-
-void
-destroy_configuration_entry(struct configuration_entry *entry)
-{
- TRACE_IN(destroy_configuration_entry);
- assert(entry != NULL);
- pthread_mutex_destroy(&entry->positive_cache_lock);
- pthread_mutex_destroy(&entry->negative_cache_lock);
- pthread_mutex_destroy(&entry->mp_cache_lock);
- free(entry->name);
- free(entry->positive_cache_params.cep.entry_name);
- free(entry->negative_cache_params.cep.entry_name);
- free(entry->mp_cache_params.cep.entry_name);
- free(entry->mp_cache_entries);
- free(entry);
- TRACE_OUT(destroy_configuration_entry);
-}
-
-int
-add_configuration_entry(struct configuration *config,
- struct configuration_entry *entry)
-{
- TRACE_IN(add_configuration_entry);
- assert(entry != NULL);
- assert(entry->name != NULL);
- if (configuration_find_entry(config, entry->name) != NULL) {
- TRACE_OUT(add_configuration_entry);
- return (-1);
- }
-
- if (config->entries_size == config->entries_capacity) {
- struct configuration_entry **new_entries;
-
- config->entries_capacity *= 2;
- new_entries = calloc(1,
- sizeof(*new_entries) *
- config->entries_capacity);
- assert(new_entries != NULL);
- memcpy(new_entries, config->entries,
- sizeof(struct configuration_entry *) *
- config->entries_size);
-
- free(config->entries);
- config->entries = new_entries;
- }
-
- config->entries[config->entries_size++] = entry;
- qsort(config->entries, config->entries_size,
- sizeof(struct configuration_entry *),
- configuration_entry_sort_cmp);
-
- TRACE_OUT(add_configuration_entry);
- return (0);
-}
-
-size_t
-configuration_get_entries_size(struct configuration *config)
-{
- TRACE_IN(configuration_get_entries_size);
- assert(config != NULL);
- TRACE_OUT(configuration_get_entries_size);
- return (config->entries_size);
-}
-
-struct configuration_entry *
-configuration_get_entry(struct configuration *config, size_t index)
-{
- TRACE_IN(configuration_get_entry);
- assert(config != NULL);
- assert(index < config->entries_size);
- TRACE_OUT(configuration_get_entry);
- return (config->entries[index]);
-}
-
-struct configuration_entry *
-configuration_find_entry(struct configuration *config,
- const char *name)
-{
- struct configuration_entry **retval;
-
- TRACE_IN(configuration_find_entry);
-
- retval = bsearch(name, config->entries, config->entries_size,
- sizeof(struct configuration_entry *), configuration_entry_cmp);
- TRACE_OUT(configuration_find_entry);
-
- return ((retval != NULL) ? *retval : NULL);
-}
-
-/*
- * All multipart cache entries are stored in the configuration_entry in the
- * sorted array (sorted by names). The 3 functions below manage this array.
- */
-
-int
-configuration_entry_add_mp_cache_entry(struct configuration_entry *config_entry,
- cache_entry c_entry)
-{
- cache_entry *new_mp_entries, *old_mp_entries;
-
- TRACE_IN(configuration_entry_add_mp_cache_entry);
- ++config_entry->mp_cache_entries_size;
- new_mp_entries = malloc(sizeof(*new_mp_entries) *
- 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) *
- sizeof(cache_entry));
- }
-
- old_mp_entries = config_entry->mp_cache_entries;
- config_entry->mp_cache_entries = new_mp_entries;
- free(old_mp_entries);
-
- qsort(config_entry->mp_cache_entries,
- config_entry->mp_cache_entries_size,
- sizeof(cache_entry),
- configuration_entry_cache_mp_sort_cmp);
-
- TRACE_OUT(configuration_entry_add_mp_cache_entry);
- return (0);
-}
-
-cache_entry
-configuration_entry_find_mp_cache_entry(
- struct configuration_entry *config_entry, const char *mp_name)
-{
- cache_entry *result;
-
- TRACE_IN(configuration_entry_find_mp_cache_entry);
- result = bsearch(mp_name, config_entry->mp_cache_entries,
- config_entry->mp_cache_entries_size,
- sizeof(cache_entry), configuration_entry_cache_mp_cmp);
-
- if (result == NULL) {
- TRACE_OUT(configuration_entry_find_mp_cache_entry);
- return (NULL);
- } else {
- TRACE_OUT(configuration_entry_find_mp_cache_entry);
- return (*result);
- }
-}
-
-/*
- * Searches for all multipart entries with names starting with mp_name.
- * Needed for cache flushing.
- */
-int
-configuration_entry_find_mp_cache_entries(
- struct configuration_entry *config_entry, const char *mp_name,
- cache_entry **start, cache_entry **finish)
-{
- cache_entry *result;
-
- TRACE_IN(configuration_entry_find_mp_cache_entries);
- result = bsearch(mp_name, config_entry->mp_cache_entries,
- config_entry->mp_cache_entries_size,
- sizeof(cache_entry), configuration_entry_cache_mp_part_cmp);
-
- if (result == NULL) {
- TRACE_OUT(configuration_entry_find_mp_cache_entries);
- return (-1);
- }
-
- *start = result;
- *finish = result + 1;
-
- while (*start != config_entry->mp_cache_entries) {
- if (configuration_entry_cache_mp_part_cmp(mp_name, *start - 1) == 0)
- *start = *start - 1;
- else
- break;
- }
-
- while (*finish != config_entry->mp_cache_entries +
- config_entry->mp_cache_entries_size) {
-
- if (configuration_entry_cache_mp_part_cmp(
- mp_name, *finish) == 0)
- *finish = *finish + 1;
- else
- break;
- }
-
- TRACE_OUT(configuration_entry_find_mp_cache_entries);
- return (0);
-}
-
-/*
- * Configuration entry uses rwlock to handle access to its fields.
- */
-void
-configuration_lock_rdlock(struct configuration *config)
-{
- TRACE_IN(configuration_lock_rdlock);
- pthread_rwlock_rdlock(&config->rwlock);
- TRACE_OUT(configuration_lock_rdlock);
-}
-
-void
-configuration_lock_wrlock(struct configuration *config)
-{
- TRACE_IN(configuration_lock_wrlock);
- pthread_rwlock_wrlock(&config->rwlock);
- TRACE_OUT(configuration_lock_wrlock);
-}
-
-void
-configuration_unlock(struct configuration *config)
-{
- TRACE_IN(configuration_unlock);
- pthread_rwlock_unlock(&config->rwlock);
- TRACE_OUT(configuration_unlock);
-}
-
-/*
- * Configuration entry uses 3 mutexes to handle cache operations. They are
- * acquired by configuration_lock_entry and configuration_unlock_entry
- * functions.
- */
-void
-configuration_lock_entry(struct configuration_entry *entry,
- enum config_entry_lock_type lock_type)
-{
- TRACE_IN(configuration_lock_entry);
- assert(entry != NULL);
-
- switch (lock_type) {
- case CELT_POSITIVE:
- pthread_mutex_lock(&entry->positive_cache_lock);
- break;
- case CELT_NEGATIVE:
- pthread_mutex_lock(&entry->negative_cache_lock);
- break;
- case CELT_MULTIPART:
- pthread_mutex_lock(&entry->mp_cache_lock);
- break;
- default:
- /* should be unreachable */
- break;
- }
- TRACE_OUT(configuration_lock_entry);
-}
-
-void
-configuration_unlock_entry(struct configuration_entry *entry,
- enum config_entry_lock_type lock_type)
-{
- TRACE_IN(configuration_unlock_entry);
- assert(entry != NULL);
-
- switch (lock_type) {
- case CELT_POSITIVE:
- pthread_mutex_unlock(&entry->positive_cache_lock);
- break;
- case CELT_NEGATIVE:
- pthread_mutex_unlock(&entry->negative_cache_lock);
- break;
- case CELT_MULTIPART:
- pthread_mutex_unlock(&entry->mp_cache_lock);
- break;
- default:
- /* should be unreachable */
- break;
- }
- TRACE_OUT(configuration_unlock_entry);
-}
-
-struct configuration *
-init_configuration(void)
-{
- struct configuration *retval;
-
- TRACE_IN(init_configuration);
- retval = calloc(1, sizeof(*retval));
- assert(retval != NULL);
-
- retval->entries_capacity = INITIAL_ENTRIES_CAPACITY;
- retval->entries = calloc(1,
- sizeof(*retval->entries) *
- retval->entries_capacity);
- assert(retval->entries != NULL);
-
- pthread_rwlock_init(&retval->rwlock, NULL);
-
- TRACE_OUT(init_configuration);
- return (retval);
-}
-
-void
-fill_configuration_defaults(struct configuration *config)
-{
- size_t len, i;
-
- TRACE_IN(fill_configuration_defaults);
- assert(config != NULL);
-
- if (config->socket_path != NULL)
- free(config->socket_path);
-
- len = strlen(DEFAULT_SOCKET_PATH);
- config->socket_path = calloc(1, len + 1);
- assert(config->socket_path != NULL);
- memcpy(config->socket_path, DEFAULT_SOCKET_PATH, len);
-
- len = strlen(DEFAULT_PIDFILE_PATH);
- config->pidfile_path = calloc(1, len + 1);
- assert(config->pidfile_path != NULL);
- memcpy(config->pidfile_path, DEFAULT_PIDFILE_PATH, len);
-
- config->socket_mode = S_IFSOCK | S_IRUSR | S_IWUSR |
- S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
- config->force_unlink = 1;
-
- config->query_timeout = DEFAULT_QUERY_TIMEOUT;
- config->threads_num = DEFAULT_THREADS_NUM;
-
- for (i = 0; i < config->entries_size; ++i)
- destroy_configuration_entry(config->entries[i]);
- config->entries_size = 0;
-
- TRACE_OUT(fill_configuration_defaults);
-}
-
-void
-destroy_configuration(struct configuration *config)
-{
- unsigned int i;
-
- TRACE_IN(destroy_configuration);
- assert(config != NULL);
- free(config->pidfile_path);
- free(config->socket_path);
-
- for (i = 0; i < config->entries_size; ++i)
- destroy_configuration_entry(config->entries[i]);
- free(config->entries);
-
- pthread_rwlock_destroy(&config->rwlock);
- free(config);
- TRACE_OUT(destroy_configuration);
-}
OpenPOWER on IntegriCloud