17917SReza.Sabdar@Sun.COM /* 2*12514SJanice.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}, 91*12514SJanice.Chang@Sun.COM {"zfs-force-override", "", 0, NDMP_CF_NOTINIT}, 927917SReza.Sabdar@Sun.COM }; 937917SReza.Sabdar@Sun.COM 947917SReza.Sabdar@Sun.COM /* 957917SReza.Sabdar@Sun.COM * Loads all the NDMP configuration parameters and sets up the 967917SReza.Sabdar@Sun.COM * config table. 977917SReza.Sabdar@Sun.COM */ 987917SReza.Sabdar@Sun.COM int 997917SReza.Sabdar@Sun.COM ndmpd_load_prop(void) 1007917SReza.Sabdar@Sun.COM { 1017917SReza.Sabdar@Sun.COM ndmpd_cfg_id_t id; 1027917SReza.Sabdar@Sun.COM ndmpd_cfg_param_t *cfg; 1037917SReza.Sabdar@Sun.COM char *value; 1047917SReza.Sabdar@Sun.COM 1057917SReza.Sabdar@Sun.COM for (id = 0; id < NDMP_MAXALL; id++) { 1067917SReza.Sabdar@Sun.COM cfg = &ndmpd_cfg_table[id]; 1077917SReza.Sabdar@Sun.COM if ((ndmp_get_prop(cfg->sc_name, &value)) == -1) { 1087917SReza.Sabdar@Sun.COM syslog(LOG_DEBUG, "%s %s", 1097917SReza.Sabdar@Sun.COM cfg->sc_name, ndmp_strerror(ndmp_errno)); 1107917SReza.Sabdar@Sun.COM continue; 1117917SReza.Sabdar@Sun.COM } 1127917SReza.Sabdar@Sun.COM /* 1137917SReza.Sabdar@Sun.COM * enval == 0 could mean two things, either the 1147917SReza.Sabdar@Sun.COM * config param is not defined, or it has been 1157917SReza.Sabdar@Sun.COM * removed. If the variable has already been defined 1167917SReza.Sabdar@Sun.COM * and now enval is 0, it should be removed, otherwise 1177917SReza.Sabdar@Sun.COM * we don't need to do anything in this case. 1187917SReza.Sabdar@Sun.COM */ 1197917SReza.Sabdar@Sun.COM if ((cfg->sc_flags & NDMP_CF_DEFINED) || value) { 1207917SReza.Sabdar@Sun.COM if (ndmpd_config_update(cfg, value)) { 1217917SReza.Sabdar@Sun.COM free(value); 1227917SReza.Sabdar@Sun.COM return (-1); 1237917SReza.Sabdar@Sun.COM } 1247917SReza.Sabdar@Sun.COM } 1257917SReza.Sabdar@Sun.COM free(value); 1267917SReza.Sabdar@Sun.COM } 1277917SReza.Sabdar@Sun.COM return (0); 1287917SReza.Sabdar@Sun.COM } 1297917SReza.Sabdar@Sun.COM 1307917SReza.Sabdar@Sun.COM /* 1317917SReza.Sabdar@Sun.COM * ndmpd_config_update 1327917SReza.Sabdar@Sun.COM * 1337917SReza.Sabdar@Sun.COM * Updates the specified config param with the given value. 1347917SReza.Sabdar@Sun.COM * This function is called both on (re)load and set. 1357917SReza.Sabdar@Sun.COM */ 1367917SReza.Sabdar@Sun.COM static int 1377917SReza.Sabdar@Sun.COM ndmpd_config_update(ndmpd_cfg_param_t *cfg, char *value) 1387917SReza.Sabdar@Sun.COM { 1397917SReza.Sabdar@Sun.COM char *curval; 1407917SReza.Sabdar@Sun.COM int rc = 0; 1417917SReza.Sabdar@Sun.COM int len; 1427917SReza.Sabdar@Sun.COM 1437917SReza.Sabdar@Sun.COM if (value) { 1447917SReza.Sabdar@Sun.COM len = strlen(value); 1457917SReza.Sabdar@Sun.COM if (cfg->sc_value) { 1467917SReza.Sabdar@Sun.COM curval = realloc(cfg->sc_value, (len + 1)); 1477917SReza.Sabdar@Sun.COM } else { 1487917SReza.Sabdar@Sun.COM curval = ndmp_malloc(len + 1); 1497917SReza.Sabdar@Sun.COM } 1507917SReza.Sabdar@Sun.COM 1517917SReza.Sabdar@Sun.COM if (curval) { 1527917SReza.Sabdar@Sun.COM cfg->sc_value = curval; 1537917SReza.Sabdar@Sun.COM (void) strcpy(cfg->sc_value, value); 1547917SReza.Sabdar@Sun.COM cfg->sc_flags |= NDMP_CF_DEFINED; 1557917SReza.Sabdar@Sun.COM } else { 1567917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Out of memory."); 1577917SReza.Sabdar@Sun.COM rc = -1; 1587917SReza.Sabdar@Sun.COM } 1597917SReza.Sabdar@Sun.COM } else if (cfg->sc_value) { 1607917SReza.Sabdar@Sun.COM free(cfg->sc_value); 1617917SReza.Sabdar@Sun.COM cfg->sc_value = 0; 1627917SReza.Sabdar@Sun.COM cfg->sc_flags &= ~NDMP_CF_DEFINED; 1637917SReza.Sabdar@Sun.COM } 1647917SReza.Sabdar@Sun.COM 1657917SReza.Sabdar@Sun.COM return (rc); 1667917SReza.Sabdar@Sun.COM } 1677917SReza.Sabdar@Sun.COM 1687917SReza.Sabdar@Sun.COM /* 1697917SReza.Sabdar@Sun.COM * Returns value of the specified config param. 1707917SReza.Sabdar@Sun.COM * The return value is a string pointer to the locally 1717917SReza.Sabdar@Sun.COM * allocated memory if the config param is defined 1727917SReza.Sabdar@Sun.COM * otherwise it would be NULL. 1737917SReza.Sabdar@Sun.COM */ 1747917SReza.Sabdar@Sun.COM char * 1757917SReza.Sabdar@Sun.COM ndmpd_get_prop(ndmpd_cfg_id_t id) 1767917SReza.Sabdar@Sun.COM { 1777917SReza.Sabdar@Sun.COM char *env_val; 1787917SReza.Sabdar@Sun.COM 1797917SReza.Sabdar@Sun.COM if (id < NDMP_MAXALL) { 1807917SReza.Sabdar@Sun.COM env_val = ndmpd_cfg_table[id].sc_value; 1817917SReza.Sabdar@Sun.COM return (env_val); 1827917SReza.Sabdar@Sun.COM } 1837917SReza.Sabdar@Sun.COM 1847917SReza.Sabdar@Sun.COM return (0); 1857917SReza.Sabdar@Sun.COM } 1867917SReza.Sabdar@Sun.COM 1877917SReza.Sabdar@Sun.COM /* 1887917SReza.Sabdar@Sun.COM * Similar to ndmpd_get_prop except it will return dflt value 1897917SReza.Sabdar@Sun.COM * if env is not set. 1907917SReza.Sabdar@Sun.COM */ 1917917SReza.Sabdar@Sun.COM char * 1927917SReza.Sabdar@Sun.COM ndmpd_get_prop_default(ndmpd_cfg_id_t id, char *dflt) 1937917SReza.Sabdar@Sun.COM { 1947917SReza.Sabdar@Sun.COM char *env; 1957917SReza.Sabdar@Sun.COM 1967917SReza.Sabdar@Sun.COM env = ndmpd_get_prop(id); 1977917SReza.Sabdar@Sun.COM 1987917SReza.Sabdar@Sun.COM if (env && *env != 0) { 1997917SReza.Sabdar@Sun.COM return (env); 2007917SReza.Sabdar@Sun.COM } else { 2017917SReza.Sabdar@Sun.COM return (dflt); 2027917SReza.Sabdar@Sun.COM } 2037917SReza.Sabdar@Sun.COM } 2047917SReza.Sabdar@Sun.COM 2057917SReza.Sabdar@Sun.COM /* 2067917SReza.Sabdar@Sun.COM * Returns the value of a yes/no config param. 2077917SReza.Sabdar@Sun.COM * Returns 1 is config is set to "yes", otherwise 0. 2087917SReza.Sabdar@Sun.COM */ 2097917SReza.Sabdar@Sun.COM int 2107917SReza.Sabdar@Sun.COM ndmpd_get_prop_yorn(ndmpd_cfg_id_t id) 2117917SReza.Sabdar@Sun.COM { 2127917SReza.Sabdar@Sun.COM char *val; 2137917SReza.Sabdar@Sun.COM 2147917SReza.Sabdar@Sun.COM val = ndmpd_get_prop(id); 2157917SReza.Sabdar@Sun.COM if (val) { 2167917SReza.Sabdar@Sun.COM if (strcasecmp(val, "yes") == 0) 2177917SReza.Sabdar@Sun.COM return (1); 2187917SReza.Sabdar@Sun.COM } 2197917SReza.Sabdar@Sun.COM 2207917SReza.Sabdar@Sun.COM return (0); 2217917SReza.Sabdar@Sun.COM } 222