xref: /onnv-gate/usr/src/cmd/ndmpd/ndmp/ndmpd_main.c (revision 8800:dbcc21c0ec0f)
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