Blame lib/defaults.c

Packit 8480eb
/* ----------------------------------------------------------------------- *
Packit 8480eb
 *
Packit 8480eb
 *  defaults.h - system initialization defaults.
Packit 8480eb
 *
Packit 8480eb
 *   Copyright 2013 Red Hat, Inc.
Packit 8480eb
 *   Copyright 2006, 2013 Ian Kent <raven@themaw.net>
Packit 8480eb
 *   All rights reserved.
Packit 8480eb
 *
Packit 8480eb
 *   This program is free software; you can redistribute it and/or modify
Packit 8480eb
 *   it under the terms of the GNU General Public License as published by
Packit 8480eb
 *   the Free Software Foundation, Inc., 675 Mass Ave, Cambridge MA 02139,
Packit 8480eb
 *   USA; either version 2 of the License, or (at your option) any later
Packit 8480eb
 *   version; incorporated herein by reference.
Packit 8480eb
 *
Packit 8480eb
 * ----------------------------------------------------------------------- */
Packit 8480eb
Packit 8480eb
#include <stdlib.h>
Packit 8480eb
#include <stdio.h>
Packit 8480eb
#include <ctype.h>
Packit 8480eb
#include <string.h>
Packit 8480eb
#include <sys/utsname.h>
Packit 8480eb
#include <sys/stat.h>
Packit 8480eb
#include <stdarg.h>
Packit 8480eb
Packit 8480eb
#include "config.h"
Packit 8480eb
#include "list.h"
Packit 8480eb
#include "defaults.h"
Packit 8480eb
#ifdef WITH_LDAP
Packit 8480eb
#include "lookup_ldap.h"
Packit 8480eb
#endif
Packit 8480eb
#include "log.h"
Packit 8480eb
#include "automount.h"
Packit 8480eb
Packit 8480eb
#define AUTOFS_GLOBAL_SECTION		"autofs"
Packit 8480eb
#define AMD_GLOBAL_SECTION		"amd"
Packit 8480eb
Packit 8480eb
/*
Packit 8480eb
 * The configuration location has changed.
Packit 8480eb
 * The name of the configuration is now autofs.conf and it is
Packit 8480eb
 * located in the same directory as the maps. AUTOFS_CONF_DIR
Packit 8480eb
 * remains pointed at the init system configuration.
Packit 8480eb
 */
