2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
d019449136cec9f203f106de418421095790e4e2Janice Chang * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
faac71c002f7c7a98741f991b25937b24f309df0Jan Kryl * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * BSD 3 Clause License
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Copyright (c) 2007, The Storage Networking Industry Association.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Redistribution and use in source and binary forms, with or without
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * modification, are permitted provided that the following conditions
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * are met:
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions of source code must retain the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Redistributions in binary form must reproduce the above copyright
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * notice, this list of conditions and the following disclaimer in
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * the documentation and/or other materials provided with the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * distribution.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * - Neither the name of The Storage Networking Industry Association (SNIA)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * nor the names of its contributors may be used to endorse or promote
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * products derived from this software without specific prior written
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * permission.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * POSSIBILITY OF SUCH DAMAGE.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * NDMP configuration management
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdio.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <stdlib.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <synch.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <syslog.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <strings.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <ndmpd_prop.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include <libndmp.h>
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar#include "ndmpd.h"
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdartypedef struct ndmpd_cfg_param {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *sc_name;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *sc_defval;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *sc_value;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar uint32_t sc_flags;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar} ndmpd_cfg_param_t;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int ndmpd_config_update(ndmpd_cfg_param_t *cfg, char *value);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * IMPORTANT: any changes to the order of this table's entries
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * need to be reflected in the enum ndmpd_cfg_id_t.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_cfg_param_t ndmpd_cfg_table[] =
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"dar-support", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"mover-nic", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"dump-pathnode", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"tar-pathnode", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"fh-inode", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"ignore-ctime", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"include-lmtime", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"token-maxseq", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"version", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"restore-fullpath", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"debug-path", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"plugin-path", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"socket-css", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"socket-crs", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"mover-recordsize", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"restore-wildcard-enable", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"cram-md5-username", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"cram-md5-password", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"cleartext-username", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"cleartext-password", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"tcp-port", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"backup-quarantine", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"restore-quarantine", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar {"overwrite-quarantine", "", 0, NDMP_CF_NOTINIT},
d019449136cec9f203f106de418421095790e4e2Janice Chang {"zfs-force-override", "", 0, NDMP_CF_NOTINIT},
1e05b03fa76ee89d509f0c461b36cb865f1e6794Janice Chang {"drive-type", "", 0, NDMP_CF_NOTINIT},
faac71c002f7c7a98741f991b25937b24f309df0Jan Kryl {"debug-mode", "", 0, NDMP_CF_NOTINIT},
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar};
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Loads all the NDMP configuration parameters and sets up the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * config table.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_load_prop(void)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_cfg_id_t id;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar ndmpd_cfg_param_t *cfg;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *value;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar for (id = 0; id < NDMP_MAXALL; id++) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cfg = &ndmpd_cfg_table[id];
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((ndmp_get_prop(cfg->sc_name, &value)) == -1) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar syslog(LOG_DEBUG, "%s %s",
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cfg->sc_name, ndmp_strerror(ndmp_errno));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar continue;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar /*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * enval == 0 could mean two things, either the
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * config param is not defined, or it has been
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * removed. If the variable has already been defined
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * and now enval is 0, it should be removed, otherwise
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * we don't need to do anything in this case.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if ((cfg->sc_flags & NDMP_CF_DEFINED) || value) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (ndmpd_config_update(cfg, value)) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(value);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (-1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(value);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * ndmpd_config_update
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Updates the specified config param with the given value.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * This function is called both on (re)load and set.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarstatic int
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_config_update(ndmpd_cfg_param_t *cfg, char *value)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *curval;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int rc = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar int len;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (value) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar len = strlen(value);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (cfg->sc_value) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar curval = realloc(cfg->sc_value, (len + 1));
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar curval = ndmp_malloc(len + 1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (curval) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cfg->sc_value = curval;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar (void) strcpy(cfg->sc_value, value);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cfg->sc_flags |= NDMP_CF_DEFINED;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar syslog(LOG_ERR, "Out of memory.");
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar rc = -1;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else if (cfg->sc_value) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar free(cfg->sc_value);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cfg->sc_value = 0;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar cfg->sc_flags &= ~NDMP_CF_DEFINED;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (rc);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns value of the specified config param.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * The return value is a string pointer to the locally
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * allocated memory if the config param is defined
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * otherwise it would be NULL.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_get_prop(ndmpd_cfg_id_t id)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *env_val;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (id < NDMP_MAXALL) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar env_val = ndmpd_cfg_table[id].sc_value;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (env_val);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Similar to ndmpd_get_prop except it will return dflt value
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * if env is not set.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarchar *
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_get_prop_default(ndmpd_cfg_id_t id, char *dflt)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *env;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar env = ndmpd_get_prop(id);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (env && *env != 0) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (env);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar } else {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (dflt);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar/*
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns the value of a yes/no config param.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar * Returns 1 is config is set to "yes", otherwise 0.
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar */
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarint
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdarndmpd_get_prop_yorn(ndmpd_cfg_id_t id)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar{
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar char *val;
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar val = ndmpd_get_prop(id);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (val) {
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar if (strcasecmp(val, "yes") == 0)
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (1);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar }
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar return (0);
2654012f83cec5dc15b61dfe3e4a4915f186e7a6Reza Sabdar}