17917SReza.Sabdar@Sun.COM /* 2*8800SReza.Sabdar@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 37917SReza.Sabdar@Sun.COM * Use is subject to license terms. 47917SReza.Sabdar@Sun.COM */ 57917SReza.Sabdar@Sun.COM 67917SReza.Sabdar@Sun.COM /* 77917SReza.Sabdar@Sun.COM * BSD 3 Clause License 87917SReza.Sabdar@Sun.COM * 97917SReza.Sabdar@Sun.COM * Copyright (c) 2007, The Storage Networking Industry Association. 107917SReza.Sabdar@Sun.COM * 117917SReza.Sabdar@Sun.COM * Redistribution and use in source and binary forms, with or without 127917SReza.Sabdar@Sun.COM * modification, are permitted provided that the following conditions 137917SReza.Sabdar@Sun.COM * are met: 147917SReza.Sabdar@Sun.COM * - Redistributions of source code must retain the above copyright 157917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer. 167917SReza.Sabdar@Sun.COM * 177917SReza.Sabdar@Sun.COM * - Redistributions in binary form must reproduce the above copyright 187917SReza.Sabdar@Sun.COM * notice, this list of conditions and the following disclaimer in 197917SReza.Sabdar@Sun.COM * the documentation and/or other materials provided with the 207917SReza.Sabdar@Sun.COM * distribution. 217917SReza.Sabdar@Sun.COM * 227917SReza.Sabdar@Sun.COM * - Neither the name of The Storage Networking Industry Association (SNIA) 237917SReza.Sabdar@Sun.COM * nor the names of its contributors may be used to endorse or promote 247917SReza.Sabdar@Sun.COM * products derived from this software without specific prior written 257917SReza.Sabdar@Sun.COM * permission. 267917SReza.Sabdar@Sun.COM * 277917SReza.Sabdar@Sun.COM * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 287917SReza.Sabdar@Sun.COM * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 297917SReza.Sabdar@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 307917SReza.Sabdar@Sun.COM * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 317917SReza.Sabdar@Sun.COM * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 327917SReza.Sabdar@Sun.COM * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 337917SReza.Sabdar@Sun.COM * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 347917SReza.Sabdar@Sun.COM * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 357917SReza.Sabdar@Sun.COM * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 367917SReza.Sabdar@Sun.COM * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 377917SReza.Sabdar@Sun.COM * POSSIBILITY OF SUCH DAMAGE. 387917SReza.Sabdar@Sun.COM */ 397917SReza.Sabdar@Sun.COM /* Copyright (c) 1996, 1997 PDC, Network Appliance. All Rights Reserved */ 407917SReza.Sabdar@Sun.COM 417917SReza.Sabdar@Sun.COM #include <errno.h> 427917SReza.Sabdar@Sun.COM #include <signal.h> 437917SReza.Sabdar@Sun.COM #include <libgen.h> 447917SReza.Sabdar@Sun.COM #include <libscf.h> 457917SReza.Sabdar@Sun.COM #include <libintl.h> 467917SReza.Sabdar@Sun.COM #include <sys/wait.h> 477917SReza.Sabdar@Sun.COM #include <zone.h> 487917SReza.Sabdar@Sun.COM #include <tsol/label.h> 497917SReza.Sabdar@Sun.COM #include <dlfcn.h> 507917SReza.Sabdar@Sun.COM #include "ndmpd.h" 517917SReza.Sabdar@Sun.COM #include "ndmpd_common.h" 527917SReza.Sabdar@Sun.COM 537917SReza.Sabdar@Sun.COM 547917SReza.Sabdar@Sun.COM /* zfs library handle & mutex */ 557917SReza.Sabdar@Sun.COM libzfs_handle_t *zlibh; 567917SReza.Sabdar@Sun.COM mutex_t zlib_mtx; 577917SReza.Sabdar@Sun.COM void *mod_plp; 587917SReza.Sabdar@Sun.COM 597917SReza.Sabdar@Sun.COM static void ndmpd_sig_handler(int sig); 607917SReza.Sabdar@Sun.COM 617917SReza.Sabdar@Sun.COM typedef struct ndmpd { 627917SReza.Sabdar@Sun.COM int s_shutdown_flag; /* Fields for shutdown control */ 637917SReza.Sabdar@Sun.COM int s_sigval; 647917SReza.Sabdar@Sun.COM } ndmpd_t; 657917SReza.Sabdar@Sun.COM 667917SReza.Sabdar@Sun.COM ndmpd_t ndmpd; 677917SReza.Sabdar@Sun.COM 687917SReza.Sabdar@Sun.COM 697917SReza.Sabdar@Sun.COM /* 707917SReza.Sabdar@Sun.COM * Load and initialize the plug-in module 717917SReza.Sabdar@Sun.COM */ 727917SReza.Sabdar@Sun.COM static int 737917SReza.Sabdar@Sun.COM mod_init() 747917SReza.Sabdar@Sun.COM { 757917SReza.Sabdar@Sun.COM char *plname; 767917SReza.Sabdar@Sun.COM ndmp_plugin_t *(*plugin_init)(int); 777917SReza.Sabdar@Sun.COM 787917SReza.Sabdar@Sun.COM ndmp_pl = NULL; 797917SReza.Sabdar@Sun.COM if ((plname = ndmpd_get_prop(NDMP_PLUGIN_PATH)) == NULL) 807917SReza.Sabdar@Sun.COM return (0); 817917SReza.Sabdar@Sun.COM 827917SReza.Sabdar@Sun.COM if ((mod_plp = dlopen(plname, RTLD_LOCAL | RTLD_NOW)) == NULL) { 837917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Error loading the plug-in %s", plname); 847917SReza.Sabdar@Sun.COM return (0); 857917SReza.Sabdar@Sun.COM } 867917SReza.Sabdar@Sun.COM 877917SReza.Sabdar@Sun.COM plugin_init = (ndmp_plugin_t *(*)(int))dlsym(mod_plp, "_ndmp_init"); 887917SReza.Sabdar@Sun.COM if (plugin_init == NULL) { 897917SReza.Sabdar@Sun.COM (void) dlclose(mod_plp); 907917SReza.Sabdar@Sun.COM return (0); 917917SReza.Sabdar@Sun.COM } 927917SReza.Sabdar@Sun.COM if ((ndmp_pl = plugin_init(NDMP_PLUGIN_VERSION)) == NULL) { 937917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Error loading the plug-in %s", plname); 947917SReza.Sabdar@Sun.COM return (-1); 957917SReza.Sabdar@Sun.COM } 967917SReza.Sabdar@Sun.COM return (0); 977917SReza.Sabdar@Sun.COM } 987917SReza.Sabdar@Sun.COM 997917SReza.Sabdar@Sun.COM /* 1007917SReza.Sabdar@Sun.COM * Unload 1017917SReza.Sabdar@Sun.COM */ 1027917SReza.Sabdar@Sun.COM static void 1037917SReza.Sabdar@Sun.COM mod_fini() 1047917SReza.Sabdar@Sun.COM { 1057917SReza.Sabdar@Sun.COM if (ndmp_pl == NULL) 1067917SReza.Sabdar@Sun.COM return; 1077917SReza.Sabdar@Sun.COM 1087917SReza.Sabdar@Sun.COM void (*plugin_fini)(ndmp_plugin_t *); 1097917SReza.Sabdar@Sun.COM 1107917SReza.Sabdar@Sun.COM plugin_fini = (void (*)(ndmp_plugin_t *))dlsym(mod_plp, "_ndmp_fini"); 1117917SReza.Sabdar@Sun.COM if (plugin_fini == NULL) { 1127917SReza.Sabdar@Sun.COM (void) dlclose(mod_plp); 1137917SReza.Sabdar@Sun.COM return; 1147917SReza.Sabdar@Sun.COM } 1157917SReza.Sabdar@Sun.COM plugin_fini(ndmp_pl); 1167917SReza.Sabdar@Sun.COM (void) dlclose(mod_plp); 1177917SReza.Sabdar@Sun.COM } 1187917SReza.Sabdar@Sun.COM 1197917SReza.Sabdar@Sun.COM static void 1207917SReza.Sabdar@Sun.COM daemonize_init(char *arg) 1217917SReza.Sabdar@Sun.COM { 1227917SReza.Sabdar@Sun.COM sigset_t set, oset; 1237917SReza.Sabdar@Sun.COM pid_t pid; 1247917SReza.Sabdar@Sun.COM 1257917SReza.Sabdar@Sun.COM /* 1267917SReza.Sabdar@Sun.COM * Set effective sets privileges to 'least' required. If fails, send 1277917SReza.Sabdar@Sun.COM * error messages to log file and proceed. 1287917SReza.Sabdar@Sun.COM */ 1297917SReza.Sabdar@Sun.COM if (priv_set(PRIV_SET, PRIV_EFFECTIVE, 1307917SReza.Sabdar@Sun.COM PRIV_FILE_LINK_ANY, PRIV_PROC_INFO, PRIV_PROC_SESSION, 1317917SReza.Sabdar@Sun.COM PRIV_PROC_FORK, PRIV_PROC_EXEC, 1327917SReza.Sabdar@Sun.COM PRIV_PROC_AUDIT, PRIV_PROC_SETID, PRIV_PROC_OWNER, PRIV_FILE_CHOWN, 1337917SReza.Sabdar@Sun.COM PRIV_FILE_CHOWN_SELF, PRIV_FILE_DAC_READ, PRIV_FILE_DAC_SEARCH, 1347917SReza.Sabdar@Sun.COM PRIV_FILE_DAC_WRITE, PRIV_FILE_OWNER, PRIV_FILE_SETID, 1357917SReza.Sabdar@Sun.COM PRIV_SYS_LINKDIR, PRIV_SYS_DEVICES, PRIV_SYS_MOUNT, PRIV_SYS_CONFIG, 1367917SReza.Sabdar@Sun.COM NULL)) 1377917SReza.Sabdar@Sun.COM syslog(LOG_ERR, 1387917SReza.Sabdar@Sun.COM "Failed to set least required privileges to the service."); 1397917SReza.Sabdar@Sun.COM 1407917SReza.Sabdar@Sun.COM /* 1417917SReza.Sabdar@Sun.COM * Block all signals prior to the fork and leave them blocked in the 1427917SReza.Sabdar@Sun.COM * parent so we don't get in a situation where the parent gets SIGINT 1437917SReza.Sabdar@Sun.COM * and returns non-zero exit status and the child is actually running. 1447917SReza.Sabdar@Sun.COM * In the child, restore the signal mask once we've done our setsid(). 1457917SReza.Sabdar@Sun.COM */ 1467917SReza.Sabdar@Sun.COM (void) sigfillset(&set); 1477917SReza.Sabdar@Sun.COM (void) sigdelset(&set, SIGABRT); 1487917SReza.Sabdar@Sun.COM (void) sigprocmask(SIG_BLOCK, &set, &oset); 1497917SReza.Sabdar@Sun.COM 1507917SReza.Sabdar@Sun.COM if ((pid = fork()) == -1) { 1517917SReza.Sabdar@Sun.COM openlog(arg, LOG_PID | LOG_NDELAY, LOG_DAEMON); 1527917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Failed to start process in background."); 1537917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 1547917SReza.Sabdar@Sun.COM } 1557917SReza.Sabdar@Sun.COM 1567917SReza.Sabdar@Sun.COM /* If we're the parent process, exit. */ 1577917SReza.Sabdar@Sun.COM if (pid != 0) { 1587917SReza.Sabdar@Sun.COM _exit(0); 1597917SReza.Sabdar@Sun.COM } 1607917SReza.Sabdar@Sun.COM (void) setsid(); 1617917SReza.Sabdar@Sun.COM (void) sigprocmask(SIG_SETMASK, &oset, NULL); 1627917SReza.Sabdar@Sun.COM (void) chdir("/"); 1637917SReza.Sabdar@Sun.COM (void) umask(0); 1647917SReza.Sabdar@Sun.COM } 1657917SReza.Sabdar@Sun.COM 1667917SReza.Sabdar@Sun.COM static void 1677917SReza.Sabdar@Sun.COM daemonize_fini(void) 1687917SReza.Sabdar@Sun.COM { 1697917SReza.Sabdar@Sun.COM int fd; 1707917SReza.Sabdar@Sun.COM 1717917SReza.Sabdar@Sun.COM if ((fd = open("/dev/null", O_RDWR)) >= 0) { 1727917SReza.Sabdar@Sun.COM (void) fcntl(fd, F_DUP2FD, STDIN_FILENO); 1737917SReza.Sabdar@Sun.COM (void) fcntl(fd, F_DUP2FD, STDOUT_FILENO); 1747917SReza.Sabdar@Sun.COM (void) fcntl(fd, F_DUP2FD, STDERR_FILENO); 1757917SReza.Sabdar@Sun.COM (void) close(fd); 1767917SReza.Sabdar@Sun.COM } 1777917SReza.Sabdar@Sun.COM } 1787917SReza.Sabdar@Sun.COM 1797917SReza.Sabdar@Sun.COM /* 1807917SReza.Sabdar@Sun.COM * main 1817917SReza.Sabdar@Sun.COM * 1827917SReza.Sabdar@Sun.COM * The main NDMP daemon function 1837917SReza.Sabdar@Sun.COM * 1847917SReza.Sabdar@Sun.COM * Parameters: 1857917SReza.Sabdar@Sun.COM * argc (input) - the argument count 1867917SReza.Sabdar@Sun.COM * argv (input) - command line options 1877917SReza.Sabdar@Sun.COM * 1887917SReza.Sabdar@Sun.COM * Returns: 1897917SReza.Sabdar@Sun.COM * 0 1907917SReza.Sabdar@Sun.COM */ 1917917SReza.Sabdar@Sun.COM int 1927917SReza.Sabdar@Sun.COM main(int argc, char *argv[]) 1937917SReza.Sabdar@Sun.COM { 1947917SReza.Sabdar@Sun.COM char c; 1957917SReza.Sabdar@Sun.COM struct sigaction act; 1967917SReza.Sabdar@Sun.COM sigset_t set; 1977917SReza.Sabdar@Sun.COM void *arg = 0; 1987917SReza.Sabdar@Sun.COM 1997917SReza.Sabdar@Sun.COM openlog(argv[0], LOG_PID | LOG_NDELAY, LOG_DAEMON); 2007917SReza.Sabdar@Sun.COM 2017917SReza.Sabdar@Sun.COM /* 2027917SReza.Sabdar@Sun.COM * Check for existing ndmpd door server (make sure ndmpd is not already 2037917SReza.Sabdar@Sun.COM * running) 2047917SReza.Sabdar@Sun.COM */ 2057917SReza.Sabdar@Sun.COM if (ndmp_door_check()) { 2067917SReza.Sabdar@Sun.COM /* ndmpd is already running, exit. */ 2077917SReza.Sabdar@Sun.COM return (0); 2087917SReza.Sabdar@Sun.COM } 2097917SReza.Sabdar@Sun.COM 2107917SReza.Sabdar@Sun.COM /* load ENVs */ 2117917SReza.Sabdar@Sun.COM if (ndmpd_load_prop()) { 2127917SReza.Sabdar@Sun.COM syslog(LOG_ERR, 2137917SReza.Sabdar@Sun.COM "%s SMF properties initialization failed.", argv[0]); 2147917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 2157917SReza.Sabdar@Sun.COM } 2167917SReza.Sabdar@Sun.COM 2177917SReza.Sabdar@Sun.COM /* Global zone check */ 2187917SReza.Sabdar@Sun.COM if (getzoneid() != GLOBAL_ZONEID) { 2197917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Local zone not supported."); 2207917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_FATAL); 2217917SReza.Sabdar@Sun.COM } 2227917SReza.Sabdar@Sun.COM 2237917SReza.Sabdar@Sun.COM /* Trusted Solaris check */ 2247917SReza.Sabdar@Sun.COM if (is_system_labeled()) { 2257917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Trusted Solaris not supported."); 2267917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_FATAL); 2277917SReza.Sabdar@Sun.COM } 2287917SReza.Sabdar@Sun.COM 2297917SReza.Sabdar@Sun.COM opterr = 0; 2307917SReza.Sabdar@Sun.COM while ((c = getopt(argc, argv, ":d")) != -1) { 2317917SReza.Sabdar@Sun.COM switch (c) { 2327917SReza.Sabdar@Sun.COM case 'd': 2337917SReza.Sabdar@Sun.COM (void) set_debug_level(TRUE); 2347917SReza.Sabdar@Sun.COM break; 2357917SReza.Sabdar@Sun.COM default: 2367917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "%s: Invalid option -%c.", 2377917SReza.Sabdar@Sun.COM argv[0], optopt); 2387917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Usage: %s [-d]", argv[0]); 2397917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 2407917SReza.Sabdar@Sun.COM } 2417917SReza.Sabdar@Sun.COM 2427917SReza.Sabdar@Sun.COM } 2437917SReza.Sabdar@Sun.COM 2447917SReza.Sabdar@Sun.COM closelog(); 2457917SReza.Sabdar@Sun.COM /* 2467917SReza.Sabdar@Sun.COM * close any open file descriptors which are greater 2477917SReza.Sabdar@Sun.COM * than STDERR_FILENO 2487917SReza.Sabdar@Sun.COM */ 2497917SReza.Sabdar@Sun.COM closefrom(STDERR_FILENO + 1); 2507917SReza.Sabdar@Sun.COM 2517917SReza.Sabdar@Sun.COM /* set up signal handler */ 2527917SReza.Sabdar@Sun.COM (void) sigfillset(&set); 2537917SReza.Sabdar@Sun.COM (void) sigdelset(&set, SIGABRT); /* always unblocked for ASSERT() */ 2547917SReza.Sabdar@Sun.COM (void) sigfillset(&act.sa_mask); 2557917SReza.Sabdar@Sun.COM act.sa_handler = ndmpd_sig_handler; 2567917SReza.Sabdar@Sun.COM act.sa_flags = 0; 2577917SReza.Sabdar@Sun.COM 2587917SReza.Sabdar@Sun.COM (void) sigaction(SIGTERM, &act, NULL); 2597917SReza.Sabdar@Sun.COM (void) sigaction(SIGHUP, &act, NULL); 2607917SReza.Sabdar@Sun.COM (void) sigaction(SIGINT, &act, NULL); 2617917SReza.Sabdar@Sun.COM (void) sigaction(SIGUSR1, &act, NULL); 2627917SReza.Sabdar@Sun.COM (void) sigdelset(&set, SIGTERM); 2637917SReza.Sabdar@Sun.COM (void) sigdelset(&set, SIGHUP); 2647917SReza.Sabdar@Sun.COM (void) sigdelset(&set, SIGINT); 2657917SReza.Sabdar@Sun.COM (void) sigdelset(&set, SIGUSR1); 2667917SReza.Sabdar@Sun.COM 2677917SReza.Sabdar@Sun.COM (void) daemonize_init(argv[0]); 2687917SReza.Sabdar@Sun.COM 2697917SReza.Sabdar@Sun.COM openlog(argv[0], LOG_PID | LOG_NDELAY, LOG_DAEMON); 2707917SReza.Sabdar@Sun.COM (void) mutex_init(&log_lock, 0, NULL); 2717917SReza.Sabdar@Sun.COM 2727917SReza.Sabdar@Sun.COM if (mod_init() != 0) { 2737917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Failed to load the plugin module."); 2747917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 2757917SReza.Sabdar@Sun.COM } 2767917SReza.Sabdar@Sun.COM 2777917SReza.Sabdar@Sun.COM /* libzfs init */ 2787917SReza.Sabdar@Sun.COM if ((zlibh = libzfs_init()) == NULL) { 2797917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Failed to initialize ZFS library."); 2807917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 2817917SReza.Sabdar@Sun.COM } 2827917SReza.Sabdar@Sun.COM 2837917SReza.Sabdar@Sun.COM /* initialize and start the door server */ 2847917SReza.Sabdar@Sun.COM if (ndmp_door_init()) { 2857917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Can not start ndmpd door server."); 2867917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 2877917SReza.Sabdar@Sun.COM } 2887917SReza.Sabdar@Sun.COM 2897917SReza.Sabdar@Sun.COM (void) tlm_init(); 2907917SReza.Sabdar@Sun.COM 2917917SReza.Sabdar@Sun.COM /* 2927917SReza.Sabdar@Sun.COM * Prior to this point, we are single-threaded. We will be 2937917SReza.Sabdar@Sun.COM * multi-threaded from this point on. 2947917SReza.Sabdar@Sun.COM */ 2957917SReza.Sabdar@Sun.COM (void) pthread_create(NULL, NULL, (funct_t)ndmpd_main, 2967917SReza.Sabdar@Sun.COM (void *)&arg); 2977917SReza.Sabdar@Sun.COM 2987917SReza.Sabdar@Sun.COM while (!ndmpd.s_shutdown_flag) { 2997917SReza.Sabdar@Sun.COM (void) sigsuspend(&set); 3007917SReza.Sabdar@Sun.COM 3017917SReza.Sabdar@Sun.COM switch (ndmpd.s_sigval) { 3027917SReza.Sabdar@Sun.COM case 0: 3037917SReza.Sabdar@Sun.COM break; 3047917SReza.Sabdar@Sun.COM 3057917SReza.Sabdar@Sun.COM case SIGHUP: 3067917SReza.Sabdar@Sun.COM /* Refresh SMF properties */ 3077917SReza.Sabdar@Sun.COM if (ndmpd_load_prop()) 3087917SReza.Sabdar@Sun.COM syslog(LOG_ERR, 3097917SReza.Sabdar@Sun.COM "Service properties initialization " 3107917SReza.Sabdar@Sun.COM "failed."); 3117917SReza.Sabdar@Sun.COM break; 3127917SReza.Sabdar@Sun.COM 3137917SReza.Sabdar@Sun.COM default: 3147917SReza.Sabdar@Sun.COM /* 3157917SReza.Sabdar@Sun.COM * Typically SIGINT or SIGTERM. 3167917SReza.Sabdar@Sun.COM */ 3177917SReza.Sabdar@Sun.COM ndmpd.s_shutdown_flag = 1; 3187917SReza.Sabdar@Sun.COM break; 3197917SReza.Sabdar@Sun.COM } 3207917SReza.Sabdar@Sun.COM 3217917SReza.Sabdar@Sun.COM ndmpd.s_sigval = 0; 3227917SReza.Sabdar@Sun.COM } 3237917SReza.Sabdar@Sun.COM 3247917SReza.Sabdar@Sun.COM (void) mutex_destroy(&log_lock); 3257917SReza.Sabdar@Sun.COM libzfs_fini(zlibh); 3267917SReza.Sabdar@Sun.COM mod_fini(); 3277917SReza.Sabdar@Sun.COM ndmp_door_fini(); 3287917SReza.Sabdar@Sun.COM daemonize_fini(); 3297917SReza.Sabdar@Sun.COM return (SMF_EXIT_OK); 3307917SReza.Sabdar@Sun.COM } 3317917SReza.Sabdar@Sun.COM 3327917SReza.Sabdar@Sun.COM static void 3337917SReza.Sabdar@Sun.COM ndmpd_sig_handler(int sig) 3347917SReza.Sabdar@Sun.COM { 3357917SReza.Sabdar@Sun.COM if (ndmpd.s_sigval == 0) 3367917SReza.Sabdar@Sun.COM ndmpd.s_sigval = sig; 3377917SReza.Sabdar@Sun.COM } 3387917SReza.Sabdar@Sun.COM 3397917SReza.Sabdar@Sun.COM /* 3407917SReza.Sabdar@Sun.COM * Enable libumem debugging by default on DEBUG builds. 3417917SReza.Sabdar@Sun.COM */ 3427917SReza.Sabdar@Sun.COM #ifdef DEBUG 3437917SReza.Sabdar@Sun.COM const char * 3447917SReza.Sabdar@Sun.COM _umem_debug_init(void) 3457917SReza.Sabdar@Sun.COM { 3467917SReza.Sabdar@Sun.COM return ("default,verbose"); /* $UMEM_DEBUG setting */ 3477917SReza.Sabdar@Sun.COM } 3487917SReza.Sabdar@Sun.COM 3497917SReza.Sabdar@Sun.COM const char * 3507917SReza.Sabdar@Sun.COM _umem_logging_init(void) 3517917SReza.Sabdar@Sun.COM { 3527917SReza.Sabdar@Sun.COM return ("fail,contents"); /* $UMEM_LOGGING setting */ 3537917SReza.Sabdar@Sun.COM } 3547917SReza.Sabdar@Sun.COM #endif 355