Packit 8480eb
#define DEFAULT_CONFIG_FILE		AUTOFS_MAP_DIR "/autofs.conf"
Packit 8480eb
#define OLD_CONFIG_FILE			AUTOFS_CONF_DIR "/autofs"
Packit 8480eb
#define MAX_LINE_LEN			256
Packit 8480eb
#define MAX_SECTION_NAME		MAX_LINE_LEN
Packit 8480eb
Packit 8480eb
#define NAME_MASTER_MAP			"master_map_name"
Packit 8480eb
Packit 8480eb
#define NAME_TIMEOUT			"timeout"
Packit 8480eb
#define NAME_MASTER_WAIT		"master_wait"
Packit 8480eb
#define NAME_NEGATIVE_TIMEOUT		"negative_timeout"
Packit 8480eb
#define NAME_BROWSE_MODE		"browse_mode"
Packit 8480eb
#define NAME_LOGGING			"logging"
Packit 8480eb
#define NAME_FORCE_STD_PROG_MAP_ENV	"force_standard_program_map_env"
Packit 8480eb
Packit 8480eb
#define NAME_LDAP_URI			"ldap_uri"
Packit 8480eb
#define NAME_LDAP_TIMEOUT		"ldap_timeout"
Packit 8480eb
#define NAME_LDAP_NETWORK_TIMEOUT	"ldap_network_timeout"
Packit 8480eb
Packit 8480eb
#define NAME_SEARCH_BASE		"search_base"
Packit 8480eb
Packit 8480eb
#define NAME_MAP_OBJ_CLASS		"map_object_class"
Packit 8480eb
#define NAME_ENTRY_OBJ_CLASS		"entry_object_class"
Packit 8480eb
#define NAME_MAP_ATTR			"map_attribute"
Packit 8480eb
#define NAME_ENTRY_ATTR			"entry_attribute"
Packit 8480eb
#define NAME_VALUE_ATTR			"value_attribute"
Packit 8480eb
Packit 8480eb
#define NAME_MOUNT_NFS_DEFAULT_PROTOCOL	"mount_nfs_default_protocol"
Packit 8480eb
#define NAME_APPEND_OPTIONS		"append_options"
Packit Service 15c227
#define NAME_MOUNT_VERBOSE		"mount_verbose"
Packit 8480eb
#define NAME_MOUNT_WAIT			"mount_wait"
Packit 8480eb
#define NAME_UMOUNT_WAIT		"umount_wait"
Packit 8480eb
#define NAME_AUTH_CONF_FILE		"auth_conf_file"
Packit 8480eb
Packit 8480eb
#define NAME_MAP_HASH_TABLE_SIZE	"map_hash_table_size"
Packit 8480eb
Packit 8480eb
#define NAME_USE_HOSTNAME_FOR_MOUNTS	"use_hostname_for_mounts"
Packit 8480eb
#define NAME_DISABLE_NOT_FOUND_MESSAGE	"disable_not_found_message"
Packit 8480eb
Packit 8480eb
#define NAME_SSS_MASTER_MAP_WAIT	"sss_master_map_wait"
Packit 8480eb
#define NAME_USE_MOUNT_REQUEST_LOG_ID	"use_mount_request_log_id"
Packit 8480eb
Packit 8480eb
#define NAME_AMD_ARCH				"arch"
Packit 8480eb
#define NAME_AMD_AUTO_ATTRCACHE			"auto_attrcache"
Packit 8480eb
#define NAME_AMD_AUTO_DIR			"auto_dir"
Packit 8480eb
#define NAME_AMD_AUTOFS_USE_LOFS		"autofs_use_lofs"
Packit 8480eb
#define NAME_AMD_BROWSABLE_DIRS			"browsable_dirs"
Packit 8480eb
#define NAME_AMD_CACHE_DURATION			"cache_duration"
Packit 8480eb
#define NAME_AMD_CLUSTER			"cluster"
Packit 8480eb
#define NAME_AMD_DEBUG_MTAB_FILE		"debug_mtab_file"
Packit 8480eb
#define NAME_AMD_DEBUG_OPTIONS			"debug_options"
Packit 8480eb
#define NAME_AMD_DISMOUNT_INTERVAL		"dismount_interval"
Packit 8480eb
#define NAME_AMD_DOMAIN_STRIP			"domain_strip"
Packit 8480eb
#define NAME_AMD_EXEC_MAP_TIMEOUT		"exec_map_timeout"
Packit 8480eb
#define NAME_AMD_FORCED_UMOUNTS			"forced_unmounts"
Packit 8480eb
#define NAME_AMD_FULLY_QUALIFIED_HOSTS		"fully_qualified_hosts"
Packit 8480eb
#define NAME_AMD_FULL_OS			"full_os"
Packit 8480eb
#define NAME_AMD_HESIOD_BASE			"hesiod_base"
Packit 8480eb
#define NAME_AMD_KARCH				"karch"
Packit 8480eb
#define NAME_AMD_LDAP_BASE			"ldap_base"
Packit 8480eb
#define NAME_AMD_LDAP_CACHE_MAXMEM		"ldap_cache_maxmem"
Packit 8480eb
#define NAME_AMD_LDAP_CACHE_SECONDS		"ldap_cache_seconds"
Packit 8480eb
#define NAME_AMD_LDAP_HOSTPORTS			"ldap_hostports"
Packit 8480eb
#define NAME_AMD_LDAP_PROTO_VERSION		"ldap_proto_version"
Packit 8480eb
#define NAME_AMD_SUB_DOMAIN			"local_domain"
Packit 8480eb
#define NAME_AMD_LOCALHOST_ADDRESS		"localhost_address"
Packit 8480eb
#define NAME_AMD_LOG_FILE			"log_file"
Packit 8480eb
#define NAME_AMD_LOG_OPTIONS			"log_options"
Packit 8480eb
#define NAME_AMD_MAP_DEFAULTS			"map_defaults"
Packit 8480eb
#define NAME_AMD_MAP_OPTIONS			"map_options"
Packit 8480eb
#define NAME_AMD_MAP_RELOAD_INTERVAL		"map_reload_interval"
Packit 8480eb
#define NAME_AMD_MAP_NAME			"map_name"
Packit 8480eb
#define NAME_AMD_MAP_TYPE			"map_type"
Packit 8480eb
#define NAME_AMD_MOUNT_TYPE			"mount_type"
Packit 8480eb
#define NAME_AMD_PID_FILE			"pid_file"
Packit 8480eb
#define NAME_AMD_PORTMAP_PROGRAM		"portmap_program"
Packit 8480eb
#define NAME_AMD_PREFERRED_AMQ_PORT		"preferred_amq_port"
Packit 8480eb
#define NAME_AMD_NFS_ALLOW_ANY_INTERFACE	"nfs_allow_any_interface"
Packit 8480eb
#define NAME_AMD_NFS_ALLOW_INSECURE_PORT	"nfs_allow_insecure_port"
Packit 8480eb
#define NAME_AMD_NFS_PROTO			"nfs_proto"
Packit 8480eb
#define NAME_AMD_NFS_RETRANSMIT_COUNTER		"nfs_retransmit_counter"
Packit 8480eb
#define NAME_AMD_NFS_RETRANSMIT_COUNTER_UDP	"nfs_retransmit_counter_udp"
Packit 8480eb
#define NAME_AMD_NFS_RETRANSMIT_COUNTER_TCP	"nfs_retransmit_counter_tcp"
Packit 8480eb
#define NAME_AMD_NFS_RETRANSMIT_COUNTER_TOPLVL	"nfs_retransmit_counter_toplvl"
Packit 8480eb
#define NAME_AMD_NFS_RETRY_INTERVAL		"nfs_retry_interval"
Packit 8480eb
#define NAME_AMD_NFS_RETRY_INTERVAL_UDP		"nfs_retry_interval_udp"
Packit 8480eb
#define NAME_AMD_NFS_RETRY_INTERVAL_TCP		"nfs_retry_interval_tcp"
Packit 8480eb
#define NAME_AMD_NFS_RETRY_INTERVAL_TOPLVL	"nfs_retry_interval_toplvl"
Packit 8480eb
#define NAME_AMD_NFS_VERS			"nfs_vers"
Packit 8480eb
#define NAME_AMD_NFS_VERS_PING			"nfs_vers_ping"
Packit 8480eb
#define NAME_AMD_NIS_DOMAIN			"nis_domain"
Packit 8480eb
#define NAME_AMD_NORMALIZE_HOSTNAMES		"normalize_hostnames"
Packit 8480eb
#define NAME_AMD_NORMALIZE_SLASHES		"normalize_slashes"
Packit 8480eb
#define NAME_AMD_OS				"os"
Packit 8480eb
#define NAME_AMD_OSVER				"osver"
Packit 8480eb
#define NAME_AMD_PLOCK				"plock"
Packit 8480eb
#define NAME_AMD_PRINT_PID			"print_pid"
Packit 8480eb
#define NAME_AMD_PRINT_VERSION			"print_version"
Packit 8480eb
#define NAME_AMD_RESTART_MOUNTS			"restart_mounts"
Packit 8480eb
#define NAME_AMD_SEARCH_PATH			"search_path"
Packit 8480eb
#define NAME_AMD_SELECTORS_ON_DEFAULT		"selectors_on_default"
Packit 8480eb
#define NAME_AMD_SELECTORS_IN_DEFAULTS		"selectors_in_defaults"
Packit 8480eb
#define NAME_AMD_SHOW_STATFS_ENTRIES		"show_statfs_entries"
Packit 8480eb
#define NAME_AMD_SUN_MAP_SYNTAX			"sun_map_syntax"
Packit 8480eb
#define NAME_AMD_TRUNCATE_LOG			"truncate_log"
Packit 8480eb
#define NAME_AMD_UMOUNT_ON_EXIT			"unmount_on_exit"
Packit 8480eb
#define NAME_AMD_USE_TCPWRAPPERS		"use_tcpwrappers"
Packit 8480eb
#define NAME_AMD_VENDOR				"vendor"
Packit 8480eb
#define NAME_AMD_LINUX_UFS_MOUNT_TYPE		"linux_ufs_mount_type"
Packit 8480eb
Packit 8480eb
/* Status returns */
Packit 8480eb
#define CFG_OK		0x0000
Packit 8480eb
#define CFG_FAIL	0x0001
Packit 8480eb
#define CFG_EXISTS	0x0002
Packit 8480eb
#define CFG_NOTFOUND	0x0004
Packit 8480eb
Packit 8480eb
#define CFG_TABLE_SIZE	128
Packit 8480eb
Packit 8480eb
static const char *default_master_map_name = DEFAULT_MASTER_MAP_NAME;
Packit 8480eb
static const char *default_auth_conf_file  = DEFAULT_AUTH_CONF_FILE;
Packit 8480eb
static const char *autofs_gbl_sec	   = AUTOFS_GLOBAL_SECTION;
Packit 8480eb
static const char *amd_gbl_sec		   = AMD_GLOBAL_SECTION;
Packit 8480eb
Packit 8480eb
struct conf_option {
Packit 8480eb
	char *section;
Packit 8480eb
	char *name;
Packit 8480eb
	char *value;
Packit 8480eb
	unsigned long flags;
Packit 8480eb
	struct conf_option *next;
Packit 8480eb
};
Packit 8480eb
Packit 8480eb
struct conf_cache {
Packit 8480eb
	struct conf_option **hash;
Packit 8480eb
	time_t modified;
Packit 8480eb
};
Packit 8480eb
static pthread_mutex_t conf_mutex = PTHREAD_MUTEX_INITIALIZER;
Packit 8480eb
static struct conf_cache *config = NULL;
Packit 8480eb
Packit 8480eb
static int conf_load_autofs_defaults(void);
Packit 8480eb
static int conf_update(const char *, const char *, const char *, unsigned long);
Packit 8480eb
static void conf_delete(const char *, const char *);
Packit 8480eb
static struct conf_option *conf_lookup(const char *, const char *);
Packit 8480eb
Packit 8480eb
static void defaults_mutex_lock(void)
Packit 8480eb
{
Packit 8480eb
	int status = pthread_mutex_lock(&conf_mutex);
Packit 8480eb
	if (status)
Packit 8480eb
		fatal(status);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static void defaults_mutex_unlock(void)
Packit 8480eb
{
Packit 8480eb
	int status = pthread_mutex_unlock(&conf_mutex);
Packit 8480eb
	if (status)
Packit 8480eb
		fatal(status);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static void message(unsigned int to_syslog, const char *msg, ...)
Packit 8480eb
{
Packit 8480eb
	va_list ap;
Packit 8480eb
Packit 8480eb
	va_start(ap, msg);
Packit 8480eb
	if (to_syslog)
Packit 8480eb
		vsyslog(LOG_CRIT, msg, ap);
Packit 8480eb
	else {
Packit 8480eb
		vfprintf(stderr, msg, ap);
Packit 8480eb
		fputc('\n', stderr);
Packit 8480eb
	}
Packit 8480eb
	va_end(ap);
Packit 8480eb
Packit 8480eb
	return;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static int conf_init(void)
Packit 8480eb
{
Packit 8480eb
	struct conf_cache *cc;
Packit 8480eb
	unsigned int size = CFG_TABLE_SIZE;
Packit 8480eb
	unsigned int i;
Packit 8480eb
Packit 8480eb
	cc = malloc(sizeof(struct conf_cache));
Packit 8480eb
	if (!cc)
Packit 8480eb
		return CFG_FAIL;
Packit 8480eb
	cc->modified = 0;
Packit 8480eb
Packit 8480eb
	cc->hash = malloc(size * sizeof(struct conf_option *));
Packit 8480eb
	if (!cc->hash) {
Packit 8480eb
		free(cc);
Packit 8480eb
		return CFG_FAIL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	for (i = 0; i < size; i++) {
Packit 8480eb
		cc->hash[i] = NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	config = cc;
Packit 8480eb
Packit 8480eb
	return CFG_OK;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static void __conf_release(void)
Packit 8480eb
{
Packit 8480eb
	struct conf_cache *cc = config;
Packit 8480eb
	unsigned int size = CFG_TABLE_SIZE;
Packit 8480eb
	struct conf_option *co, *next;
Packit 8480eb
	unsigned int i;
Packit 8480eb
Packit 8480eb
	for (i = 0; i < size; i++) {
Packit 8480eb
		co = cc->hash[i];
Packit 8480eb
		if (co == NULL)
Packit 8480eb
			continue;
Packit 8480eb
		next = co->next;
Packit 8480eb
		free(co->section);
Packit 8480eb
		free(co->name);
Packit 8480eb
		if (co->value)
Packit 8480eb
			free(co->value);
Packit 8480eb
		free(co);
Packit 8480eb
Packit 8480eb
		while (next) {
Packit 8480eb
			co = next;
Packit 8480eb
			next = co->next;
Packit 8480eb
			free(co->section);
Packit 8480eb
			free(co->name);
Packit 8480eb
			if (co->value)
Packit 8480eb
				free(co->value);
Packit 8480eb
			free(co);
Packit 8480eb
		}
Packit 8480eb
		cc->hash[i] = NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	free(cc->hash);
Packit 8480eb
	free(cc);
Packit 8480eb
	config = NULL;
Packit 8480eb
Packit 8480eb
	return;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
void defaults_conf_release(void)
Packit 8480eb
{
Packit 8480eb
	defaults_mutex_lock();
Packit 8480eb
	__conf_release();
Packit 8480eb
	defaults_mutex_unlock();
Packit 8480eb
	return;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static int conf_load_autofs_defaults(void)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
	const char *sec = autofs_gbl_sec;
Packit 8480eb
	int ret;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_TIMEOUT,
Packit 8480eb
			  DEFAULT_TIMEOUT, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_MASTER_WAIT,
Packit 8480eb
			  DEFAULT_MASTER_WAIT, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_NEGATIVE_TIMEOUT,
Packit 8480eb
			  DEFAULT_NEGATIVE_TIMEOUT, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_BROWSE_MODE,
Packit 8480eb
			  DEFAULT_BROWSE_MODE, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_LOGGING,
Packit 8480eb
			  DEFAULT_LOGGING, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_LDAP_TIMEOUT,
Packit 8480eb
			  DEFAULT_LDAP_TIMEOUT, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_LDAP_NETWORK_TIMEOUT,
Packit 8480eb
			  DEFAULT_LDAP_NETWORK_TIMEOUT, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_APPEND_OPTIONS,
Packit 8480eb
			  DEFAULT_APPEND_OPTIONS, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit Service 15c227
	ret = conf_update(sec, NAME_MOUNT_VERBOSE,
Packit Service 15c227
			  DEFAULT_MOUNT_VERBOSE, CONF_ENV);
Packit Service 15c227
	if (ret == CFG_FAIL)
Packit Service 15c227
		goto error;
Packit Service 15c227
Packit 8480eb
	ret = conf_update(sec, NAME_MOUNT_WAIT,
Packit 8480eb
			  DEFAULT_MOUNT_WAIT, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_UMOUNT_WAIT,
Packit 8480eb
			  DEFAULT_UMOUNT_WAIT, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AUTH_CONF_FILE,
Packit 8480eb
			  DEFAULT_AUTH_CONF_FILE, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_MOUNT_NFS_DEFAULT_PROTOCOL,
Packit 8480eb
			  DEFAULT_MOUNT_NFS_DEFAULT_PROTOCOL, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_USE_HOSTNAME_FOR_MOUNTS,
Packit 8480eb
			  DEFAULT_USE_HOSTNAME_FOR_MOUNTS, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_DISABLE_NOT_FOUND_MESSAGE,
Packit 8480eb
			  DEFAULT_DISABLE_NOT_FOUND_MESSAGE, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_SSS_MASTER_MAP_WAIT,
Packit 8480eb
			  DEFAULT_SSS_MASTER_MAP_WAIT, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_USE_MOUNT_REQUEST_LOG_ID,
Packit 8480eb
			  DEFAULT_USE_MOUNT_REQUEST_LOG_ID, CONF_ENV);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	/* LDAP_URI and SEARCH_BASE can occur multiple times */
Packit 8480eb
	while ((co = conf_lookup(sec, NAME_LDAP_URI)))
Packit 8480eb
		conf_delete(co->section, co->name);
Packit 8480eb
Packit 8480eb
	while ((co = conf_lookup(sec, NAME_SEARCH_BASE)))
Packit 8480eb
		conf_delete(co->section, co->name);
Packit 8480eb
Packit 8480eb
	return 1;
Packit 8480eb
Packit 8480eb
error:
Packit 8480eb
	return 0;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static int conf_load_amd_defaults(void)
Packit 8480eb
{
Packit 8480eb
	struct utsname uts;
Packit 8480eb
	const char *sec = amd_gbl_sec;
Packit 8480eb
	char *host_os_name, *host_os_version, *host_arch;
Packit 8480eb
	int ret;
Packit 8480eb
Packit 8480eb
	if (uname(&uts)) {
Packit 8480eb
		host_os_name = uts.sysname;
Packit 8480eb
		host_os_version = uts.release;
Packit 8480eb
		host_arch = uts.machine;
Packit 8480eb
	} else {
Packit 8480eb
		host_os_name = NULL;
Packit 8480eb
		host_os_version = NULL;
Packit 8480eb
		host_arch = NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_ARCH, host_arch, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_KARCH, host_arch, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_OS, host_os_name, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_OSVER, host_os_version, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_AUTO_DIR,
Packit 8480eb
			  DEFAULT_AMD_AUTO_DIR, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_AUTOFS_USE_LOFS,
Packit 8480eb
			  DEFAULT_AMD_AUTO_DIR, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_BROWSABLE_DIRS,
Packit 8480eb
			  DEFAULT_AMD_BROWSABLE_DIRS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_CLUSTER,
Packit 8480eb
			  DEFAULT_AMD_CLUSTER, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	/*
Packit 8480eb
	 * DISMOUNT_INTERVAL defers to the autofs default so we
Packit 8480eb
	 * don't set an amd default in the configuration.
Packit 8480eb
	 */
Packit 8480eb
	/*ret = conf_update(sec, NAME_AMD_DISMOUNT_INTERVAL,
Packit 8480eb
			  DEFAULT_AMD_DISMOUNT_INTERVAL, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;*/
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_DOMAIN_STRIP,
Packit 8480eb
			  DEFAULT_AMD_DOMAIN_STRIP, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_EXEC_MAP_TIMEOUT,
Packit 8480eb
			  DEFAULT_AMD_EXEC_MAP_TIMEOUT, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_FORCED_UMOUNTS,
Packit 8480eb
			  DEFAULT_AMD_FORCED_UMOUNTS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_FULLY_QUALIFIED_HOSTS,
Packit 8480eb
			  DEFAULT_AMD_FULLY_QUALIFIED_HOSTS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_FULL_OS,
Packit 8480eb
			  DEFAULT_AMD_FULL_OS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_HESIOD_BASE,
Packit 8480eb
			  DEFAULT_AMD_HESIOD_BASE, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_KARCH, host_arch, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_LDAP_BASE,
Packit 8480eb
			  DEFAULT_AMD_LDAP_BASE, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_LDAP_HOSTPORTS,
Packit 8480eb
			  DEFAULT_AMD_LDAP_HOSTPORTS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_SUB_DOMAIN,
Packit 8480eb
			  DEFAULT_AMD_SUB_DOMAIN, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_LOCALHOST_ADDRESS,
Packit 8480eb
			  DEFAULT_AMD_LOCALHOST_ADDRESS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_LOG_OPTIONS,
Packit 8480eb
			  DEFAULT_AMD_LOG_OPTIONS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_MAP_DEFAULTS,
Packit 8480eb
			  DEFAULT_AMD_MAP_DEFAULTS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_MAP_OPTIONS,
Packit 8480eb
			  DEFAULT_AMD_MAP_OPTIONS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_MAP_TYPE,
Packit 8480eb
			  DEFAULT_AMD_MAP_TYPE, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_NIS_DOMAIN,
Packit 8480eb
			  DEFAULT_AMD_NIS_DOMAIN, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_NORMALIZE_HOSTNAMES,
Packit 8480eb
			  DEFAULT_AMD_NORMALIZE_HOSTNAMES, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_NORMALIZE_SLASHES,
Packit 8480eb
			  DEFAULT_AMD_NORMALIZE_SLASHES, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_OS, host_os_name, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_RESTART_MOUNTS,
Packit 8480eb
			  DEFAULT_AMD_RESTART_MOUNTS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_SEARCH_PATH,
Packit 8480eb
			  DEFAULT_AMD_SEARCH_PATH, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	/* selectors_on_default is depricated, use selectors_in_defaults */
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_SELECTORS_ON_DEFAULT,
Packit 8480eb
			  DEFAULT_AMD_SELECTORS_IN_DEFAULTS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_SELECTORS_IN_DEFAULTS,
Packit 8480eb
			  DEFAULT_AMD_SELECTORS_IN_DEFAULTS, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_UMOUNT_ON_EXIT,
Packit 8480eb
			  DEFAULT_AMD_UMOUNT_ON_EXIT, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_VENDOR,
Packit 8480eb
			  DEFAULT_AMD_VENDOR, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	ret = conf_update(sec, NAME_AMD_LINUX_UFS_MOUNT_TYPE,
Packit 8480eb
			  DEFAULT_AMD_LINUX_UFS_MOUNT_TYPE, CONF_NONE);
Packit 8480eb
	if (ret == CFG_FAIL)
Packit 8480eb
		goto error;
Packit 8480eb
	return 1;
Packit 8480eb
Packit 8480eb
error:
Packit 8480eb
	return 0;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static u_int32_t get_hash(const char *key, unsigned int size)
Packit 8480eb
{
Packit 8480eb
	const char *pkey = key;
Packit 8480eb
	char lkey[PATH_MAX + 1];
Packit 8480eb
	char *plkey = &lkey[0];
Packit 8480eb
Packit 8480eb
	while (*pkey)
Packit 8480eb
		*plkey++ = tolower(*pkey++);
Packit 8480eb
	*plkey = '\0';
Packit 8480eb
	return hash(lkey, size);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static int conf_add(const char *section, const char *key, const char *value, unsigned long flags)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
	char *sec, *name, *val, *tmp;
Packit 8480eb
	unsigned int size = CFG_TABLE_SIZE;
Packit 8480eb
	u_int32_t key_hash;
Packit 8480eb
	int ret = CFG_FAIL;
Packit 8480eb
Packit 8480eb
	sec = name = val = tmp = NULL;
Packit 8480eb
Packit 8480eb
	/* Environment overrides file value */
Packit 8480eb
	if (((flags & CONF_ENV) && (tmp = getenv(key))) || value) {
Packit 8480eb
		if (tmp)
Packit 8480eb
			val = strdup(tmp);
Packit 8480eb
		else {
Packit 8480eb
			if (value)
Packit 8480eb
				val = strdup(value);
Packit 8480eb
		}
Packit 8480eb
		if (!val)
Packit 8480eb
			goto error;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	name = strdup(key);
Packit 8480eb
	if (!key)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	sec = strdup(section);
Packit 8480eb
	if (!sec)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	co = malloc(sizeof(struct conf_option));
Packit 8480eb
	if (!co)
Packit 8480eb
		goto error;
Packit 8480eb
Packit 8480eb
	co->section = sec;
Packit 8480eb
	co->name = name;
Packit 8480eb
	co->value = val;
Packit 8480eb
	co->flags = flags;
Packit 8480eb
	co->next = NULL;
Packit 8480eb
Packit 8480eb
	/* Don't change user set values in the environment */
Packit 8480eb
	if (flags & CONF_ENV && value)
Packit 8480eb
		setenv(name, value, 0);
Packit 8480eb
Packit 8480eb
	key_hash = get_hash(key, size);
Packit 8480eb
	if (!config->hash[key_hash])
Packit 8480eb
		config->hash[key_hash] = co;
Packit 8480eb
	else {
Packit 8480eb
		struct conf_option *last = NULL, *next;
Packit 8480eb
		next = config->hash[key_hash];
Packit 8480eb
		while (next) {
Packit 8480eb
			last = next;
Packit 8480eb
			next = last->next;
Packit 8480eb
		}
Packit 8480eb
		last->next = co;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return CFG_OK;
Packit 8480eb
Packit 8480eb
error:
Packit 8480eb
	if (name)
Packit 8480eb
		free(name);
Packit 8480eb
	if (val)
Packit 8480eb
		free(val);
Packit 8480eb
	if (sec)
Packit 8480eb
		free(sec);
Packit 8480eb
Packit 8480eb
	return ret;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static void conf_delete(const char *section, const char *key)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co, *last;
Packit 8480eb
	unsigned int size = CFG_TABLE_SIZE;
Packit 8480eb
	u_int32_t key_hash;
Packit 8480eb
Packit 8480eb
	last = NULL;
Packit 8480eb
	key_hash = get_hash(key, size);
Packit 8480eb
	for (co = config->hash[key_hash]; co != NULL; co = co->next) {
Packit 8480eb
		if (strcasecmp(section, co->section))
Packit 8480eb
			continue;
Packit 8480eb
		if (!strcasecmp(key, co->name))
Packit 8480eb
			break;
Packit 8480eb
		last = co;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	if (!co)
Packit 8480eb
		return;
Packit 8480eb
Packit 8480eb
	if (last)
Packit 8480eb
		last->next = co->next;
Packit 8480eb
	else
Packit 8480eb
		config->hash[key_hash] = co->next;
Packit 8480eb
Packit 8480eb
	free(co->section);
Packit 8480eb
	free(co->name);
Packit 8480eb
	if (co->value)
Packit 8480eb
		free(co->value);
Packit 8480eb
	free(co);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static int conf_update(const char *section,
Packit 8480eb
			const char *key, const char *value,
Packit 8480eb
			unsigned long flags)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co = NULL;
Packit 8480eb
	int ret;
Packit 8480eb
Packit 8480eb
	ret = CFG_FAIL;
Packit 8480eb
	co = conf_lookup(section, key);
Packit 8480eb
	if (!co)
Packit 8480eb
		return conf_add(section, key, value, flags);
Packit 8480eb
	else {
Packit 8480eb
		char *val = NULL, *tmp = NULL;
Packit 8480eb
		/* Environment overrides file value */
Packit 8480eb
		if (((flags & CONF_ENV) && (tmp = getenv(key))) || value) {
Packit 8480eb
			if (tmp)
Packit 8480eb
				val = strdup(tmp);
Packit 8480eb
			else {
Packit 8480eb
				if (value)
Packit 8480eb
					val = strdup(value);
Packit 8480eb
			}
Packit 8480eb
			if (!val)
Packit 8480eb
				goto error;
Packit 8480eb
		}
Packit 8480eb
		if (co->value)
Packit 8480eb
			free(co->value);
Packit 8480eb
		co->value = val;
Packit 8480eb
		if (flags)
Packit 8480eb
			co->flags = flags;
Packit 8480eb
		/* Don't change user set values in the environment */
Packit 8480eb
		if (flags & CONF_ENV && value)
Packit 8480eb
			setenv(key, value, 0);
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return CFG_OK;
Packit 8480eb
Packit 8480eb
error:
Packit 8480eb
	return ret;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static struct conf_option *conf_lookup_key(const char *section, const char *key)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
	u_int32_t key_hash;
Packit 8480eb
	unsigned int size = CFG_TABLE_SIZE;
Packit 8480eb
Packit 8480eb
	key_hash = get_hash(key, size);
Packit 8480eb
	for (co = config->hash[key_hash]; co != NULL; co = co->next) {
Packit 8480eb
		if (strcasecmp(section, co->section))
Packit 8480eb
			continue;
Packit 8480eb
		if (!strcasecmp(key, co->name))
Packit 8480eb
			break;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return co;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static struct conf_option *conf_lookup(const char *section, const char *key)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
Packit 8480eb
	if (!key || !section)
Packit 8480eb
		return NULL;
Packit 8480eb
Packit 8480eb
	if (strlen(key) > PATH_MAX)
Packit 8480eb
		return NULL;
Packit 8480eb
Packit 8480eb
	co = conf_lookup_key(section, key);
Packit 8480eb
	if (!co) {
Packit 8480eb
		/*
Packit 8480eb
		 * Strip "DEFAULT_" and look for config entry for
Packit 8480eb
		 * backward compatibility with old style config names.
Packit 8480eb
		 * Perhaps this should be a case sensitive compare?
Packit 8480eb
		 */
Packit 8480eb
		if (strlen(key) > 8 && !strncasecmp("DEFAULT_", key, 8))
Packit 8480eb
			co = conf_lookup_key(section, key + 8);
Packit 8480eb
		else {
Packit 8480eb
			/* A new key name has been given but the value
Packit 8480eb
			 * we seek is stored under an old key name (which
Packit 8480eb
			 * includes the "DEFAULT_" prefix or doesn't exist.
Packit 8480eb
			 */
Packit 8480eb
			char old_key[PATH_MAX + 1];
Packit 8480eb
Packit 8480eb
			strcpy(old_key, "DEFAULT_");
Packit 8480eb
			strcat(old_key, key);
Packit 8480eb
			co = conf_lookup_key(section, old_key);
Packit 8480eb
		}
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return co;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static char **conf_enumerate_amd_mount_sections(void)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *this;
Packit 8480eb
	unsigned int count;
Packit 8480eb
	char **paths;
Packit 8480eb
	char *last;
Packit 8480eb
	int i, j;
Packit 8480eb
Packit 8480eb
	last = NULL;
Packit 8480eb
	count = 0;
Packit 8480eb
	for (i = 0; i < CFG_TABLE_SIZE; i++) {
Packit 8480eb
		if (!config->hash[i])
Packit 8480eb
			continue;
Packit 8480eb
Packit 8480eb
		this = config->hash[i];
Packit 8480eb
		while (this) {
Packit 8480eb
			/* Only amd mount section names begin with '/' */
Packit 8480eb
			if (*this->section != '/') {
Packit 8480eb
				this = this->next;
Packit 8480eb
				continue;
Packit 8480eb
			}
Packit 8480eb
Packit 8480eb
			if (!last ||
Packit 8480eb
			   strcmp(this->section, last))
Packit 8480eb
				count ++;
Packit 8480eb
			last = this->section;
Packit 8480eb
			this = this->next;
Packit 8480eb
		}
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	if (!count)
Packit 8480eb
		return NULL;
Packit 8480eb
Packit 8480eb
	paths = (char **) malloc(((count + 1) * sizeof(char *)));
Packit 8480eb
	if (!paths)
Packit 8480eb
		return NULL;
Packit 8480eb
	memset(paths, 0, ((count + 1) * sizeof(char *)));
Packit 8480eb
Packit 8480eb
	last = NULL;
Packit 8480eb
	j = 0;
Packit 8480eb
Packit 8480eb
	for (i = 0; i < CFG_TABLE_SIZE; i++) {
Packit 8480eb
		if (!config->hash[i])
Packit 8480eb
			continue;
Packit 8480eb
Packit 8480eb
		this = config->hash[i];
Packit 8480eb
		while (this) {
Packit 8480eb
			/* Only amd mount section names begin with '/' */
Packit 8480eb
			if (*this->section != '/') {
Packit 8480eb
				this = this->next;
Packit 8480eb
				continue;
Packit 8480eb
			}
Packit 8480eb
Packit 8480eb
			if (!last ||
Packit 8480eb
			    strcmp(this->section, last)) {
Packit 8480eb
				char *path = strdup(this->section);
Packit 8480eb
				if (!path)
Packit 8480eb
					goto fail;
Packit 8480eb
				paths[j++] = path;
Packit 8480eb
			}
Packit 8480eb
			last = this->section;
Packit 8480eb
			this = this->next;
Packit 8480eb
		}
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return paths;
Packit 8480eb
Packit 8480eb
fail:
Packit 8480eb
	i = 0;
Packit 8480eb
	while (paths[i])
Packit 8480eb
		free(paths[i++]);
Packit 8480eb
	free(paths);
Packit 8480eb
	return NULL;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static unsigned int conf_section_exists(const char *section)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
	int ret;
Packit 8480eb
Packit 8480eb
	if (!section)
Packit 8480eb
		return 0;
Packit 8480eb
Packit 8480eb
	ret = 0;
Packit 8480eb
	defaults_mutex_lock();
Packit 8480eb
	co = conf_lookup(section, section);
Packit 8480eb
	if (co)
Packit 8480eb
		ret = 1;
Packit 8480eb
	defaults_mutex_unlock();
Packit 8480eb
Packit 8480eb
	return ret;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
/*
Packit 8480eb
 * We've changed the key names so we need to check for the
Packit 8480eb
 * config key and it's old name for backward conpatibility.
Packit 8480eb
*/
Packit 8480eb
static int check_set_config_value(const char *section,
Packit 8480eb
				  const char *res, const char *value)
Packit 8480eb
{
Packit 8480eb
	const char *sec;
Packit 8480eb
	int ret;
Packit 8480eb
Packit 8480eb
	if (section)
Packit 8480eb
		sec = section;
Packit 8480eb
	else
Packit 8480eb
		sec = autofs_gbl_sec;
Packit 8480eb
Packit 8480eb
	if (!strcasecmp(res, NAME_LDAP_URI))
Packit 8480eb
		ret = conf_add(sec, res, value, 0);
Packit 8480eb
	else if (!strcasecmp(res, NAME_SEARCH_BASE))
Packit 8480eb
		ret = conf_add(sec, res, value, 0);
Packit 8480eb
	else
Packit 8480eb
		ret = conf_update(sec, res, value, 0);
Packit 8480eb
Packit 8480eb
	return ret;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static int parse_line(char *line, char **sec, char **res, char **value)
Packit 8480eb
{
Packit 8480eb
	char *key, *val, *trailer;
Packit 8480eb
	char *tmp;
Packit 8480eb
	int len;
Packit 8480eb
Packit 8480eb
	key = line;
Packit 8480eb
Packit 8480eb
	if (*key == '#' || (*key != '[' && !isalpha(*key)))
Packit 8480eb
		return 0;
Packit 8480eb
Packit 8480eb
	while (*key && isblank(*key))
Packit 8480eb
		key++;
Packit 8480eb
Packit 8480eb
	if (!*key)
Packit 8480eb
		return 0;
Packit 8480eb
Packit 8480eb
	if (*key == '[') {
Packit 8480eb
		char *tmp;
Packit 8480eb
		while (*key && (*key == '[' || isblank(*key)))
Packit 8480eb
			key++;
Packit 8480eb
		tmp = strchr(key, ']');
Packit 8480eb
		if (!tmp)
Packit 8480eb
			return 0;
Packit 8480eb
		*tmp = ' ';
Packit 8480eb
		while (*tmp && isblank(*tmp)) {
Packit 8480eb
			*tmp = '\0';
Packit 8480eb
			tmp--;
Packit 8480eb
		}
Packit 8480eb
		*sec = key;
Packit 8480eb
		*res = NULL;
Packit 8480eb
		*value = NULL;
Packit 8480eb
		return 1;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	if (!(val = strchr(key, '=')))
Packit 8480eb
		return 0;
Packit 8480eb
Packit 8480eb
	tmp = val;
Packit 8480eb
Packit 8480eb
	*val++ = '\0';
Packit 8480eb
Packit 8480eb
	while (isblank(*(--tmp)))
Packit 8480eb
		*tmp = '\0';
Packit 8480eb
Packit 8480eb
	while (*val && (*val == '"' || isblank(*val)))
Packit 8480eb
		val++;
Packit 8480eb
Packit 8480eb
	len = strlen(val);
Packit 8480eb
Packit 8480eb
	if (val[len - 1] == '\n') {
Packit 8480eb
		val[len - 1] = '\0';
Packit 8480eb
		len--;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	trailer = strchr(val, '#');
Packit 8480eb
	if (!trailer)
Packit 8480eb
		trailer = val + len - 1;
Packit 8480eb
	else
Packit 8480eb
		trailer--;
Packit 8480eb
Packit 8480eb
	while (*trailer && (*trailer == '"' || isblank(*trailer)))
Packit 8480eb
		*(trailer--) = '\0';;
Packit 8480eb
Packit 8480eb
	*sec = NULL;
Packit 8480eb
	*res = key;
Packit 8480eb
	*value = val;
Packit 8480eb
Packit 8480eb
	return 1;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static int read_config(unsigned int to_syslog, FILE *f, const char *name)
Packit 8480eb
{
Packit 8480eb
	char buf[MAX_LINE_LEN + 2];
Packit 8480eb
	char secbuf[MAX_SECTION_NAME];
Packit 8480eb
	char *new_sec;
Packit 8480eb
	char *res;
Packit 8480eb
Packit 8480eb
	new_sec = NULL;
Packit 8480eb
	while ((res = fgets(buf, MAX_LINE_LEN + 1, f))) {
Packit 8480eb
		char *sec, *key, *value;
Packit 8480eb
Packit 8480eb
		if (strlen(res) > MAX_LINE_LEN) {
Packit 8480eb
			message(to_syslog, "%s was truncated, ignored", res);
Packit 8480eb
			continue;
Packit 8480eb
		}
Packit 8480eb
Packit 8480eb
		sec = key = value = NULL;
Packit 8480eb
		if (!parse_line(res, &sec, &key, &value))
Packit 8480eb
			continue;
Packit 8480eb
		if (sec) {
Packit 8480eb
			strcpy(secbuf, sec);
Packit 8480eb
			new_sec = &secbuf[0];
Packit 8480eb
			conf_update(sec, sec, NULL, 0);
Packit 8480eb
			continue;
Packit 8480eb
		}
Packit 8480eb
		if (!strcasecmp(res, NAME_AMD_MOUNT_TYPE)) {
Packit 8480eb
			message(to_syslog,
Packit 8480eb
				"%s is always autofs, ignored", res);
Packit 8480eb
			continue;
Packit 8480eb
		}
Packit 8480eb
		if (!strcasecmp(res, NAME_AMD_PID_FILE)) {
Packit 8480eb
			message(to_syslog,
Packit 8480eb
				"%s must be specified as a command line"
Packit 8480eb
				" option, ignored", res);
Packit 8480eb
			continue;
Packit 8480eb
		}
Packit 8480eb
		if (!strcasecmp(res, NAME_AMD_RESTART_MOUNTS)) {
Packit 8480eb
			message(to_syslog,
Packit 8480eb
				"%s is always done by autofs, ignored", res);
Packit 8480eb
			continue;
Packit 8480eb
		}
Packit 8480eb
		if (!strcasecmp(res, NAME_AMD_USE_TCPWRAPPERS) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_AUTO_ATTRCACHE) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_PRINT_PID) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_PRINT_VERSION) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_LOG_FILE) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_PREFERRED_AMQ_PORT) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_TRUNCATE_LOG) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_DEBUG_MTAB_FILE) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_DEBUG_OPTIONS) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_SUN_MAP_SYNTAX) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_PORTMAP_PROGRAM) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_VERS) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_VERS_PING) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_PROTO) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_ALLOW_ANY_INTERFACE) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_ALLOW_INSECURE_PORT) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_RETRANSMIT_COUNTER) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_RETRANSMIT_COUNTER_UDP) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_RETRANSMIT_COUNTER_TCP) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_RETRANSMIT_COUNTER_TOPLVL) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_RETRY_INTERVAL) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_RETRY_INTERVAL_UDP) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_RETRY_INTERVAL_TCP) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_NFS_RETRY_INTERVAL_TOPLVL) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_LDAP_CACHE_MAXMEM) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_LDAP_CACHE_SECONDS) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_LDAP_PROTO_VERSION) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_SHOW_STATFS_ENTRIES) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_CACHE_DURATION) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_MAP_RELOAD_INTERVAL) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_MAP_OPTIONS) ||
