17917SReza.Sabdar@Sun.COM /* 28800SReza.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 /* zfs library handle & mutex */ 547917SReza.Sabdar@Sun.COM libzfs_handle_t *zlibh; 557917SReza.Sabdar@Sun.COM mutex_t zlib_mtx; 567917SReza.Sabdar@Sun.COM void *mod_plp; 577917SReza.Sabdar@Sun.COM 587917SReza.Sabdar@Sun.COM static void ndmpd_sig_handler(int sig); 597917SReza.Sabdar@Sun.COM 607917SReza.Sabdar@Sun.COM typedef struct ndmpd { 617917SReza.Sabdar@Sun.COM int s_shutdown_flag; /* Fields for shutdown control */ 627917SReza.Sabdar@Sun.COM int s_sigval; 637917SReza.Sabdar@Sun.COM } ndmpd_t; 647917SReza.Sabdar@Sun.COM 657917SReza.Sabdar@Sun.COM ndmpd_t ndmpd; 667917SReza.Sabdar@Sun.COM 677917SReza.Sabdar@Sun.COM 687917SReza.Sabdar@Sun.COM /* 697917SReza.Sabdar@Sun.COM * Load and initialize the plug-in module 707917SReza.Sabdar@Sun.COM */ 717917SReza.Sabdar@Sun.COM static int 727917SReza.Sabdar@Sun.COM mod_init() 737917SReza.Sabdar@Sun.COM { 747917SReza.Sabdar@Sun.COM char *plname; 757917SReza.Sabdar@Sun.COM ndmp_plugin_t *(*plugin_init)(int); 767917SReza.Sabdar@Sun.COM 777917SReza.Sabdar@Sun.COM ndmp_pl = NULL; 787917SReza.Sabdar@Sun.COM if ((plname = ndmpd_get_prop(NDMP_PLUGIN_PATH)) == NULL) 797917SReza.Sabdar@Sun.COM return (0); 807917SReza.Sabdar@Sun.COM 817917SReza.Sabdar@Sun.COM if ((mod_plp = dlopen(plname, RTLD_LOCAL | RTLD_NOW)) == NULL) { 827917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Error loading the plug-in %s", plname); 837917SReza.Sabdar@Sun.COM return (0); 847917SReza.Sabdar@Sun.COM } 857917SReza.Sabdar@Sun.COM 867917SReza.Sabdar@Sun.COM plugin_init = (ndmp_plugin_t *(*)(int))dlsym(mod_plp, "_ndmp_init"); 877917SReza.Sabdar@Sun.COM if (plugin_init == NULL) { 887917SReza.Sabdar@Sun.COM (void) dlclose(mod_plp); 897917SReza.Sabdar@Sun.COM return (0); 907917SReza.Sabdar@Sun.COM } 917917SReza.Sabdar@Sun.COM if ((ndmp_pl = plugin_init(NDMP_PLUGIN_VERSION)) == NULL) { 927917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Error loading the plug-in %s", plname); 937917SReza.Sabdar@Sun.COM return (-1); 947917SReza.Sabdar@Sun.COM } 957917SReza.Sabdar@Sun.COM return (0); 967917SReza.Sabdar@Sun.COM } 977917SReza.Sabdar@Sun.COM 987917SReza.Sabdar@Sun.COM /* 997917SReza.Sabdar@Sun.COM * Unload 1007917SReza.Sabdar@Sun.COM */ 1017917SReza.Sabdar@Sun.COM static void 1027917SReza.Sabdar@Sun.COM mod_fini() 1037917SReza.Sabdar@Sun.COM { 1047917SReza.Sabdar@Sun.COM if (ndmp_pl == NULL) 1057917SReza.Sabdar@Sun.COM return; 1067917SReza.Sabdar@Sun.COM 1077917SReza.Sabdar@Sun.COM void (*plugin_fini)(ndmp_plugin_t *); 1087917SReza.Sabdar@Sun.COM 1097917SReza.Sabdar@Sun.COM plugin_fini = (void (*)(ndmp_plugin_t *))dlsym(mod_plp, "_ndmp_fini"); 1107917SReza.Sabdar@Sun.COM if (plugin_fini == NULL) { 1117917SReza.Sabdar@Sun.COM (void) dlclose(mod_plp); 1127917SReza.Sabdar@Sun.COM return; 1137917SReza.Sabdar@Sun.COM } 1147917SReza.Sabdar@Sun.COM plugin_fini(ndmp_pl); 1157917SReza.Sabdar@Sun.COM (void) dlclose(mod_plp); 1167917SReza.Sabdar@Sun.COM } 1177917SReza.Sabdar@Sun.COM 1187917SReza.Sabdar@Sun.COM static void 1197917SReza.Sabdar@Sun.COM daemonize_init(char *arg) 1207917SReza.Sabdar@Sun.COM { 1217917SReza.Sabdar@Sun.COM sigset_t set, oset; 1227917SReza.Sabdar@Sun.COM pid_t pid; 1237917SReza.Sabdar@Sun.COM 1247917SReza.Sabdar@Sun.COM /* 1257917SReza.Sabdar@Sun.COM * Set effective sets privileges to 'least' required. If fails, send 1267917SReza.Sabdar@Sun.COM * error messages to log file and proceed. 1277917SReza.Sabdar@Sun.COM */ 1287917SReza.Sabdar@Sun.COM if (priv_set(PRIV_SET, PRIV_EFFECTIVE, 1297917SReza.Sabdar@Sun.COM PRIV_FILE_LINK_ANY, PRIV_PROC_INFO, PRIV_PROC_SESSION, 1307917SReza.Sabdar@Sun.COM PRIV_PROC_FORK, PRIV_PROC_EXEC, 1317917SReza.Sabdar@Sun.COM PRIV_PROC_AUDIT, PRIV_PROC_SETID, PRIV_PROC_OWNER, PRIV_FILE_CHOWN, 1327917SReza.Sabdar@Sun.COM PRIV_FILE_CHOWN_SELF, PRIV_FILE_DAC_READ, PRIV_FILE_DAC_SEARCH, 1337917SReza.Sabdar@Sun.COM PRIV_FILE_DAC_WRITE, PRIV_FILE_OWNER, PRIV_FILE_SETID, 1347917SReza.Sabdar@Sun.COM PRIV_SYS_LINKDIR, PRIV_SYS_DEVICES, PRIV_SYS_MOUNT, PRIV_SYS_CONFIG, 1357917SReza.Sabdar@Sun.COM NULL)) 1367917SReza.Sabdar@Sun.COM syslog(LOG_ERR, 1377917SReza.Sabdar@Sun.COM "Failed to set least required privileges to the service."); 1387917SReza.Sabdar@Sun.COM 1397917SReza.Sabdar@Sun.COM /* 1407917SReza.Sabdar@Sun.COM * Block all signals prior to the fork and leave them blocked in the 1417917SReza.Sabdar@Sun.COM * parent so we don't get in a situation where the parent gets SIGINT 1427917SReza.Sabdar@Sun.COM * and returns non-zero exit status and the child is actually running. 1437917SReza.Sabdar@Sun.COM * In the child, restore the signal mask once we've done our setsid(). 1447917SReza.Sabdar@Sun.COM */ 1457917SReza.Sabdar@Sun.COM (void) sigfillset(&set); 1467917SReza.Sabdar@Sun.COM (void) sigdelset(&set, SIGABRT); 1477917SReza.Sabdar@Sun.COM (void) sigprocmask(SIG_BLOCK, &set, &oset); 1487917SReza.Sabdar@Sun.COM 1497917SReza.Sabdar@Sun.COM if ((pid = fork()) == -1) { 1507917SReza.Sabdar@Sun.COM openlog(arg, LOG_PID | LOG_NDELAY, LOG_DAEMON); 1517917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Failed to start process in background."); 1527917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 1537917SReza.Sabdar@Sun.COM } 1547917SReza.Sabdar@Sun.COM 1557917SReza.Sabdar@Sun.COM /* If we're the parent process, exit. */ 1567917SReza.Sabdar@Sun.COM if (pid != 0) { 1577917SReza.Sabdar@Sun.COM _exit(0); 1587917SReza.Sabdar@Sun.COM } 1597917SReza.Sabdar@Sun.COM (void) setsid(); 1607917SReza.Sabdar@Sun.COM (void) sigprocmask(SIG_SETMASK, &oset, NULL); 1617917SReza.Sabdar@Sun.COM (void) chdir("/"); 1627917SReza.Sabdar@Sun.COM (void) umask(0); 1637917SReza.Sabdar@Sun.COM } 1647917SReza.Sabdar@Sun.COM 1657917SReza.Sabdar@Sun.COM static void 1667917SReza.Sabdar@Sun.COM daemonize_fini(void) 1677917SReza.Sabdar@Sun.COM { 1687917SReza.Sabdar@Sun.COM int fd; 1697917SReza.Sabdar@Sun.COM 1707917SReza.Sabdar@Sun.COM if ((fd = open("/dev/null", O_RDWR)) >= 0) { 1717917SReza.Sabdar@Sun.COM (void) fcntl(fd, F_DUP2FD, STDIN_FILENO); 1727917SReza.Sabdar@Sun.COM (void) fcntl(fd, F_DUP2FD, STDOUT_FILENO); 1737917SReza.Sabdar@Sun.COM (void) fcntl(fd, F_DUP2FD, STDERR_FILENO); 1747917SReza.Sabdar@Sun.COM (void) close(fd); 1757917SReza.Sabdar@Sun.COM } 1767917SReza.Sabdar@Sun.COM } 1777917SReza.Sabdar@Sun.COM 1787917SReza.Sabdar@Sun.COM /* 1797917SReza.Sabdar@Sun.COM * main 1807917SReza.Sabdar@Sun.COM * 1817917SReza.Sabdar@Sun.COM * The main NDMP daemon function 1827917SReza.Sabdar@Sun.COM * 1837917SReza.Sabdar@Sun.COM * Parameters: 1847917SReza.Sabdar@Sun.COM * argc (input) - the argument count 1857917SReza.Sabdar@Sun.COM * argv (input) - command line options 1867917SReza.Sabdar@Sun.COM * 1877917SReza.Sabdar@Sun.COM * Returns: 1887917SReza.Sabdar@Sun.COM * 0 1897917SReza.Sabdar@Sun.COM */ 1907917SReza.Sabdar@Sun.COM int 1917917SReza.Sabdar@Sun.COM main(int argc, char *argv[]) 1927917SReza.Sabdar@Sun.COM { 1937917SReza.Sabdar@Sun.COM char c; 1947917SReza.Sabdar@Sun.COM struct sigaction act; 1957917SReza.Sabdar@Sun.COM sigset_t set; 1967917SReza.Sabdar@Sun.COM void *arg = 0; 1977917SReza.Sabdar@Sun.COM 1987917SReza.Sabdar@Sun.COM openlog(argv[0], LOG_PID | LOG_NDELAY, LOG_DAEMON); 1997917SReza.Sabdar@Sun.COM 2007917SReza.Sabdar@Sun.COM /* 2017917SReza.Sabdar@Sun.COM * Check for existing ndmpd door server (make sure ndmpd is not already 2027917SReza.Sabdar@Sun.COM * running) 2037917SReza.Sabdar@Sun.COM */ 2047917SReza.Sabdar@Sun.COM if (ndmp_door_check()) { 2057917SReza.Sabdar@Sun.COM /* ndmpd is already running, exit. */ 2067917SReza.Sabdar@Sun.COM return (0); 2077917SReza.Sabdar@Sun.COM } 2087917SReza.Sabdar@Sun.COM 2097917SReza.Sabdar@Sun.COM /* load ENVs */ 2107917SReza.Sabdar@Sun.COM if (ndmpd_load_prop()) { 2117917SReza.Sabdar@Sun.COM syslog(LOG_ERR, 2127917SReza.Sabdar@Sun.COM "%s SMF properties initialization failed.", argv[0]); 2137917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 2147917SReza.Sabdar@Sun.COM } 2157917SReza.Sabdar@Sun.COM 2167917SReza.Sabdar@Sun.COM /* Global zone check */ 2177917SReza.Sabdar@Sun.COM if (getzoneid() != GLOBAL_ZONEID) { 2187917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Local zone not supported."); 2197917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_FATAL); 2207917SReza.Sabdar@Sun.COM } 2217917SReza.Sabdar@Sun.COM 2227917SReza.Sabdar@Sun.COM /* Trusted Solaris check */ 2237917SReza.Sabdar@Sun.COM if (is_system_labeled()) { 2247917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Trusted Solaris not supported."); 2257917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_FATAL); 2267917SReza.Sabdar@Sun.COM } 2277917SReza.Sabdar@Sun.COM 2287917SReza.Sabdar@Sun.COM opterr = 0; 2297917SReza.Sabdar@Sun.COM while ((c = getopt(argc, argv, ":d")) != -1) { 2307917SReza.Sabdar@Sun.COM switch (c) { 2317917SReza.Sabdar@Sun.COM case 'd': 2327917SReza.Sabdar@Sun.COM (void) set_debug_level(TRUE); 2337917SReza.Sabdar@Sun.COM break; 2347917SReza.Sabdar@Sun.COM default: 2357917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "%s: Invalid option -%c.", 2367917SReza.Sabdar@Sun.COM argv[0], optopt); 2377917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Usage: %s [-d]", argv[0]); 2387917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 2397917SReza.Sabdar@Sun.COM } 2407917SReza.Sabdar@Sun.COM 2417917SReza.Sabdar@Sun.COM } 2427917SReza.Sabdar@Sun.COM 2437917SReza.Sabdar@Sun.COM closelog(); 2447917SReza.Sabdar@Sun.COM /* 2457917SReza.Sabdar@Sun.COM * close any open file descriptors which are greater 2467917SReza.Sabdar@Sun.COM * than STDERR_FILENO 2477917SReza.Sabdar@Sun.COM */ 2487917SReza.Sabdar@Sun.COM closefrom(STDERR_FILENO + 1); 2497917SReza.Sabdar@Sun.COM 2507917SReza.Sabdar@Sun.COM /* set up signal handler */ 2517917SReza.Sabdar@Sun.COM (void) sigfillset(&set); 2527917SReza.Sabdar@Sun.COM (void) sigdelset(&set, SIGABRT); /* always unblocked for ASSERT() */ 2537917SReza.Sabdar@Sun.COM (void) sigfillset(&act.sa_mask); 2547917SReza.Sabdar@Sun.COM act.sa_handler = ndmpd_sig_handler; 2557917SReza.Sabdar@Sun.COM act.sa_flags = 0; 2567917SReza.Sabdar@Sun.COM 2577917SReza.Sabdar@Sun.COM (void) sigaction(SIGTERM, &act, NULL); 2587917SReza.Sabdar@Sun.COM (void) sigaction(SIGHUP, &act, NULL); 2597917SReza.Sabdar@Sun.COM (void) sigaction(SIGINT, &act, NULL); 2607917SReza.Sabdar@Sun.COM (void) sigaction(SIGUSR1, &act, NULL); 261*9012SReza.Sabdar@Sun.COM (void) sigaction(SIGPIPE, &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); 266*9012SReza.Sabdar@Sun.COM (void) sigdelset(&set, SIGPIPE); 2677917SReza.Sabdar@Sun.COM 2687917SReza.Sabdar@Sun.COM (void) daemonize_init(argv[0]); 2697917SReza.Sabdar@Sun.COM 2707917SReza.Sabdar@Sun.COM openlog(argv[0], LOG_PID | LOG_NDELAY, LOG_DAEMON); 2717917SReza.Sabdar@Sun.COM (void) mutex_init(&log_lock, 0, NULL); 2727917SReza.Sabdar@Sun.COM 2737917SReza.Sabdar@Sun.COM if (mod_init() != 0) { 2747917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Failed to load the plugin module."); 2757917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 2767917SReza.Sabdar@Sun.COM } 2777917SReza.Sabdar@Sun.COM 2787917SReza.Sabdar@Sun.COM /* libzfs init */ 2797917SReza.Sabdar@Sun.COM if ((zlibh = libzfs_init()) == NULL) { 2807917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Failed to initialize ZFS library."); 2817917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 2827917SReza.Sabdar@Sun.COM } 2837917SReza.Sabdar@Sun.COM 2847917SReza.Sabdar@Sun.COM /* initialize and start the door server */ 2857917SReza.Sabdar@Sun.COM if (ndmp_door_init()) { 2867917SReza.Sabdar@Sun.COM syslog(LOG_ERR, "Can not start ndmpd door server."); 2877917SReza.Sabdar@Sun.COM exit(SMF_EXIT_ERR_CONFIG); 2887917SReza.Sabdar@Sun.COM } 2897917SReza.Sabdar@Sun.COM 2907917SReza.Sabdar@Sun.COM (void) tlm_init(); 2917917SReza.Sabdar@Sun.COM 2927917SReza.Sabdar@Sun.COM /* 2937917SReza.Sabdar@Sun.COM * Prior to this point, we are single-threaded. We will be 2947917SReza.Sabdar@Sun.COM * multi-threaded from this point on. 2957917SReza.Sabdar@Sun.COM */ 2967917SReza.Sabdar@Sun.COM (void) pthread_create(NULL, NULL, (funct_t)ndmpd_main, 2977917SReza.Sabdar@Sun.COM (void *)&arg); 2987917SReza.Sabdar@Sun.COM 2997917SReza.Sabdar@Sun.COM while (!ndmpd.s_shutdown_flag) { 3007917SReza.Sabdar@Sun.COM (void) sigsuspend(&set); 3017917SReza.Sabdar@Sun.COM 3027917SReza.Sabdar@Sun.COM switch (ndmpd.s_sigval) { 3037917SReza.Sabdar@Sun.COM case 0: 3047917SReza.Sabdar@Sun.COM break; 3057917SReza.Sabdar@Sun.COM 306*9012SReza.Sabdar@Sun.COM case SIGPIPE: 307*9012SReza.Sabdar@Sun.COM break; 308*9012SReza.Sabdar@Sun.COM 3097917SReza.Sabdar@Sun.COM case SIGHUP: 3107917SReza.Sabdar@Sun.COM /* Refresh SMF properties */ 3117917SReza.Sabdar@Sun.COM if (ndmpd_load_prop()) 3127917SReza.Sabdar@Sun.COM syslog(LOG_ERR, 3137917SReza.Sabdar@Sun.COM "Service properties initialization " 3147917SReza.Sabdar@Sun.COM "failed."); 3157917SReza.Sabdar@Sun.COM break; 3167917SReza.Sabdar@Sun.COM 3177917SReza.Sabdar@Sun.COM default: 3187917SReza.Sabdar@Sun.COM /* 3197917SReza.Sabdar@Sun.COM * Typically SIGINT or SIGTERM. 3207917SReza.Sabdar@Sun.COM */ 3217917SReza.Sabdar@Sun.COM ndmpd.s_shutdown_flag = 1; 3227917SReza.Sabdar@Sun.COM break; 3237917SReza.Sabdar@Sun.COM } 3247917SReza.Sabdar@Sun.COM 3257917SReza.Sabdar@Sun.COM ndmpd.s_sigval = 0; 3267917SReza.Sabdar@Sun.COM } 3277917SReza.Sabdar@Sun.COM 3287917SReza.Sabdar@Sun.COM (void) mutex_destroy(&log_lock); 3297917SReza.Sabdar@Sun.COM libzfs_fini(zlibh); 3307917SReza.Sabdar@Sun.COM mod_fini(); 3317917SReza.Sabdar@Sun.COM ndmp_door_fini(); 3327917SReza.Sabdar@Sun.COM daemonize_fini(); 3337917SReza.Sabdar@Sun.COM return (SMF_EXIT_OK); 3347917SReza.Sabdar@Sun.COM } 3357917SReza.Sabdar@Sun.COM 3367917SReza.Sabdar@Sun.COM static void 3377917SReza.Sabdar@Sun.COM ndmpd_sig_handler(int sig) 3387917SReza.Sabdar@Sun.COM { 3397917SReza.Sabdar@Sun.COM if (ndmpd.s_sigval == 0) 3407917SReza.Sabdar@Sun.COM ndmpd.s_sigval = sig; 3417917SReza.Sabdar@Sun.COM } 3427917SReza.Sabdar@Sun.COM 3437917SReza.Sabdar@Sun.COM /* 3447917SReza.Sabdar@Sun.COM * Enable libumem debugging by default on DEBUG builds. 3457917SReza.Sabdar@Sun.COM */ 3467917SReza.Sabdar@Sun.COM #ifdef DEBUG 3477917SReza.Sabdar@Sun.COM const char * 3487917SReza.Sabdar@Sun.COM _umem_debug_init(void) 3497917SReza.Sabdar@Sun.COM { 3507917SReza.Sabdar@Sun.COM return ("default,verbose"); /* $UMEM_DEBUG setting */ 3517917SReza.Sabdar@Sun.COM } 3527917SReza.Sabdar@Sun.COM 3537917SReza.Sabdar@Sun.COM const char * 3547917SReza.Sabdar@Sun.COM _umem_logging_init(void) 3557917SReza.Sabdar@Sun.COM { 3567917SReza.Sabdar@Sun.COM return ("fail,contents"); /* $UMEM_LOGGING setting */ 3577917SReza.Sabdar@Sun.COM } 3587917SReza.Sabdar@Sun.COM #endif 359