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