Packit 8480eb
		    !strcasecmp(res, NAME_AMD_PLOCK)) {
Packit 8480eb
			message(to_syslog,
Packit 8480eb
				"%s is not used by autofs, ignored", res);
Packit 8480eb
			continue;
Packit 8480eb
		}
Packit 8480eb
		check_set_config_value(new_sec, key, value);
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	if (!feof(f) || ferror(f)) {
Packit 8480eb
		message(to_syslog,
Packit 8480eb
			"fgets returned error %d while reading config %s",
Packit 8480eb
			ferror(f), name);
Packit 8480eb
		return 0;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return 0;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
struct conf_option *save_ldap_option_list(const char *key)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co, *head, *this, *last;
Packit 8480eb
	unsigned int size = CFG_TABLE_SIZE;
Packit 8480eb
	u_int32_t key_hash;
Packit 8480eb
Packit 8480eb
	key_hash = get_hash(key, size);
Packit 8480eb
	co = config->hash[key_hash];
Packit 8480eb
	if (!co)
Packit 8480eb
		return NULL;
Packit 8480eb
	last = co;
Packit 8480eb
Packit 8480eb
	head = this = NULL;
Packit 8480eb
	while (co) {
Packit 8480eb
		if (strcasecmp(autofs_gbl_sec, co->section)) {
Packit 8480eb
			last = co;
Packit 8480eb
			goto next;
Packit 8480eb
		}
Packit 8480eb
Packit 8480eb
		if (!strcasecmp(co->name, key)) {
Packit 8480eb
			/* Unlink from old */
Packit 8480eb
			if (co == config->hash[key_hash])
Packit 8480eb
				config->hash[key_hash] = co->next;
Packit 8480eb
			else
Packit 8480eb
				last->next = co->next;
Packit 8480eb
			last = co->next;
Packit 8480eb
			co->next = NULL;
Packit 8480eb
			/* Add to new */
Packit 8480eb
			if (this)
Packit 8480eb
				this->next = co;
Packit 8480eb
			this = co;
Packit 8480eb
			/* If none have been found yet */
Packit 8480eb
			if (!head)
Packit 8480eb
				head = co;
Packit 8480eb
			co = last;
Packit 8480eb
			continue;
Packit 8480eb
		}
Packit 8480eb
next:
Packit 8480eb
		co = co->next;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return head;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
void restore_ldap_option_list(struct conf_option *list)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co, *this, *last;
Packit 8480eb
	unsigned int size = CFG_TABLE_SIZE;
Packit 8480eb
	u_int32_t key_hash;
Packit 8480eb
Packit 8480eb
	if (!list)
Packit 8480eb
		return;
Packit 8480eb
Packit 8480eb
	this = list;
Packit 8480eb
	while (this) {
Packit 8480eb
		last = this;
Packit 8480eb
		this = this->next;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	key_hash = get_hash(list->name, size);
Packit 8480eb
	co = config->hash[key_hash];
Packit 8480eb
	config->hash[key_hash] = list;
Packit 8480eb
	if (co)
Packit 8480eb
		last->next = co;
Packit 8480eb
Packit 8480eb
	return;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
void free_ldap_option_list(struct conf_option *list)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *next, *this;
Packit 8480eb
Packit 8480eb
	if (!list)
Packit 8480eb
		return;
Packit 8480eb
Packit 8480eb
	this = list;
Packit 8480eb
	while (this) {
Packit 8480eb
		next = this->next;
Packit 8480eb
		free(this->section);
Packit 8480eb
		free(this->name);
Packit 8480eb
		free(this->value);
Packit 8480eb
		free(this);
Packit 8480eb
		this = next;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static void clean_ldap_multi_option(const char *key)
Packit 8480eb
{
Packit 8480eb
	const char *sec = autofs_gbl_sec;
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
Packit 8480eb
	while ((co = conf_lookup(sec, key)))
Packit 8480eb
		conf_delete(co->section, co->name);
Packit 8480eb
Packit 8480eb
	return;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static int reset_defaults(unsigned int to_syslog)
Packit 8480eb
{
Packit 8480eb
	int ret;
Packit 8480eb
Packit 8480eb
	ret = conf_load_autofs_defaults();
Packit 8480eb
	if (!ret) {
Packit 8480eb
		message(to_syslog, "failed to reset autofs default config");
Packit 8480eb
		return 0;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	ret = conf_load_amd_defaults();
Packit 8480eb
	if (!ret) {
Packit 8480eb
		message(to_syslog, "failed to reset amd default config");
Packit 8480eb
		return 0;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return 1;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
/*
Packit 8480eb
 * Read config env variables and check they have been set.
Packit 8480eb
 *
Packit 8480eb
 * This simple minded routine assumes the config file
Packit 8480eb
 * is valid bourne shell script without spaces around "="
Packit 8480eb
 * and that it has valid values.
Packit 8480eb
 */
Packit 8480eb
unsigned int defaults_read_config(unsigned int to_syslog)
Packit 8480eb
{
Packit 8480eb
	FILE *conf, *oldconf;
Packit 8480eb
	struct stat stb, oldstb;
Packit 8480eb
	int ret, stat, oldstat;
Packit 8480eb
Packit 8480eb
	ret = 1;
Packit 8480eb
Packit 8480eb
	conf = oldconf = NULL;
Packit 8480eb
Packit 8480eb
	defaults_mutex_lock();
Packit 8480eb
	if (!config) {
Packit 8480eb
		if (conf_init()) {
Packit 8480eb
			message(to_syslog, "failed to init config");
Packit 8480eb
			ret = 0;
Packit 8480eb
			goto out;
Packit 8480eb
		}
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	conf = open_fopen_r(DEFAULT_CONFIG_FILE);
Packit 8480eb
	if (!conf)
Packit Service 5ea8cd
		message(to_syslog, "failed to open config %s",
Packit 8480eb
			DEFAULT_CONFIG_FILE);
Packit 8480eb
Packit 8480eb
	oldconf = open_fopen_r(OLD_CONFIG_FILE);
Packit Service 5ea8cd
	if (!oldconf && !conf)
Packit Service 5ea8cd
		message(to_syslog, "failed to open old config %s",
Packit 8480eb
			OLD_CONFIG_FILE);
Packit 8480eb
Packit 8480eb
	/* Neither config has been updated */
Packit 8480eb
	stat = oldstat = -1;
Packit 8480eb
	if (conf && oldconf &&
Packit 8480eb
	    (stat = fstat(fileno(conf), &stb) != -1) &&
Packit 8480eb
	    stb.st_mtime <= config->modified &&
Packit 8480eb
	    (oldstat = fstat(fileno(oldconf), &oldstb) == -1) &&
Packit 8480eb
	    oldstb.st_mtime <= config->modified) {
Packit 8480eb
		goto out;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	if (conf || oldconf) {
Packit 8480eb
		if (!reset_defaults(to_syslog)) {
Packit 8480eb
			ret = 0;
Packit 8480eb
			goto out;
Packit 8480eb
		}
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	/* Update last modified */
Packit 8480eb
	if (stat != -1) {
Packit 8480eb
		if (oldstat == -1)
Packit 8480eb
			config->modified = stb.st_mtime;
Packit 8480eb
		else {
Packit 8480eb
			if (oldstb.st_mtime < stb.st_mtime)
Packit 8480eb
				config->modified = oldstb.st_mtime;
Packit 8480eb
			else
Packit 8480eb
				config->modified = stb.st_mtime;
Packit 8480eb
		}
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	if (conf)
Packit 8480eb
		read_config(to_syslog, conf, DEFAULT_CONFIG_FILE);
Packit 8480eb
Packit 8480eb
	/*
Packit 8480eb
	 * Read the old config file and override the installed
Packit 8480eb
	 * defaults in case user has a stale config following
Packit 8480eb
	 * updating to the new config file location.
Packit 8480eb
	 */
Packit 8480eb
	if (oldconf) {
Packit 8480eb
		struct conf_option *ldap_search_base, *ldap_uris;
Packit 8480eb
		const char *sec = amd_gbl_sec;
Packit 8480eb
		struct conf_option *co;
Packit 8480eb
Packit 8480eb
		ldap_search_base = save_ldap_option_list(NAME_SEARCH_BASE);
Packit 8480eb
		if (ldap_search_base)
Packit 8480eb
			clean_ldap_multi_option(NAME_SEARCH_BASE);
Packit 8480eb
Packit 8480eb
		ldap_uris = save_ldap_option_list(NAME_LDAP_URI);
Packit 8480eb
		if (ldap_uris)
Packit 8480eb
			clean_ldap_multi_option(NAME_LDAP_URI);
Packit 8480eb
Packit 8480eb
		read_config(to_syslog, oldconf, OLD_CONFIG_FILE);
Packit 8480eb
Packit 8480eb
		if (ldap_search_base) {
Packit 8480eb
			co = conf_lookup(sec, NAME_SEARCH_BASE);
Packit 8480eb
			if (co)
Packit 8480eb
				free_ldap_option_list(ldap_search_base);
Packit 8480eb
			else
Packit 8480eb
				restore_ldap_option_list(ldap_search_base);
Packit 8480eb
		}
Packit 8480eb
Packit 8480eb
		if (ldap_uris) {
Packit 8480eb
			co = conf_lookup(sec, NAME_LDAP_URI);
Packit 8480eb
			if (co)
Packit 8480eb
				free_ldap_option_list(ldap_uris);
Packit 8480eb
			else
Packit 8480eb
				restore_ldap_option_list(ldap_uris);
Packit 8480eb
		}
Packit 8480eb
	}
Packit 8480eb
out:
Packit 8480eb
	if (conf)
Packit 8480eb
		fclose(conf);
Packit 8480eb
	if (oldconf)
Packit 8480eb
		fclose(oldconf);
Packit 8480eb
	defaults_mutex_unlock();
Packit 8480eb
	return ret;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static char *conf_get_string(const char *section, const char *name)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
	char *val = NULL;
Packit 8480eb
Packit 8480eb
	defaults_mutex_lock();
Packit 8480eb
	co = conf_lookup(section, name);
Packit 8480eb
	if (co && co->value)
Packit 8480eb
		val = strdup(co->value);
Packit 8480eb
	defaults_mutex_unlock();
Packit 8480eb
	return val;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static long conf_get_number(const char *section, const char *name)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
	long val = -1;
Packit 8480eb
Packit 8480eb
	defaults_mutex_lock();
Packit 8480eb
	co = conf_lookup(section, name);
Packit 8480eb
	if (co && co->value)
Packit 8480eb
		val = atol(co->value);
Packit 8480eb
	defaults_mutex_unlock();
Packit 8480eb
	return val;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static int conf_get_yesno(const char *section, const char *name)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
	int val = -1;
Packit 8480eb
Packit 8480eb
	defaults_mutex_lock();
Packit 8480eb
	co = conf_lookup(section, name);
Packit 8480eb
	if (co && co->value) {
Packit 8480eb
		if (isdigit(*co->value))
Packit 8480eb
			val = atoi(co->value);
Packit 8480eb
		else if (!strcasecmp(co->value, "yes"))
Packit 8480eb
			val = 1;
Packit 8480eb
		else if (!strcasecmp(co->value, "no"))
Packit 8480eb
			val = 0;
Packit 8480eb
	}
Packit 8480eb
	defaults_mutex_unlock();
Packit 8480eb
	return val;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
#ifdef WITH_LDAP
Packit 8480eb
void defaults_free_uris(struct list_head *list)
Packit 8480eb
{
Packit 8480eb
	struct list_head *next;
Packit 8480eb
	struct ldap_uri *uri;
Packit 8480eb
Packit 8480eb
	if (list_empty(list)) {
Packit 8480eb
		free(list);
Packit 8480eb
		return;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	next = list->next;
Packit 8480eb
	while (next != list) {
Packit 8480eb
		uri = list_entry(next, struct ldap_uri, list);
Packit 8480eb
		next = next->next;
Packit 8480eb
		list_del(&uri->list);
Packit 8480eb
		free(uri->uri);
Packit 8480eb
		free(uri);
Packit 8480eb
	}
Packit 8480eb
	free(list);
Packit 8480eb
Packit 8480eb
	return;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static unsigned int add_uris(char *value, struct list_head *list)
Packit 8480eb
{
Packit 8480eb
	char *str, *tok, *ptr = NULL;
Packit 8480eb
	size_t len = strlen(value) + 1;
Packit 8480eb
Packit 8480eb
	str = malloc(len);
Packit 8480eb
	if (!str)
Packit 8480eb
		return 0;
Packit 8480eb
	strcpy(str, value);
Packit 8480eb
Packit 8480eb
	tok = strtok_r(str, " ", &ptr);
Packit 8480eb
	while (tok) {
Packit 8480eb
		struct ldap_uri *new;
Packit 8480eb
		char *uri;
Packit 8480eb
Packit 8480eb
		new = malloc(sizeof(struct ldap_uri));
Packit 8480eb
		if (!new)
Packit 8480eb
			continue;
Packit 8480eb
Packit 8480eb
		uri = strdup(tok);
Packit 8480eb
		if (!uri)
Packit 8480eb
			free(new);
Packit 8480eb
		else {
Packit 8480eb
			new->uri = uri;
Packit 8480eb
			list_add_tail(&new->list, list);
Packit 8480eb
		}
Packit 8480eb
Packit 8480eb
		tok = strtok_r(NULL, " ", &ptr);
Packit 8480eb
	}
Packit 8480eb
	free(str);
Packit 8480eb
Packit 8480eb
	return 1;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
struct list_head *defaults_get_uris(void)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
	struct list_head *list;
Packit 8480eb
Packit 8480eb
	list = malloc(sizeof(struct list_head));
Packit 8480eb
	if (!list)
Packit 8480eb
		return NULL;
Packit 8480eb
	INIT_LIST_HEAD(list);
Packit 8480eb
Packit 8480eb
	if (!defaults_read_config(0)) {
Packit 8480eb
		free(list);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	defaults_mutex_lock();
Packit 8480eb
	co = conf_lookup(autofs_gbl_sec, NAME_LDAP_URI);
Packit 8480eb
	if (!co) {
Packit 8480eb
		defaults_mutex_unlock();
Packit 8480eb
		free(list);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	while (co) {
Packit 8480eb
		if (!strcasecmp(co->name, NAME_LDAP_URI))
Packit 8480eb
			if (co->value)
Packit 8480eb
				add_uris(co->value, list);
Packit 8480eb
		co = co->next;
Packit 8480eb
	}
Packit 8480eb
	defaults_mutex_unlock();
Packit 8480eb
Packit 8480eb
	if (list_empty(list)) {
Packit 8480eb
		free(list);
Packit 8480eb
		list = NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return list;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
struct ldap_schema *defaults_get_default_schema(void)
Packit 8480eb
{
Packit 8480eb
	struct ldap_schema *schema;
Packit 8480eb
	char *mc, *ma, *ec, *ea, *va;
Packit 8480eb
Packit 8480eb
	mc = strdup(DEFAULT_MAP_OBJ_CLASS);
Packit 8480eb
	if (!mc)
Packit 8480eb
		return NULL;
Packit 8480eb
Packit 8480eb
	ma = strdup(DEFAULT_MAP_ATTR);
Packit 8480eb
	if (!ma) {
Packit 8480eb
		free(mc);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	ec = strdup(DEFAULT_ENTRY_OBJ_CLASS);
Packit 8480eb
	if (!ec) {
Packit 8480eb
		free(mc);
Packit 8480eb
		free(ma);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	ea = strdup(DEFAULT_ENTRY_ATTR);
Packit 8480eb
	if (!ea) {
Packit 8480eb
		free(mc);
Packit 8480eb
		free(ma);
Packit 8480eb
		free(ec);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	va = strdup(DEFAULT_VALUE_ATTR);
Packit 8480eb
	if (!va) {
Packit 8480eb
		free(mc);
Packit 8480eb
		free(ma);
Packit 8480eb
		free(ec);
Packit 8480eb
		free(ea);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	schema = malloc(sizeof(struct ldap_schema));
Packit 8480eb
	if (!schema) {
Packit 8480eb
		free(mc);
Packit 8480eb
		free(ma);
Packit 8480eb
		free(ec);
Packit 8480eb
		free(ea);
Packit 8480eb
		free(va);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	schema->map_class = mc;
Packit 8480eb
	schema->map_attr = ma;
Packit 8480eb
	schema->entry_class = ec;
Packit 8480eb
	schema->entry_attr = ea;
Packit 8480eb
	schema->value_attr = va;
Packit 8480eb
Packit 8480eb
	return schema;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
static struct ldap_searchdn *alloc_searchdn(const char *value)
Packit 8480eb
{
Packit 8480eb
	struct ldap_searchdn *sdn;
Packit 8480eb
	char *val;
Packit 8480eb
Packit 8480eb
	sdn = malloc(sizeof(struct ldap_searchdn));
Packit 8480eb
	if (!sdn)
Packit 8480eb
		return NULL;
Packit 8480eb
Packit 8480eb
	val = strdup(value);
Packit 8480eb
	if (!val) {
Packit 8480eb
		free(sdn);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	sdn->basedn = val;
Packit 8480eb
	sdn->next = NULL;
Packit 8480eb
Packit 8480eb
	return sdn;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
void defaults_free_searchdns(struct ldap_searchdn *sdn)
Packit 8480eb
{
Packit 8480eb
	struct ldap_searchdn *this = sdn;
Packit 8480eb
	struct ldap_searchdn *next;
Packit 8480eb
Packit 8480eb
	while (this) {
Packit 8480eb
		next = this->next;
Packit 8480eb
		free(this->basedn);
Packit 8480eb
		free(this);
Packit 8480eb
		this = next;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	return;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
struct ldap_searchdn *defaults_get_searchdns(void)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
	struct ldap_searchdn *sdn, *last;
Packit 8480eb
Packit 8480eb
	if (!defaults_read_config(0))
Packit 8480eb
		return NULL;
Packit 8480eb
Packit 8480eb
	defaults_mutex_lock();
Packit 8480eb
	co = conf_lookup(autofs_gbl_sec, NAME_SEARCH_BASE);
Packit 8480eb
	if (!co) {
Packit 8480eb
		defaults_mutex_unlock();
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	sdn = last = NULL;
Packit 8480eb
Packit 8480eb
	while (co) {
Packit 8480eb
		struct ldap_searchdn *new;
Packit 8480eb
Packit 8480eb
		if (!co->value || strcasecmp(co->name, NAME_SEARCH_BASE) ) {
Packit 8480eb
			co = co->next;
Packit 8480eb
			continue;
Packit 8480eb
		}
Packit 8480eb
Packit 8480eb
		new = alloc_searchdn(co->value);
Packit 8480eb
		if (!new) {
Packit 8480eb
			defaults_mutex_unlock();
Packit 8480eb
			defaults_free_searchdns(sdn);
Packit 8480eb
			return NULL;
Packit 8480eb
		}
Packit 8480eb
Packit 8480eb
		if (!last)
Packit 8480eb
			last = new;
Packit 8480eb
		else {
Packit 8480eb
			last->next = new;
Packit 8480eb
			last = new;
Packit 8480eb
		}
Packit 8480eb
Packit 8480eb
		if (!sdn)
Packit 8480eb
			sdn = new;
Packit 8480eb
Packit 8480eb
		co = co->next;
Packit 8480eb
	}
Packit 8480eb
	defaults_mutex_unlock();
Packit 8480eb
Packit 8480eb
	return sdn;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
struct ldap_schema *defaults_get_schema(void)
Packit 8480eb
{
Packit 8480eb
	struct ldap_schema *schema;
Packit 8480eb
	char *mc, *ma, *ec, *ea, *va;
Packit 8480eb
	const char *sec = autofs_gbl_sec;
Packit 8480eb
Packit 8480eb
	mc = conf_get_string(sec, NAME_MAP_OBJ_CLASS);
Packit 8480eb
	if (!mc)
Packit 8480eb
		return NULL;
Packit 8480eb
Packit 8480eb
	ma = conf_get_string(sec, NAME_MAP_ATTR);
Packit 8480eb
	if (!ma) {
Packit 8480eb
		free(mc);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	ec = conf_get_string(sec, NAME_ENTRY_OBJ_CLASS);
Packit 8480eb
	if (!ec) {
Packit 8480eb
		free(mc);
Packit 8480eb
		free(ma);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	ea = conf_get_string(sec, NAME_ENTRY_ATTR);
Packit 8480eb
	if (!ea) {
Packit 8480eb
		free(mc);
Packit 8480eb
		free(ma);
Packit 8480eb
		free(ec);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	va = conf_get_string(sec, NAME_VALUE_ATTR);
Packit 8480eb
	if (!va) {
Packit 8480eb
		free(mc);
Packit 8480eb
		free(ma);
Packit 8480eb
		free(ec);
Packit 8480eb
		free(ea);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	schema = malloc(sizeof(struct ldap_schema));
Packit 8480eb
	if (!schema) {
Packit 8480eb
		free(mc);
Packit 8480eb
		free(ma);
Packit 8480eb
		free(ec);
Packit 8480eb
		free(ea);
Packit 8480eb
		free(va);
Packit 8480eb
		return NULL;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	schema->map_class = mc;
Packit 8480eb
	schema->map_attr = ma;
Packit 8480eb
	schema->entry_class = ec;
Packit 8480eb
	schema->entry_attr = ea;
Packit 8480eb
	schema->value_attr = va;
Packit 8480eb
Packit 8480eb
	return schema;
Packit 8480eb
}
Packit 8480eb
#endif
Packit 8480eb
Packit 8480eb
const char *defaults_get_master_map(void)
Packit 8480eb
{
Packit 8480eb
	char *master = conf_get_string(autofs_gbl_sec, NAME_MASTER_MAP);
Packit 8480eb
	if (!master)
Packit 8480eb
		return strdup(default_master_map_name);
Packit 8480eb
Packit 8480eb
	return (const char *) master;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
int defaults_master_set(void)
Packit 8480eb
{
Packit 8480eb
	struct conf_option *co;
Packit 8480eb
Packit 8480eb
	defaults_mutex_lock();
Packit 8480eb
	co = conf_lookup(autofs_gbl_sec, NAME_MASTER_MAP);
Packit 8480eb
	defaults_mutex_unlock();
Packit 8480eb
	if (co)
Packit 8480eb
		return 1;
Packit 8480eb
	return 0;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_timeout(void)
Packit 8480eb
{
Packit 8480eb
	long timeout;
Packit 8480eb
Packit 8480eb
	timeout = conf_get_number(autofs_gbl_sec, NAME_TIMEOUT);
Packit 8480eb
	if (timeout < 0)
Packit 8480eb
		timeout = atol(DEFAULT_TIMEOUT);
Packit 8480eb
Packit 8480eb
	return (unsigned int) timeout;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
int defaults_get_master_wait(void)
Packit 8480eb
{
Packit 8480eb
	long wait;
Packit 8480eb
Packit 8480eb
	wait = conf_get_number(autofs_gbl_sec, NAME_MASTER_WAIT);
Packit 8480eb
	if (wait < 0)
Packit 8480eb
		wait = atol(DEFAULT_MASTER_WAIT);
Packit 8480eb
Packit 8480eb
	return (int) wait;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_negative_timeout(void)
Packit 8480eb
{
Packit 8480eb
	long n_timeout;
Packit 8480eb
Packit 8480eb
	n_timeout = conf_get_number(autofs_gbl_sec, NAME_NEGATIVE_TIMEOUT);
Packit 8480eb
	if (n_timeout <= 0)
Packit 8480eb
		n_timeout = atol(DEFAULT_NEGATIVE_TIMEOUT);
Packit 8480eb
Packit 8480eb
	return (unsigned int) n_timeout;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_browse_mode(void)
Packit 8480eb
{
Packit 8480eb
	int res;
Packit 8480eb
Packit 8480eb
	res = conf_get_yesno(autofs_gbl_sec, NAME_BROWSE_MODE);
Packit 8480eb
	if (res < 0)
Packit 8480eb
		res = atoi(DEFAULT_BROWSE_MODE);
Packit 8480eb
Packit 8480eb
	return res;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_logging(void)
Packit 8480eb
{
Packit 8480eb
	char *res;
Packit 8480eb
	unsigned int logging = LOGOPT_NONE;
Packit 8480eb
Packit 8480eb
	res = conf_get_string(autofs_gbl_sec, NAME_LOGGING);
Packit 8480eb
	if (!res)
Packit 8480eb
		return logging;
Packit 8480eb
Packit 8480eb
	if (!strcasecmp(res, "none"))
Packit 8480eb
		logging = LOGOPT_NONE;
Packit 8480eb
	else {
Packit 8480eb
		if (!strcasecmp(res, "verbose"))
Packit 8480eb
			logging |= LOGOPT_VERBOSE;
Packit 8480eb
Packit 8480eb
		if (!strcasecmp(res, "debug"))
Packit 8480eb
			logging |= LOGOPT_DEBUG;
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	free(res);
Packit 8480eb
Packit 8480eb
	return logging;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_force_std_prog_map_env(void)
Packit 8480eb
{
Packit 8480eb
	int res;
Packit 8480eb
Packit 8480eb
	res = conf_get_yesno(autofs_gbl_sec, NAME_FORCE_STD_PROG_MAP_ENV);
Packit 8480eb
	if (res < 0)
Packit 8480eb
		res = atoi(DEFAULT_FORCE_STD_PROG_MAP_ENV);
Packit 8480eb
Packit 8480eb
	return res;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_ldap_timeout(void)
Packit 8480eb
{
Packit 8480eb
	int res;
Packit 8480eb
Packit 8480eb
	res = conf_get_number(autofs_gbl_sec, NAME_LDAP_TIMEOUT);
Packit 8480eb
	if (res < 0)
Packit 8480eb
		res = atoi(DEFAULT_LDAP_TIMEOUT);
Packit 8480eb
Packit 8480eb
	return res;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_ldap_network_timeout(void)
Packit 8480eb
{
Packit 8480eb
	int res;
Packit 8480eb
Packit 8480eb
	res = conf_get_number(autofs_gbl_sec, NAME_LDAP_NETWORK_TIMEOUT);
Packit 8480eb
	if (res < 0)
Packit 8480eb
		res = atoi(DEFAULT_LDAP_NETWORK_TIMEOUT);
Packit 8480eb
Packit 8480eb
	return res;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_mount_nfs_default_proto(void)
Packit 8480eb
{
Packit 8480eb
	int proto;
Packit 8480eb
Packit 8480eb
	proto = conf_get_number(autofs_gbl_sec, NAME_MOUNT_NFS_DEFAULT_PROTOCOL);
Packit 8480eb
	if (proto < 2 || proto > 4)
Packit 8480eb
		proto = atoi(DEFAULT_MOUNT_NFS_DEFAULT_PROTOCOL);
Packit 8480eb
Packit 8480eb
	return (unsigned int) proto;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_append_options(void)
Packit 8480eb
{
Packit 8480eb
	int res;
Packit 8480eb
Packit 8480eb
	res = conf_get_yesno(autofs_gbl_sec, NAME_APPEND_OPTIONS);
Packit 8480eb
	if (res < 0)
Packit 8480eb
		res = atoi(DEFAULT_APPEND_OPTIONS);
Packit 8480eb
Packit 8480eb
	return res;
Packit 8480eb
}
Packit 8480eb
Packit Service 15c227
unsigned int defaults_get_mount_verbose(void)
Packit Service 15c227
{
Packit Service 15c227
	long res;
Packit Service 15c227
Packit Service 15c227
	res = conf_get_yesno(autofs_gbl_sec, NAME_MOUNT_VERBOSE);
Packit Service 15c227
	if (res < 0)
Packit Service 15c227
		res = atoi(DEFAULT_MOUNT_VERBOSE);
Packit Service 15c227
Packit Service 15c227
	return res;
Packit Service 15c227
}
Packit Service 15c227
Packit 8480eb
unsigned int defaults_get_mount_wait(void)
Packit 8480eb
{
Packit 8480eb
	long wait;
Packit 8480eb
Packit 8480eb
	wait = conf_get_number(autofs_gbl_sec, NAME_MOUNT_WAIT);
Packit 8480eb
	if (wait < 0)
Packit 8480eb
		wait = atoi(DEFAULT_MOUNT_WAIT);
Packit 8480eb
Packit 8480eb
	return (unsigned int) wait;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_umount_wait(void)
Packit 8480eb
{
Packit 8480eb
	long wait;
Packit 8480eb
Packit 8480eb
	wait = conf_get_number(autofs_gbl_sec, NAME_UMOUNT_WAIT);
Packit 8480eb
	if (wait < 0)
Packit 8480eb
		wait = atoi(DEFAULT_UMOUNT_WAIT);
Packit 8480eb
Packit 8480eb
	return (unsigned int) wait;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
const char *defaults_get_auth_conf_file(void)
Packit 8480eb
{
Packit 8480eb
	char *cf;
Packit 8480eb
Packit 8480eb
	cf = conf_get_string(autofs_gbl_sec, NAME_AUTH_CONF_FILE);
Packit 8480eb
	if (!cf)
Packit 8480eb
		return strdup(default_auth_conf_file);
Packit 8480eb
Packit 8480eb
	return (const char *) cf;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_map_hash_table_size(void)
Packit 8480eb
{
Packit 8480eb
	long size;
Packit 8480eb
Packit 8480eb
	size = conf_get_number(autofs_gbl_sec, NAME_MAP_HASH_TABLE_SIZE);
Packit 8480eb
	if (size < 0)
Packit 8480eb
		size = atoi(DEFAULT_MAP_HASH_TABLE_SIZE);
Packit 8480eb
Packit 8480eb
	return (unsigned int) size;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_use_hostname_for_mounts(void)
Packit 8480eb
{
Packit 8480eb
	int res;
Packit 8480eb
Packit 8480eb
	res = conf_get_yesno(autofs_gbl_sec, NAME_USE_HOSTNAME_FOR_MOUNTS);
Packit 8480eb
	if (res < 0)
Packit 8480eb
		res = atoi(DEFAULT_USE_HOSTNAME_FOR_MOUNTS);
Packit 8480eb
Packit 8480eb
	return res;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_disable_not_found_message(void)
Packit 8480eb
{
Packit 8480eb
	int res;
Packit 8480eb
Packit 8480eb
	res = conf_get_yesno(autofs_gbl_sec, NAME_DISABLE_NOT_FOUND_MESSAGE);
Packit 8480eb
	if (res < 0)
Packit 8480eb
		res = atoi(DEFAULT_DISABLE_NOT_FOUND_MESSAGE);
Packit 8480eb
Packit 8480eb
	return res;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_sss_master_map_wait(void)
Packit 8480eb
{
Packit 8480eb
	int res;
Packit 8480eb
Packit 8480eb
	res = conf_get_yesno(autofs_gbl_sec, NAME_SSS_MASTER_MAP_WAIT);
Packit 8480eb
	if (res < 0)
Packit 8480eb
		res = atoi(DEFAULT_SSS_MASTER_MAP_WAIT);
Packit 8480eb
Packit 8480eb
	return res;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int defaults_get_use_mount_request_log_id(void)
Packit 8480eb
{
Packit 8480eb
	int res;
Packit 8480eb
Packit 8480eb
	res = conf_get_yesno(autofs_gbl_sec, NAME_USE_MOUNT_REQUEST_LOG_ID);
Packit 8480eb
	if (res < 0)
Packit 8480eb
		res = atoi(DEFAULT_USE_MOUNT_REQUEST_LOG_ID);
Packit 8480eb
Packit 8480eb
	return res;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int conf_amd_mount_section_exists(const char *section)
Packit 8480eb
{
Packit 8480eb
	return conf_section_exists(section);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char **conf_amd_get_mount_paths(void)
Packit 8480eb
{
Packit 8480eb
	return conf_enumerate_amd_mount_sections();
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_arch(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_ARCH);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_karch(void)
Packit 8480eb
{
Packit 8480eb
	char *tmp = conf_get_string(amd_gbl_sec, NAME_AMD_KARCH);
Packit 8480eb
	if (!tmp)
Packit 8480eb
		tmp = conf_amd_get_arch();
Packit 8480eb
Packit 8480eb
	return tmp;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_os(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_OS);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_os_ver(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_OSVER);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_vendor(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_VENDOR);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_full_os(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_FULL_OS);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_auto_dir(void)
Packit 8480eb
{
Packit 8480eb
	char *tmp = conf_get_string(amd_gbl_sec, NAME_AMD_AUTO_DIR);
Packit 8480eb
	if (!tmp)
Packit 8480eb
		return strdup(DEFAULT_AMD_AUTO_DIR);
Packit 8480eb
Packit 8480eb
	return tmp;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_cluster(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_CLUSTER);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int conf_amd_get_exec_map_timeout(void)
Packit 8480eb
{
Packit 8480eb
	long tmp = conf_get_number(amd_gbl_sec, NAME_AMD_EXEC_MAP_TIMEOUT);
Packit 8480eb
	if (tmp == -1)
Packit 8480eb
		tmp = atoi(DEFAULT_AMD_EXEC_MAP_TIMEOUT);
Packit 8480eb
Packit 8480eb
	return (unsigned int) tmp;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_hesiod_base(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_HESIOD_BASE);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_ldap_base(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_LDAP_BASE);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_ldap_hostports(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_LDAP_HOSTPORTS);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int conf_amd_get_ldap_proto_version(void)
Packit 8480eb
{
Packit 8480eb
	long tmp = conf_get_number(amd_gbl_sec, NAME_AMD_LDAP_PROTO_VERSION);
Packit 8480eb
	if (tmp == -1)
Packit 8480eb
		tmp = atoi(DEFAULT_AMD_LDAP_PROTO_VERSION);
Packit 8480eb
Packit 8480eb
	return (unsigned int) tmp;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_sub_domain(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_SUB_DOMAIN);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_localhost_address(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_LOCALHOST_ADDRESS);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int conf_amd_get_log_options(void)
Packit 8480eb
{
Packit 8480eb
	int log_level = -1;
Packit 8480eb
	char *tmp = conf_get_string(amd_gbl_sec, NAME_AMD_LOG_OPTIONS);
Packit 8480eb
	if (tmp) {
Packit 8480eb
		if (strstr(tmp, "debug") || strstr(tmp, "all")) {
Packit 8480eb
			if (log_level < LOG_DEBUG)
Packit 8480eb
				log_level = LOG_DEBUG;
Packit 8480eb
		}
Packit 8480eb
		if (strstr(tmp, "info") ||
Packit 8480eb
		    strstr(tmp, "user") ||
Packit 8480eb
		    strcmp(tmp, "defaults")) {
Packit 8480eb
			if (log_level < LOG_INFO)
Packit 8480eb
				log_level = LOG_INFO;
Packit 8480eb
		}
Packit 8480eb
		if (strstr(tmp, "notice")) {
Packit 8480eb
			if (log_level < LOG_NOTICE)
Packit 8480eb
				log_level = LOG_NOTICE;
Packit 8480eb
		}
Packit 8480eb
		if (strstr(tmp, "warn") ||
Packit 8480eb
		    strstr(tmp, "map") ||
Packit 8480eb
		    strstr(tmp, "stats") ||
Packit 8480eb
		    strstr(tmp, "warning")) {
Packit 8480eb
			if (log_level < LOG_WARNING)
Packit 8480eb
				log_level = LOG_WARNING;
Packit 8480eb
		}
Packit 8480eb
		if (strstr(tmp, "error")) {
Packit 8480eb
			if (log_level < LOG_ERR)
Packit 8480eb
				log_level = LOG_ERR;
Packit 8480eb
		}
Packit 8480eb
		if (strstr(tmp, "fatal")) {
Packit 8480eb
			if (log_level < LOG_CRIT)
Packit 8480eb
				log_level = LOG_CRIT;
Packit 8480eb
		}
Packit 8480eb
		free(tmp);
Packit 8480eb
	}
Packit 8480eb
Packit 8480eb
	if (log_level == -1)
Packit 8480eb
		log_level = LOG_ERR;
Packit 8480eb
Packit 8480eb
	return (unsigned int) log_level;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_nis_domain(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_NIS_DOMAIN);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int conf_amd_set_nis_domain(const char *domain)
Packit 8480eb
{
Packit 8480eb
	int ret;
Packit 8480eb
	ret = conf_update(amd_gbl_sec, NAME_AMD_NIS_DOMAIN, domain, CONF_NONE);
Packit 8480eb
Packit 8480eb
	return (unsigned int) ret;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_map_defaults(const char *section)
Packit 8480eb
{
Packit 8480eb
	char *tmp = NULL;
Packit 8480eb
	if (section)
Packit 8480eb
		tmp = conf_get_string(section, NAME_AMD_MAP_DEFAULTS);
Packit 8480eb
	if (!tmp)
Packit 8480eb
		tmp = conf_get_string(amd_gbl_sec, NAME_AMD_MAP_DEFAULTS);
Packit 8480eb
Packit 8480eb
	return tmp;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_map_name(const char *section)
Packit 8480eb
{
Packit 8480eb
	char *tmp = NULL;
Packit 8480eb
	if (section)
Packit 8480eb
		tmp = conf_get_string(section, NAME_AMD_MAP_NAME);
Packit 8480eb
Packit 8480eb
	return tmp;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_map_options(const char *section)
Packit 8480eb
{
Packit 8480eb
	char *tmp = NULL;
Packit 8480eb
	if (section)
Packit 8480eb
		tmp = conf_get_string(section, NAME_AMD_MAP_OPTIONS);
Packit 8480eb
Packit 8480eb
	return tmp;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_map_type(const char *section)
Packit 8480eb
{
Packit 8480eb
	char *tmp = NULL;
Packit 8480eb
	if (section)
Packit 8480eb
		tmp = conf_get_string(section, NAME_AMD_MAP_TYPE);
Packit 8480eb
	if (!tmp)
Packit 8480eb
		tmp = conf_get_string(amd_gbl_sec, NAME_AMD_MAP_TYPE);
Packit 8480eb
Packit 8480eb
	return tmp;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_search_path(const char *section)
Packit 8480eb
{
Packit 8480eb
	char *tmp = NULL;
Packit 8480eb
	if (section)
Packit 8480eb
		tmp = conf_get_string(section, NAME_AMD_SEARCH_PATH);
Packit 8480eb
	if (!tmp)
Packit 8480eb
		tmp = conf_get_string(amd_gbl_sec, NAME_AMD_SEARCH_PATH);
Packit 8480eb
Packit 8480eb
	return tmp;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned int conf_amd_get_dismount_interval(const char *section)
Packit 8480eb
{
Packit 8480eb
	long tmp = -1;
Packit 8480eb
	if (section)
Packit 8480eb
		tmp = conf_get_number(section, NAME_AMD_DISMOUNT_INTERVAL);
Packit 8480eb
	if (tmp == -1)
Packit 8480eb
		tmp = conf_get_number(amd_gbl_sec, NAME_AMD_DISMOUNT_INTERVAL);
Packit 8480eb
	if (tmp == -1)
Packit 8480eb
		tmp = defaults_get_timeout();
Packit 8480eb
	/*
Packit 8480eb
	 * This won't happen as defaults_get_timeout() will return
Packit 8480eb
	 * the autofs setting which is used if no other setting is
Packit 8480eb
	 * found.
Packit 8480eb
	 */
Packit 8480eb
	if (tmp == -1)
Packit 8480eb
		tmp = atoi(DEFAULT_TIMEOUT);
Packit 8480eb
Packit 8480eb
	return (unsigned int) tmp;
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
char *conf_amd_get_linux_ufs_mount_type(void)
Packit 8480eb
{
Packit 8480eb
	return conf_get_string(amd_gbl_sec, NAME_AMD_LINUX_UFS_MOUNT_TYPE);
Packit 8480eb
}
Packit 8480eb
Packit 8480eb
unsigned long conf_amd_get_flags(const char *section)
Packit 8480eb
{
Packit 8480eb
	const char *amd = amd_gbl_sec;
Packit 8480eb
	unsigned long flags, tmp;
Packit 8480eb
Packit 8480eb
	/* Always true for us */
Packit 8480eb
	flags = CONF_MOUNT_TYPE_AUTOFS;
Packit 8480eb
Packit 8480eb
	tmp = -1;
Packit 8480eb
	if (section)
Packit 8480eb
		tmp = conf_get_yesno(section, NAME_AMD_BROWSABLE_DIRS);
Packit 8480eb
	if (tmp == -1)
Packit 8480eb
		tmp = conf_get_yesno(amd, NAME_AMD_BROWSABLE_DIRS);
Packit 8480eb
	if (tmp)
Packit 8480eb
		flags |= CONF_BROWSABLE_DIRS;
Packit 8480eb
Packit 8480eb
	tmp = -1;
Packit 8480eb
	if (section)
Packit 8480eb
		tmp = conf_get_yesno(section, NAME_AMD_SELECTORS_IN_DEFAULTS);
Packit 8480eb
	if (tmp == -1)
Packit 8480eb
		tmp = conf_get_yesno(amd, NAME_AMD_SELECTORS_IN_DEFAULTS);
Packit 8480eb
	if (tmp)
Packit 8480eb
		flags |= CONF_SELECTORS_IN_DEFAULTS;
Packit 8480eb
Packit 8480eb
	tmp = conf_get_yesno(amd, NAME_AMD_NORMALIZE_HOSTNAMES);
Packit 8480eb
	if (tmp)
Packit 8480eb
		flags |= CONF_NORMALIZE_HOSTNAMES;
Packit 8480eb
Packit 8480eb
	tmp = conf_get_yesno(amd, NAME_AMD_RESTART_MOUNTS);
Packit 8480eb
	if (tmp)
Packit 8480eb
		flags |= CONF_RESTART_EXISTING_MOUNTS;
Packit 8480eb
Packit 8480eb
	tmp = conf_get_yesno(amd, NAME_AMD_FULLY_QUALIFIED_HOSTS);
Packit 8480eb
	if (tmp)
Packit 8480eb
		flags |= CONF_FULLY_QUALIFIED_HOSTS;
Packit 8480eb
Packit 8480eb
	tmp = conf_get_yesno(amd, NAME_AMD_UMOUNT_ON_EXIT);
Packit 8480eb
	if (tmp)
Packit 8480eb
		flags |= CONF_UNMOUNT_ON_EXIT;
Packit 8480eb
Packit 8480eb
	tmp = -1;
Packit 8480eb
	if (section)
Packit 8480eb
		tmp = conf_get_yesno(section, NAME_AMD_AUTOFS_USE_LOFS);
Packit 8480eb
	if (tmp == -1)
Packit 8480eb
		tmp = conf_get_yesno(amd, NAME_AMD_AUTOFS_USE_LOFS);
Packit 8480eb
	if (tmp)
Packit 8480eb
		flags |= CONF_AUTOFS_USE_LOFS;
Packit 8480eb
Packit 8480eb
	tmp = conf_get_yesno(amd, NAME_AMD_DOMAIN_STRIP);
Packit 8480eb
	if (tmp)
Packit 8480eb
		flags |= CONF_DOMAIN_STRIP;
Packit 8480eb
Packit 8480eb
	tmp = conf_get_yesno(amd, NAME_AMD_NORMALIZE_SLASHES);
Packit 8480eb
	if (tmp)
Packit 8480eb
		flags |= CONF_NORMALIZE_SLASHES;
Packit 8480eb
Packit 8480eb
	tmp = conf_get_yesno(amd, NAME_AMD_FORCED_UMOUNTS);
Packit 8480eb
	if (tmp)
Packit 8480eb
		flags |= CONF_FORCED_UNMOUNTS;
Packit 8480eb
Packit 8480eb
	return flags;
Packit 8480eb
}