xref: /onnv-gate/usr/src/cmd/ndmpd/ndmp/ndmpd_prop.c (revision 13051:60ed88a16f55)
17917SReza.Sabdar@Sun.COM /*
212514SJanice.Chang@Sun.COM  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
37917SReza.Sabdar@Sun.COM  */
47917SReza.Sabdar@Sun.COM 
57917SReza.Sabdar@Sun.COM /*
67917SReza.Sabdar@Sun.COM  * BSD 3 Clause License
77917SReza.Sabdar@Sun.COM  *
87917SReza.Sabdar@Sun.COM  * Copyright (c) 2007, The Storage Networking Industry Association.
97917SReza.Sabdar@Sun.COM  *
107917SReza.Sabdar@Sun.COM  * Redistribution and use in source and binary forms, with or without
117917SReza.Sabdar@Sun.COM  * modification, are permitted provided that the following conditions
127917SReza.Sabdar@Sun.COM  * are met:
137917SReza.Sabdar@Sun.COM  * 	- Redistributions of source code must retain the above copyright
147917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer.
157917SReza.Sabdar@Sun.COM  *
167917SReza.Sabdar@Sun.COM  * 	- Redistributions in binary form must reproduce the above copyright
177917SReza.Sabdar@Sun.COM  *	  notice, this list of conditions and the following disclaimer in
187917SReza.Sabdar@Sun.COM  *	  the documentation and/or other materials provided with the
197917SReza.Sabdar@Sun.COM  *	  distribution.
207917SReza.Sabdar@Sun.COM  *
217917SReza.Sabdar@Sun.COM  *	- Neither the name of The Storage Networking Industry Association (SNIA)
227917SReza.Sabdar@Sun.COM  *	  nor the names of its contributors may be used to endorse or promote
237917SReza.Sabdar@Sun.COM  *	  products derived from this software without specific prior written
247917SReza.Sabdar@Sun.COM  *	  permission.
257917SReza.Sabdar@Sun.COM  *
267917SReza.Sabdar@Sun.COM  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
277917SReza.Sabdar@Sun.COM  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
287917SReza.Sabdar@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
297917SReza.Sabdar@Sun.COM  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
307917SReza.Sabdar@Sun.COM  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
317917SReza.Sabdar@Sun.COM  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
327917SReza.Sabdar@Sun.COM  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
337917SReza.Sabdar@Sun.COM  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
347917SReza.Sabdar@Sun.COM  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
357917SReza.Sabdar@Sun.COM  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
367917SReza.Sabdar@Sun.COM  * POSSIBILITY OF SUCH DAMAGE.
377917SReza.Sabdar@Sun.COM  */
387917SReza.Sabdar@Sun.COM 
397917SReza.Sabdar@Sun.COM /*
407917SReza.Sabdar@Sun.COM  * NDMP configuration management
417917SReza.Sabdar@Sun.COM  */
427917SReza.Sabdar@Sun.COM #include <stdio.h>
437917SReza.Sabdar@Sun.COM #include <stdlib.h>
447917SReza.Sabdar@Sun.COM #include <synch.h>
457917SReza.Sabdar@Sun.COM #include <syslog.h>
467917SReza.Sabdar@Sun.COM #include <strings.h>
477917SReza.Sabdar@Sun.COM #include <ndmpd_prop.h>
487917SReza.Sabdar@Sun.COM #include <libndmp.h>
497917SReza.Sabdar@Sun.COM #include "ndmpd.h"
507917SReza.Sabdar@Sun.COM 
517917SReza.Sabdar@Sun.COM typedef struct ndmpd_cfg_param {
527917SReza.Sabdar@Sun.COM 	char		*sc_name;
537917SReza.Sabdar@Sun.COM 	char		*sc_defval;
547917SReza.Sabdar@Sun.COM 	char		*sc_value;
557917SReza.Sabdar@Sun.COM 	uint32_t	sc_flags;
567917SReza.Sabdar@Sun.COM } ndmpd_cfg_param_t;
577917SReza.Sabdar@Sun.COM 
587917SReza.Sabdar@Sun.COM 
597917SReza.Sabdar@Sun.COM static int ndmpd_config_update(ndmpd_cfg_param_t *cfg, char *value);
607917SReza.Sabdar@Sun.COM 
617917SReza.Sabdar@Sun.COM /*
627917SReza.Sabdar@Sun.COM  * IMPORTANT: any changes to the order of this table's entries
637917SReza.Sabdar@Sun.COM  * need to be reflected in the enum ndmpd_cfg_id_t.
647917SReza.Sabdar@Sun.COM  */
657917SReza.Sabdar@Sun.COM ndmpd_cfg_param_t ndmpd_cfg_table[] =
667917SReza.Sabdar@Sun.COM {
677917SReza.Sabdar@Sun.COM 	{"dar-support",			"",	0, NDMP_CF_NOTINIT},
687917SReza.Sabdar@Sun.COM 	{"mover-nic",			"",	0, NDMP_CF_NOTINIT},
697917SReza.Sabdar@Sun.COM 	{"dump-pathnode",		"",	0, NDMP_CF_NOTINIT},
707917SReza.Sabdar@Sun.COM 	{"tar-pathnode",		"",	0, NDMP_CF_NOTINIT},
717917SReza.Sabdar@Sun.COM 	{"fh-inode",			"",	0, NDMP_CF_NOTINIT},
727917SReza.Sabdar@Sun.COM 	{"ignore-ctime",		"",	0, NDMP_CF_NOTINIT},
737917SReza.Sabdar@Sun.COM 	{"include-lmtime",		"",	0, NDMP_CF_NOTINIT},
747917SReza.Sabdar@Sun.COM 	{"token-maxseq",		"",	0, NDMP_CF_NOTINIT},
757917SReza.Sabdar@Sun.COM 	{"version",			"",	0, NDMP_CF_NOTINIT},
767917SReza.Sabdar@Sun.COM 	{"restore-fullpath",		"",	0, NDMP_CF_NOTINIT},
777917SReza.Sabdar@Sun.COM 	{"debug-path",			"",	0, NDMP_CF_NOTINIT},
787917SReza.Sabdar@Sun.COM 	{"plugin-path",			"",	0, NDMP_CF_NOTINIT},
797917SReza.Sabdar@Sun.COM 	{"socket-css",			"",	0, NDMP_CF_NOTINIT},
807917SReza.Sabdar@Sun.COM 	{"socket-crs",			"",	0, NDMP_CF_NOTINIT},
817917SReza.Sabdar@Sun.COM 	{"mover-recordsize",		"",	0, NDMP_CF_NOTINIT},
827917SReza.Sabdar@Sun.COM 	{"restore-wildcard-enable",	"",	0, NDMP_CF_NOTINIT},
837917SReza.Sabdar@Sun.COM 	{"cram-md5-username",		"",	0, NDMP_CF_NOTINIT},
847917SReza.Sabdar@Sun.COM 	{"cram-md5-password",		"",	0, NDMP_CF_NOTINIT},
857917SReza.Sabdar@Sun.COM 	{"cleartext-username",		"",	0, NDMP_CF_NOTINIT},
867917SReza.Sabdar@Sun.COM 	{"cleartext-password",		"",	0, NDMP_CF_NOTINIT},
877917SReza.Sabdar@Sun.COM 	{"tcp-port",			"",	0, NDMP_CF_NOTINIT},
887917SReza.Sabdar@Sun.COM 	{"backup-quarantine",		"",	0, NDMP_CF_NOTINIT},
897917SReza.Sabdar@Sun.COM 	{"restore-quarantine",		"",	0, NDMP_CF_NOTINIT},
907917SReza.Sabdar@Sun.COM 	{"overwrite-quarantine",	"",	0, NDMP_CF_NOTINIT},
9112514SJanice.Chang@Sun.COM 	{"zfs-force-override",		"",	0, NDMP_CF_NOTINIT},
92*13051SJanice.Chang@Sun.COM 	{"drive-type",			"",	0, NDMP_CF_NOTINIT},
937917SReza.Sabdar@Sun.COM };
947917SReza.Sabdar@Sun.COM 
957917SReza.Sabdar@Sun.COM /*
967917SReza.Sabdar@Sun.COM  * Loads all the NDMP configuration parameters and sets up the
977917SReza.Sabdar@Sun.COM  * config table.
987917SReza.Sabdar@Sun.COM  */
997917SReza.Sabdar@Sun.COM int
ndmpd_load_prop(void)1007917SReza.Sabdar@Sun.COM ndmpd_load_prop(void)
1017917SReza.Sabdar@Sun.COM {
1027917SReza.Sabdar@Sun.COM 	ndmpd_cfg_id_t id;
1037917SReza.Sabdar@Sun.COM 	ndmpd_cfg_param_t *cfg;
1047917SReza.Sabdar@Sun.COM 	char *value;
1057917SReza.Sabdar@Sun.COM 
1067917SReza.Sabdar@Sun.COM 	for (id = 0; id < NDMP_MAXALL; id++) {
1077917SReza.Sabdar@Sun.COM 		cfg = &ndmpd_cfg_table[id];
1087917SReza.Sabdar@Sun.COM 		if ((ndmp_get_prop(cfg->sc_name, &value)) == -1) {
1097917SReza.Sabdar@Sun.COM 			syslog(LOG_DEBUG, "%s %s",
1107917SReza.Sabdar@Sun.COM 			    cfg->sc_name, ndmp_strerror(ndmp_errno));
1117917SReza.Sabdar@Sun.COM 			continue;
1127917SReza.Sabdar@Sun.COM 		}
1137917SReza.Sabdar@Sun.COM 		/*
1147917SReza.Sabdar@Sun.COM 		 * enval == 0 could mean two things, either the
1157917SReza.Sabdar@Sun.COM 		 * config param is not defined, or it has been
1167917SReza.Sabdar@Sun.COM 		 * removed. If the variable has already been defined
1177917SReza.Sabdar@Sun.COM 		 * and now enval is 0, it should be removed, otherwise
1187917SReza.Sabdar@Sun.COM 		 * we don't need to do anything in this case.
1197917SReza.Sabdar@Sun.COM 		 */
1207917SReza.Sabdar@Sun.COM 		if ((cfg->sc_flags & NDMP_CF_DEFINED) || value) {
1217917SReza.Sabdar@Sun.COM 			if (ndmpd_config_update(cfg, value)) {
1227917SReza.Sabdar@Sun.COM 				free(value);
1237917SReza.Sabdar@Sun.COM 				return (-1);
1247917SReza.Sabdar@Sun.COM 			}
1257917SReza.Sabdar@Sun.COM 		}
1267917SReza.Sabdar@Sun.COM 		free(value);
1277917SReza.Sabdar@Sun.COM 	}
1287917SReza.Sabdar@Sun.COM 	return (0);
1297917SReza.Sabdar@Sun.COM }
1307917SReza.Sabdar@Sun.COM 
1317917SReza.Sabdar@Sun.COM /*
1327917SReza.Sabdar@Sun.COM  * ndmpd_config_update
1337917SReza.Sabdar@Sun.COM  *
1347917SReza.Sabdar@Sun.COM  * Updates the specified config param with the given value.
1357917SReza.Sabdar@Sun.COM  * This function is called both on (re)load and set.
1367917SReza.Sabdar@Sun.COM  */
1377917SReza.Sabdar@Sun.COM static int
ndmpd_config_update(ndmpd_cfg_param_t * cfg,char * value)1387917SReza.Sabdar@Sun.COM ndmpd_config_update(ndmpd_cfg_param_t *cfg, char *value)
1397917SReza.Sabdar@Sun.COM {
1407917SReza.Sabdar@Sun.COM 	char *curval;
1417917SReza.Sabdar@Sun.COM 	int rc = 0;
1427917SReza.Sabdar@Sun.COM 	int len;
1437917SReza.Sabdar@Sun.COM 
1447917SReza.Sabdar@Sun.COM 	if (value) {
1457917SReza.Sabdar@Sun.COM 		len = strlen(value);
1467917SReza.Sabdar@Sun.COM 		if (cfg->sc_value) {
1477917SReza.Sabdar@Sun.COM 			curval = realloc(cfg->sc_value, (len + 1));
1487917SReza.Sabdar@Sun.COM 		} else {
1497917SReza.Sabdar@Sun.COM 			curval = ndmp_malloc(len + 1);
1507917SReza.Sabdar@Sun.COM 		}
1517917SReza.Sabdar@Sun.COM 
1527917SReza.Sabdar@Sun.COM 		if (curval) {
1537917SReza.Sabdar@Sun.COM 			cfg->sc_value = curval;
1547917SReza.Sabdar@Sun.COM 			(void) strcpy(cfg->sc_value, value);
1557917SReza.Sabdar@Sun.COM 			cfg->sc_flags |= NDMP_CF_DEFINED;
1567917SReza.Sabdar@Sun.COM 		} else {
1577917SReza.Sabdar@Sun.COM 			syslog(LOG_ERR, "Out of memory.");
1587917SReza.Sabdar@Sun.COM 			rc = -1;
1597917SReza.Sabdar@Sun.COM 		}
1607917SReza.Sabdar@Sun.COM 	} else if (cfg->sc_value) {
1617917SReza.Sabdar@Sun.COM 		free(cfg->sc_value);
1627917SReza.Sabdar@Sun.COM 		cfg->sc_value = 0;
1637917SReza.Sabdar@Sun.COM 		cfg->sc_flags &= ~NDMP_CF_DEFINED;
1647917SReza.Sabdar@Sun.COM 	}
1657917SReza.Sabdar@Sun.COM 
1667917SReza.Sabdar@Sun.COM 	return (rc);
1677917SReza.Sabdar@Sun.COM }
1687917SReza.Sabdar@Sun.COM 
1697917SReza.Sabdar@Sun.COM /*
1707917SReza.Sabdar@Sun.COM  * Returns value of the specified config param.
1717917SReza.Sabdar@Sun.COM  * The return value is a string pointer to the locally
1727917SReza.Sabdar@Sun.COM  * allocated memory if the config param is defined
1737917SReza.Sabdar@Sun.COM  * otherwise it would be NULL.
1747917SReza.Sabdar@Sun.COM  */
1757917SReza.Sabdar@Sun.COM char *
ndmpd_get_prop(ndmpd_cfg_id_t id)1767917SReza.Sabdar@Sun.COM ndmpd_get_prop(ndmpd_cfg_id_t id)
1777917SReza.Sabdar@Sun.COM {
1787917SReza.Sabdar@Sun.COM 	char *env_val;
1797917SReza.Sabdar@Sun.COM 
1807917SReza.Sabdar@Sun.COM 	if (id < NDMP_MAXALL) {
1817917SReza.Sabdar@Sun.COM 		env_val = ndmpd_cfg_table[id].sc_value;
1827917SReza.Sabdar@Sun.COM 		return (env_val);
1837917SReza.Sabdar@Sun.COM 	}
1847917SReza.Sabdar@Sun.COM 
1857917SReza.Sabdar@Sun.COM 	return (0);
1867917SReza.Sabdar@Sun.COM }
1877917SReza.Sabdar@Sun.COM 
1887917SReza.Sabdar@Sun.COM /*
1897917SReza.Sabdar@Sun.COM  * Similar to ndmpd_get_prop except it will return dflt value
1907917SReza.Sabdar@Sun.COM  * if env is not set.
1917917SReza.Sabdar@Sun.COM  */
1927917SReza.Sabdar@Sun.COM char *
ndmpd_get_prop_default(ndmpd_cfg_id_t id,char * dflt)1937917SReza.Sabdar@Sun.COM ndmpd_get_prop_default(ndmpd_cfg_id_t id, char *dflt)
1947917SReza.Sabdar@Sun.COM {
1957917SReza.Sabdar@Sun.COM 	char *env;
1967917SReza.Sabdar@Sun.COM 
1977917SReza.Sabdar@Sun.COM 	env = ndmpd_get_prop(id);
1987917SReza.Sabdar@Sun.COM 
1997917SReza.Sabdar@Sun.COM 	if (env && *env != 0) {
2007917SReza.Sabdar@Sun.COM 		return (env);
2017917SReza.Sabdar@Sun.COM 	} else {
2027917SReza.Sabdar@Sun.COM 		return (dflt);
2037917SReza.Sabdar@Sun.COM 	}
2047917SReza.Sabdar@Sun.COM }
2057917SReza.Sabdar@Sun.COM 
2067917SReza.Sabdar@Sun.COM /*
2077917SReza.Sabdar@Sun.COM  * Returns the value of a yes/no config param.
2087917SReza.Sabdar@Sun.COM  * Returns 1 is config is set to "yes", otherwise 0.
2097917SReza.Sabdar@Sun.COM  */
2107917SReza.Sabdar@Sun.COM int
ndmpd_get_prop_yorn(ndmpd_cfg_id_t id)2117917SReza.Sabdar@Sun.COM ndmpd_get_prop_yorn(ndmpd_cfg_id_t id)
2127917SReza.Sabdar@Sun.COM {
2137917SReza.Sabdar@Sun.COM 	char *val;
2147917SReza.Sabdar@Sun.COM 
2157917SReza.Sabdar@Sun.COM 	val = ndmpd_get_prop(id);
2167917SReza.Sabdar@Sun.COM 	if (val) {
2177917SReza.Sabdar@Sun.COM 		if (strcasecmp(val, "yes") == 0)
2187917SReza.Sabdar@Sun.COM 			return (1);
2197917SReza.Sabdar@Sun.COM 	}
2207917SReza.Sabdar@Sun.COM 
2217917SReza.Sabdar@Sun.COM 	return (0);
2227917SReza.Sabdar@Sun.COM }
223