xref: /illumos-gate/usr/src/cmd/ndmpd/ndmp/ndmpd_prop.c (revision faac71c0)
12654012fSReza Sabdar /*
2d0194491SJanice Chang  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
3*faac71c0SJan Kryl  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
42654012fSReza Sabdar  */
52654012fSReza Sabdar 
62654012fSReza Sabdar /*
72654012fSReza Sabdar  * BSD 3 Clause License
82654012fSReza Sabdar  *
92654012fSReza Sabdar  * Copyright (c) 2007, The Storage Networking Industry Association.
102654012fSReza Sabdar  *
112654012fSReza Sabdar  * Redistribution and use in source and binary forms, with or without
122654012fSReza Sabdar  * modification, are permitted provided that the following conditions
132654012fSReza Sabdar  * are met:
142654012fSReza Sabdar  * 	- Redistributions of source code must retain the above copyright
152654012fSReza Sabdar  *	  notice, this list of conditions and the following disclaimer.
162654012fSReza Sabdar  *
172654012fSReza Sabdar  * 	- Redistributions in binary form must reproduce the above copyright
182654012fSReza Sabdar  *	  notice, this list of conditions and the following disclaimer in
192654012fSReza Sabdar  *	  the documentation and/or other materials provided with the
202654012fSReza Sabdar  *	  distribution.
212654012fSReza Sabdar  *
222654012fSReza Sabdar  *	- Neither the name of The Storage Networking Industry Association (SNIA)
232654012fSReza Sabdar  *	  nor the names of its contributors may be used to endorse or promote
242654012fSReza Sabdar  *	  products derived from this software without specific prior written
252654012fSReza Sabdar  *	  permission.
262654012fSReza Sabdar  *
272654012fSReza Sabdar  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
282654012fSReza Sabdar  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
292654012fSReza Sabdar  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
302654012fSReza Sabdar  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
312654012fSReza Sabdar  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
322654012fSReza Sabdar  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
332654012fSReza Sabdar  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
342654012fSReza Sabdar  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
352654012fSReza Sabdar  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
362654012fSReza Sabdar  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
372654012fSReza Sabdar  * POSSIBILITY OF SUCH DAMAGE.
382654012fSReza Sabdar  */
392654012fSReza Sabdar 
402654012fSReza Sabdar /*
412654012fSReza Sabdar  * NDMP configuration management
422654012fSReza Sabdar  */
432654012fSReza Sabdar #include <stdio.h>
442654012fSReza Sabdar #include <stdlib.h>
452654012fSReza Sabdar #include <synch.h>
462654012fSReza Sabdar #include <syslog.h>
472654012fSReza Sabdar #include <strings.h>
482654012fSReza Sabdar #include <ndmpd_prop.h>
492654012fSReza Sabdar #include <libndmp.h>
502654012fSReza Sabdar #include "ndmpd.h"
512654012fSReza Sabdar 
522654012fSReza Sabdar typedef struct ndmpd_cfg_param {
532654012fSReza Sabdar 	char		*sc_name;
542654012fSReza Sabdar 	char		*sc_defval;
552654012fSReza Sabdar 	char		*sc_value;
562654012fSReza Sabdar 	uint32_t	sc_flags;
572654012fSReza Sabdar } ndmpd_cfg_param_t;
582654012fSReza Sabdar 
592654012fSReza Sabdar 
602654012fSReza Sabdar static int ndmpd_config_update(ndmpd_cfg_param_t *cfg, char *value);
612654012fSReza Sabdar 
622654012fSReza Sabdar /*
632654012fSReza Sabdar  * IMPORTANT: any changes to the order of this table's entries
642654012fSReza Sabdar  * need to be reflected in the enum ndmpd_cfg_id_t.
652654012fSReza Sabdar  */
662654012fSReza Sabdar ndmpd_cfg_param_t ndmpd_cfg_table[] =
672654012fSReza Sabdar {
682654012fSReza Sabdar 	{"dar-support",			"",	0, NDMP_CF_NOTINIT},
692654012fSReza Sabdar 	{"mover-nic",			"",	0, NDMP_CF_NOTINIT},
702654012fSReza Sabdar 	{"dump-pathnode",		"",	0, NDMP_CF_NOTINIT},
712654012fSReza Sabdar 	{"tar-pathnode",		"",	0, NDMP_CF_NOTINIT},
722654012fSReza Sabdar 	{"fh-inode",			"",	0, NDMP_CF_NOTINIT},
732654012fSReza Sabdar 	{"ignore-ctime",		"",	0, NDMP_CF_NOTINIT},
742654012fSReza Sabdar 	{"include-lmtime",		"",	0, NDMP_CF_NOTINIT},
752654012fSReza Sabdar 	{"token-maxseq",		"",	0, NDMP_CF_NOTINIT},
762654012fSReza Sabdar 	{"version",			"",	0, NDMP_CF_NOTINIT},
772654012fSReza Sabdar 	{"restore-fullpath",		"",	0, NDMP_CF_NOTINIT},
782654012fSReza Sabdar 	{"debug-path",			"",	0, NDMP_CF_NOTINIT},
792654012fSReza Sabdar 	{"plugin-path",			"",	0, NDMP_CF_NOTINIT},
802654012fSReza Sabdar 	{"socket-css",			"",	0, NDMP_CF_NOTINIT},
812654012fSReza Sabdar 	{"socket-crs",			"",	0, NDMP_CF_NOTINIT},
822654012fSReza Sabdar 	{"mover-recordsize",		"",	0, NDMP_CF_NOTINIT},
832654012fSReza Sabdar 	{"restore-wildcard-enable",	"",	0, NDMP_CF_NOTINIT},
842654012fSReza Sabdar 	{"cram-md5-username",		"",	0, NDMP_CF_NOTINIT},
852654012fSReza Sabdar 	{"cram-md5-password",		"",	0, NDMP_CF_NOTINIT},
862654012fSReza Sabdar 	{"cleartext-username",		"",	0, NDMP_CF_NOTINIT},
872654012fSReza Sabdar 	{"cleartext-password",		"",	0, NDMP_CF_NOTINIT},
882654012fSReza Sabdar 	{"tcp-port",			"",	0, NDMP_CF_NOTINIT},
892654012fSReza Sabdar 	{"backup-quarantine",		"",	0, NDMP_CF_NOTINIT},
902654012fSReza Sabdar 	{"restore-quarantine",		"",	0, NDMP_CF_NOTINIT},
912654012fSReza Sabdar 	{"overwrite-quarantine",	"",	0, NDMP_CF_NOTINIT},
92d0194491SJanice Chang 	{"zfs-force-override",		"",	0, NDMP_CF_NOTINIT},
931e05b03fSJanice Chang 	{"drive-type",			"",	0, NDMP_CF_NOTINIT},
94*faac71c0SJan Kryl 	{"debug-mode",			"",	0, NDMP_CF_NOTINIT},
952654012fSReza Sabdar };
962654012fSReza Sabdar 
972654012fSReza Sabdar /*
982654012fSReza Sabdar  * Loads all the NDMP configuration parameters and sets up the
992654012fSReza Sabdar  * config table.
1002654012fSReza Sabdar  */
1012654012fSReza Sabdar int
ndmpd_load_prop(void)1022654012fSReza Sabdar ndmpd_load_prop(void)
1032654012fSReza Sabdar {
1042654012fSReza Sabdar 	ndmpd_cfg_id_t id;
1052654012fSReza Sabdar 	ndmpd_cfg_param_t *cfg;
1062654012fSReza Sabdar 	char *value;
1072654012fSReza Sabdar 
1082654012fSReza Sabdar 	for (id = 0; id < NDMP_MAXALL; id++) {
1092654012fSReza Sabdar 		cfg = &ndmpd_cfg_table[id];
1102654012fSReza Sabdar 		if ((ndmp_get_prop(cfg->sc_name, &value)) == -1) {
1112654012fSReza Sabdar 			syslog(LOG_DEBUG, "%s %s",
1122654012fSReza Sabdar 			    cfg->sc_name, ndmp_strerror(ndmp_errno));
1132654012fSReza Sabdar 			continue;
1142654012fSReza Sabdar 		}
1152654012fSReza Sabdar 		/*
1162654012fSReza Sabdar 		 * enval == 0 could mean two things, either the
1172654012fSReza Sabdar 		 * config param is not defined, or it has been
1182654012fSReza Sabdar 		 * removed. If the variable has already been defined
1192654012fSReza Sabdar 		 * and now enval is 0, it should be removed, otherwise
1202654012fSReza Sabdar 		 * we don't need to do anything in this case.
1212654012fSReza Sabdar 		 */
1222654012fSReza Sabdar 		if ((cfg->sc_flags & NDMP_CF_DEFINED) || value) {
1232654012fSReza Sabdar 			if (ndmpd_config_update(cfg, value)) {
1242654012fSReza Sabdar 				free(value);
1252654012fSReza Sabdar 				return (-1);
1262654012fSReza Sabdar 			}
1272654012fSReza Sabdar 		}
1282654012fSReza Sabdar 		free(value);
1292654012fSReza Sabdar 	}
1302654012fSReza Sabdar 	return (0);
1312654012fSReza Sabdar }
1322654012fSReza Sabdar 
1332654012fSReza Sabdar /*
1342654012fSReza Sabdar  * ndmpd_config_update
1352654012fSReza Sabdar  *
1362654012fSReza Sabdar  * Updates the specified config param with the given value.
1372654012fSReza Sabdar  * This function is called both on (re)load and set.
1382654012fSReza Sabdar  */
1392654012fSReza Sabdar static int
ndmpd_config_update(ndmpd_cfg_param_t * cfg,char * value)1402654012fSReza Sabdar ndmpd_config_update(ndmpd_cfg_param_t *cfg, char *value)
1412654012fSReza Sabdar {
1422654012fSReza Sabdar 	char *curval;
1432654012fSReza Sabdar 	int rc = 0;
1442654012fSReza Sabdar 	int len;
1452654012fSReza Sabdar 
1462654012fSReza Sabdar 	if (value) {
1472654012fSReza Sabdar 		len = strlen(value);
1482654012fSReza Sabdar 		if (cfg->sc_value) {
1492654012fSReza Sabdar 			curval = realloc(cfg->sc_value, (len + 1));
1502654012fSReza Sabdar 		} else {
1512654012fSReza Sabdar 			curval = ndmp_malloc(len + 1);
1522654012fSReza Sabdar 		}
1532654012fSReza Sabdar 
1542654012fSReza Sabdar 		if (curval) {
1552654012fSReza Sabdar 			cfg->sc_value = curval;
1562654012fSReza Sabdar 			(void) strcpy(cfg->sc_value, value);
1572654012fSReza Sabdar 			cfg->sc_flags |= NDMP_CF_DEFINED;
1582654012fSReza Sabdar 		} else {
1592654012fSReza Sabdar 			syslog(LOG_ERR, "Out of memory.");
1602654012fSReza Sabdar 			rc = -1;
1612654012fSReza Sabdar 		}
1622654012fSReza Sabdar 	} else if (cfg->sc_value) {
1632654012fSReza Sabdar 		free(cfg->sc_value);
1642654012fSReza Sabdar 		cfg->sc_value = 0;
1652654012fSReza Sabdar 		cfg->sc_flags &= ~NDMP_CF_DEFINED;
1662654012fSReza Sabdar 	}
1672654012fSReza Sabdar 
1682654012fSReza Sabdar 	return (rc);
1692654012fSReza Sabdar }
1702654012fSReza Sabdar 
1712654012fSReza Sabdar /*
1722654012fSReza Sabdar  * Returns value of the specified config param.
1732654012fSReza Sabdar  * The return value is a string pointer to the locally
1742654012fSReza Sabdar  * allocated memory if the config param is defined
1752654012fSReza Sabdar  * otherwise it would be NULL.
1762654012fSReza Sabdar  */
1772654012fSReza Sabdar char *
ndmpd_get_prop(ndmpd_cfg_id_t id)1782654012fSReza Sabdar ndmpd_get_prop(ndmpd_cfg_id_t id)
1792654012fSReza Sabdar {
1802654012fSReza Sabdar 	char *env_val;
1812654012fSReza Sabdar 
1822654012fSReza Sabdar 	if (id < NDMP_MAXALL) {
1832654012fSReza Sabdar 		env_val = ndmpd_cfg_table[id].sc_value;
1842654012fSReza Sabdar 		return (env_val);
1852654012fSReza Sabdar 	}
1862654012fSReza Sabdar 
1872654012fSReza Sabdar 	return (0);
1882654012fSReza Sabdar }
1892654012fSReza Sabdar 
1902654012fSReza Sabdar /*
1912654012fSReza Sabdar  * Similar to ndmpd_get_prop except it will return dflt value
1922654012fSReza Sabdar  * if env is not set.
1932654012fSReza Sabdar  */
1942654012fSReza Sabdar char *
ndmpd_get_prop_default(ndmpd_cfg_id_t id,char * dflt)1952654012fSReza Sabdar ndmpd_get_prop_default(ndmpd_cfg_id_t id, char *dflt)
1962654012fSReza Sabdar {
1972654012fSReza Sabdar 	char *env;
1982654012fSReza Sabdar 
1992654012fSReza Sabdar 	env = ndmpd_get_prop(id);
2002654012fSReza Sabdar 
2012654012fSReza Sabdar 	if (env && *env != 0) {
2022654012fSReza Sabdar 		return (env);
2032654012fSReza Sabdar 	} else {
2042654012fSReza Sabdar 		return (dflt);
2052654012fSReza Sabdar 	}
2062654012fSReza Sabdar }
2072654012fSReza Sabdar 
2082654012fSReza Sabdar /*
2092654012fSReza Sabdar  * Returns the value of a yes/no config param.
2102654012fSReza Sabdar  * Returns 1 is config is set to "yes", otherwise 0.
2112654012fSReza Sabdar  */
2122654012fSReza Sabdar int
ndmpd_get_prop_yorn(ndmpd_cfg_id_t id)2132654012fSReza Sabdar ndmpd_get_prop_yorn(ndmpd_cfg_id_t id)
2142654012fSReza Sabdar {
2152654012fSReza Sabdar 	char *val;
2162654012fSReza Sabdar 
2172654012fSReza Sabdar 	val = ndmpd_get_prop(id);
2182654012fSReza Sabdar 	if (val) {
2192654012fSReza Sabdar 		if (strcasecmp(val, "yes") == 0)
2202654012fSReza Sabdar 			return (1);
2212654012fSReza Sabdar 	}
2222654012fSReza Sabdar 
2232654012fSReza Sabdar 	return (0);
2242654012fSReza Sabdar }
225