xref: /onnv-gate/usr/src/cmd/ndmpadm/ndmpadm_main.c (revision 13051:60ed88a16f55)
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 #include <assert.h>
397917SReza.Sabdar@Sun.COM #include <ctype.h>
407917SReza.Sabdar@Sun.COM #include <libgen.h>
417917SReza.Sabdar@Sun.COM #include <libintl.h>
427917SReza.Sabdar@Sun.COM #include <locale.h>
437917SReza.Sabdar@Sun.COM #include <stddef.h>
447917SReza.Sabdar@Sun.COM #include <stdio.h>
457917SReza.Sabdar@Sun.COM #include <stdlib.h>
467917SReza.Sabdar@Sun.COM #include <strings.h>
477917SReza.Sabdar@Sun.COM #include <unistd.h>
487917SReza.Sabdar@Sun.COM #include <fcntl.h>
497917SReza.Sabdar@Sun.COM #include <sys/stat.h>
507917SReza.Sabdar@Sun.COM #include <door.h>
517917SReza.Sabdar@Sun.COM #include <sys/mman.h>
527917SReza.Sabdar@Sun.COM #include <libndmp.h>
537917SReza.Sabdar@Sun.COM #include "ndmpadm.h"
547917SReza.Sabdar@Sun.COM 
557917SReza.Sabdar@Sun.COM typedef enum {
567917SReza.Sabdar@Sun.COM 	HELP_GET_CONFIG,
577917SReza.Sabdar@Sun.COM 	HELP_SET_CONFIG,
587917SReza.Sabdar@Sun.COM 	HELP_SHOW_DEVICES,
597917SReza.Sabdar@Sun.COM 	HELP_SHOW_SESSIONS,
607917SReza.Sabdar@Sun.COM 	HELP_KILL_SESSIONS,
617917SReza.Sabdar@Sun.COM 	HELP_ENABLE_AUTH,
627917SReza.Sabdar@Sun.COM 	HELP_DISABLE_AUTH
637917SReza.Sabdar@Sun.COM } ndmp_help_t;
647917SReza.Sabdar@Sun.COM 
657917SReza.Sabdar@Sun.COM typedef struct ndmp_command {
667917SReza.Sabdar@Sun.COM 	const char	*nc_name;
677917SReza.Sabdar@Sun.COM 	int		(*func)(int argc, char **argv,
687917SReza.Sabdar@Sun.COM 			    struct ndmp_command *cur_cmd);
697917SReza.Sabdar@Sun.COM 	ndmp_help_t	nc_usage;
707917SReza.Sabdar@Sun.COM } ndmp_command_t;
717917SReza.Sabdar@Sun.COM 
727917SReza.Sabdar@Sun.COM static int ndmp_get_config(int, char **, ndmp_command_t *);
737917SReza.Sabdar@Sun.COM static int ndmp_set_config(int, char **, ndmp_command_t *);
747917SReza.Sabdar@Sun.COM static int ndmp_show_devices(int, char **, ndmp_command_t *);
757917SReza.Sabdar@Sun.COM static int ndmp_show_sessions(int, char **, ndmp_command_t *);
767917SReza.Sabdar@Sun.COM static int ndmp_kill_sessions(int, char **, ndmp_command_t *);
777917SReza.Sabdar@Sun.COM static int ndmp_enable_auth(int, char **, ndmp_command_t *);
787917SReza.Sabdar@Sun.COM static int ndmp_disable_auth(int, char **, ndmp_command_t *);
797917SReza.Sabdar@Sun.COM static void ndmp_get_config_process(char *);
807917SReza.Sabdar@Sun.COM static void ndmp_set_config_process(char *arg);
817917SReza.Sabdar@Sun.COM static int ndmp_get_password(char **);
827917SReza.Sabdar@Sun.COM 
837917SReza.Sabdar@Sun.COM static ndmp_command_t command_table[] = {
847917SReza.Sabdar@Sun.COM 	{ "get",		ndmp_get_config,	HELP_GET_CONFIG	},
857917SReza.Sabdar@Sun.COM 	{ "set",		ndmp_set_config,	HELP_SET_CONFIG	},
867917SReza.Sabdar@Sun.COM 	{ "show-devices",	ndmp_show_devices,	HELP_SHOW_DEVICES },
877917SReza.Sabdar@Sun.COM 	{ "show-sessions",	ndmp_show_sessions,	HELP_SHOW_SESSIONS },
887917SReza.Sabdar@Sun.COM 	{ "kill-sessions",	ndmp_kill_sessions,	HELP_KILL_SESSIONS },
897917SReza.Sabdar@Sun.COM 	{ "enable",		ndmp_enable_auth,	HELP_ENABLE_AUTH },
907917SReza.Sabdar@Sun.COM 	{ "disable",		ndmp_disable_auth,	HELP_DISABLE_AUTH }
917917SReza.Sabdar@Sun.COM };
927917SReza.Sabdar@Sun.COM 
937917SReza.Sabdar@Sun.COM #define	NCOMMAND	(sizeof (command_table) / sizeof (command_table[0]))
947917SReza.Sabdar@Sun.COM 
957917SReza.Sabdar@Sun.COM static char *prop_table[] = {
967917SReza.Sabdar@Sun.COM 	"debug-path",
977917SReza.Sabdar@Sun.COM 	"dump-pathnode",
987917SReza.Sabdar@Sun.COM 	"tar-pathnode",
997917SReza.Sabdar@Sun.COM 	"ignore-ctime",
1007917SReza.Sabdar@Sun.COM 	"token-maxseq",
1017917SReza.Sabdar@Sun.COM 	"version",
1027917SReza.Sabdar@Sun.COM 	"dar-support",
1037917SReza.Sabdar@Sun.COM 	"tcp-port",
1047917SReza.Sabdar@Sun.COM 	"backup-quarantine",
1057917SReza.Sabdar@Sun.COM 	"restore-quarantine",
10612514SJanice.Chang@Sun.COM 	"overwrite-quarantine",
107*13051SJanice.Chang@Sun.COM 	"zfs-force-override",
108*13051SJanice.Chang@Sun.COM 	"drive-type"
1097917SReza.Sabdar@Sun.COM };
1107917SReza.Sabdar@Sun.COM 
1117917SReza.Sabdar@Sun.COM #define	NDMPADM_NPROP	(sizeof (prop_table) / sizeof (prop_table[0]))
1127917SReza.Sabdar@Sun.COM 
1137917SReza.Sabdar@Sun.COM typedef struct ndmp_auth {
1147917SReza.Sabdar@Sun.COM 	const char *auth_type;
1157917SReza.Sabdar@Sun.COM 	const char *username;
1167917SReza.Sabdar@Sun.COM 	const char *password;
1177917SReza.Sabdar@Sun.COM } ndmp_auth_t;
1187917SReza.Sabdar@Sun.COM 
1197917SReza.Sabdar@Sun.COM static ndmp_auth_t ndmp_auth_table[] = {
1207917SReza.Sabdar@Sun.COM 	{ "cram-md5", "cram-md5-username", "cram-md5-password" },
1217917SReza.Sabdar@Sun.COM 	{ "cleartext", "cleartext-username", "cleartext-password" }
1227917SReza.Sabdar@Sun.COM };
1237917SReza.Sabdar@Sun.COM #define	NAUTH	(sizeof (ndmp_auth_table) / sizeof (ndmp_auth_table[0]))
1247917SReza.Sabdar@Sun.COM #define	NDMP_PASSWORD_RETRIES	3
1257917SReza.Sabdar@Sun.COM 
1267917SReza.Sabdar@Sun.COM #if !defined(TEXT_DOMAIN)
1277917SReza.Sabdar@Sun.COM #define	TEXT_DOMAIN	"SYS_TEST"
1287917SReza.Sabdar@Sun.COM #endif
1297917SReza.Sabdar@Sun.COM 
1307917SReza.Sabdar@Sun.COM static const char *
get_usage(ndmp_help_t idx)1317917SReza.Sabdar@Sun.COM get_usage(ndmp_help_t idx)
1327917SReza.Sabdar@Sun.COM {
1337917SReza.Sabdar@Sun.COM 	switch (idx) {
1347917SReza.Sabdar@Sun.COM 	case HELP_SET_CONFIG:
1357917SReza.Sabdar@Sun.COM 		return ("\tset [-p] <property=value> [[-p] property=value] "
1367917SReza.Sabdar@Sun.COM 		    "...\n");
1377917SReza.Sabdar@Sun.COM 	case HELP_GET_CONFIG:
1387917SReza.Sabdar@Sun.COM 		return ("\tget [-p] [property] [[-p] property] ...\n");
1397917SReza.Sabdar@Sun.COM 	case HELP_SHOW_DEVICES:
1407917SReza.Sabdar@Sun.COM 		return ("\tshow-devices\n");
1417917SReza.Sabdar@Sun.COM 	case HELP_SHOW_SESSIONS:
1427917SReza.Sabdar@Sun.COM 		return ("\tshow-sessions [-i tape,scsi,data,mover] [id] ...\n");
1437917SReza.Sabdar@Sun.COM 	case HELP_KILL_SESSIONS:
1447917SReza.Sabdar@Sun.COM 		return ("\tkill-sessions <id ...>\n");
1457917SReza.Sabdar@Sun.COM 	case HELP_ENABLE_AUTH:
1467917SReza.Sabdar@Sun.COM 		return ("\tenable <-a auth-type> <-u username>\n");
1477917SReza.Sabdar@Sun.COM 	case HELP_DISABLE_AUTH:
1487917SReza.Sabdar@Sun.COM 		return ("\tdisable <-a auth-type>\n");
1497917SReza.Sabdar@Sun.COM 	}
1507917SReza.Sabdar@Sun.COM 
1517917SReza.Sabdar@Sun.COM 	return (NULL);
1527917SReza.Sabdar@Sun.COM }
1537917SReza.Sabdar@Sun.COM 
1547917SReza.Sabdar@Sun.COM /*
1557917SReza.Sabdar@Sun.COM  * Display usage message.  If we're inside a command, display only the usage for
1567917SReza.Sabdar@Sun.COM  * that command.  Otherwise, iterate over the entire command table and display
1577917SReza.Sabdar@Sun.COM  * a complete usage message.
1587917SReza.Sabdar@Sun.COM  */
1597917SReza.Sabdar@Sun.COM static void
usage(boolean_t requested,ndmp_command_t * current_command)1607917SReza.Sabdar@Sun.COM usage(boolean_t requested, ndmp_command_t *current_command)
1617917SReza.Sabdar@Sun.COM {
1627917SReza.Sabdar@Sun.COM 	int i;
1637917SReza.Sabdar@Sun.COM 	boolean_t show_properties = B_FALSE;
1647917SReza.Sabdar@Sun.COM 	FILE *fp = requested ? stdout : stderr;
1657917SReza.Sabdar@Sun.COM 
1667917SReza.Sabdar@Sun.COM 	if (current_command == NULL) {
1677917SReza.Sabdar@Sun.COM 		(void) fprintf(fp,
1687917SReza.Sabdar@Sun.COM 		    gettext("Usage: ndmpadm subcommand args ...\n"));
1697917SReza.Sabdar@Sun.COM 		(void) fprintf(fp,
1707917SReza.Sabdar@Sun.COM 		    gettext("where 'command' is one of the following:\n\n"));
1717917SReza.Sabdar@Sun.COM 
1727917SReza.Sabdar@Sun.COM 		for (i = 0; i < NCOMMAND; i++) {
1737917SReza.Sabdar@Sun.COM 			(void) fprintf(fp, "%s",
1747917SReza.Sabdar@Sun.COM 			    get_usage(command_table[i].nc_usage));
1757917SReza.Sabdar@Sun.COM 		}
1767917SReza.Sabdar@Sun.COM 		(void) fprintf(fp, gettext("\t\twhere %s can be either "
1777917SReza.Sabdar@Sun.COM 		    "%s or %s\n"), "'auth-type'", "'cram-md5'", "'cleartext'");
1787917SReza.Sabdar@Sun.COM 	} else {
1797917SReza.Sabdar@Sun.COM 		(void) fprintf(fp, gettext("Usage:\n"));
1807917SReza.Sabdar@Sun.COM 		(void) fprintf(fp, "%s", get_usage(current_command->nc_usage));
1817917SReza.Sabdar@Sun.COM 		if ((current_command->nc_usage == HELP_ENABLE_AUTH) ||
1827917SReza.Sabdar@Sun.COM 		    (current_command->nc_usage == HELP_DISABLE_AUTH))
1837917SReza.Sabdar@Sun.COM 			(void) fprintf(fp, gettext("\t\twhere %s can be either "
1847917SReza.Sabdar@Sun.COM 			    "%s or %s\n"),
1857917SReza.Sabdar@Sun.COM 			    "'auth-type'", "'cram-md5'", "'cleartext'");
1867917SReza.Sabdar@Sun.COM 	}
1877917SReza.Sabdar@Sun.COM 
1887917SReza.Sabdar@Sun.COM 	if (current_command != NULL &&
1897917SReza.Sabdar@Sun.COM 	    (strcmp(current_command->nc_name, "set") == 0))
1907917SReza.Sabdar@Sun.COM 		show_properties = B_TRUE;
1917917SReza.Sabdar@Sun.COM 
1927917SReza.Sabdar@Sun.COM 	if (show_properties) {
1937917SReza.Sabdar@Sun.COM 		(void) fprintf(fp,
1947917SReza.Sabdar@Sun.COM 		    gettext("\nThe following properties are supported:\n"));
1957917SReza.Sabdar@Sun.COM 
1967917SReza.Sabdar@Sun.COM 		(void) fprintf(fp, gettext("\n\tPROPERTY"));
1977917SReza.Sabdar@Sun.COM 		(void) fprintf(fp, "\n\t%s", "-------------");
1987917SReza.Sabdar@Sun.COM 		for (i = 0; i < NDMPADM_NPROP; i++)
1997917SReza.Sabdar@Sun.COM 			(void) fprintf(fp, "\n\t%s", prop_table[i]);
2007917SReza.Sabdar@Sun.COM 		(void) fprintf(fp, "\n");
2017917SReza.Sabdar@Sun.COM 	}
2027917SReza.Sabdar@Sun.COM 
2037917SReza.Sabdar@Sun.COM 	exit(requested ? 0 : 2);
2047917SReza.Sabdar@Sun.COM }
2057917SReza.Sabdar@Sun.COM 
2067917SReza.Sabdar@Sun.COM /*ARGSUSED*/
2077917SReza.Sabdar@Sun.COM static int
ndmp_get_config(int argc,char ** argv,ndmp_command_t * cur_cmd)2087917SReza.Sabdar@Sun.COM ndmp_get_config(int argc, char **argv, ndmp_command_t *cur_cmd)
2097917SReza.Sabdar@Sun.COM {
2107917SReza.Sabdar@Sun.COM 	char *propval;
2117917SReza.Sabdar@Sun.COM 	int i, c;
2127917SReza.Sabdar@Sun.COM 
2137917SReza.Sabdar@Sun.COM 	if (argc == 1) {
2147917SReza.Sabdar@Sun.COM 		/*
2157917SReza.Sabdar@Sun.COM 		 * Get all the properties and variables ndmpadm is allowed
2167917SReza.Sabdar@Sun.COM 		 * to see.
2177917SReza.Sabdar@Sun.COM 		 */
2187917SReza.Sabdar@Sun.COM 		for (i = 0; i < NDMPADM_NPROP; i++) {
2197917SReza.Sabdar@Sun.COM 			if (ndmp_get_prop(prop_table[i], &propval)) {
2207917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout, "\t%s=\n",
2217917SReza.Sabdar@Sun.COM 				    prop_table[i]);
2227917SReza.Sabdar@Sun.COM 			} else {
2237917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout, "\t%s=%s\n",
2247917SReza.Sabdar@Sun.COM 				    prop_table[i], propval);
2257917SReza.Sabdar@Sun.COM 				free(propval);
2267917SReza.Sabdar@Sun.COM 			}
2277917SReza.Sabdar@Sun.COM 		}
2287917SReza.Sabdar@Sun.COM 	} else if (argc > 1) {
2297917SReza.Sabdar@Sun.COM 		while ((c = getopt(argc, argv, ":p:")) != -1) {
2307917SReza.Sabdar@Sun.COM 			switch (c) {
2317917SReza.Sabdar@Sun.COM 			case 'p':
2327917SReza.Sabdar@Sun.COM 				ndmp_get_config_process(optarg);
2337917SReza.Sabdar@Sun.COM 				break;
2347917SReza.Sabdar@Sun.COM 			case ':':
2357917SReza.Sabdar@Sun.COM 				(void) fprintf(stderr, gettext("Option -%c "
2367917SReza.Sabdar@Sun.COM 				    "requires an operand\n"), optopt);
2377917SReza.Sabdar@Sun.COM 				break;
2387917SReza.Sabdar@Sun.COM 			case '?':
2397917SReza.Sabdar@Sun.COM 				(void) fprintf(stderr, gettext("Unrecognized "
2407917SReza.Sabdar@Sun.COM 				    "option: -%c\n"), optopt);
2417917SReza.Sabdar@Sun.COM 			}
2427917SReza.Sabdar@Sun.COM 		}
2437917SReza.Sabdar@Sun.COM 		/*
2447917SReza.Sabdar@Sun.COM 		 * optind is initialized to 1 if the -p option is not used,
2457917SReza.Sabdar@Sun.COM 		 * otherwise index to argv.
2467917SReza.Sabdar@Sun.COM 		 */
2477917SReza.Sabdar@Sun.COM 		argc -= optind;
2487917SReza.Sabdar@Sun.COM 		argv += optind;
2497917SReza.Sabdar@Sun.COM 
2507917SReza.Sabdar@Sun.COM 		for (i = 0; i < argc; i++) {
2517917SReza.Sabdar@Sun.COM 			if (strncmp(argv[i], "-p", 2) == 0)
2527917SReza.Sabdar@Sun.COM 				continue;
2537917SReza.Sabdar@Sun.COM 
2547917SReza.Sabdar@Sun.COM 			ndmp_get_config_process(argv[i]);
2557917SReza.Sabdar@Sun.COM 		}
2567917SReza.Sabdar@Sun.COM 	}
2577917SReza.Sabdar@Sun.COM 	return (0);
2587917SReza.Sabdar@Sun.COM }
2597917SReza.Sabdar@Sun.COM 
2607917SReza.Sabdar@Sun.COM static void
ndmp_get_config_process(char * arg)2617917SReza.Sabdar@Sun.COM ndmp_get_config_process(char *arg)
2627917SReza.Sabdar@Sun.COM {
2637917SReza.Sabdar@Sun.COM 	int j;
2647917SReza.Sabdar@Sun.COM 	char *propval;
2657917SReza.Sabdar@Sun.COM 
2667917SReza.Sabdar@Sun.COM 	for (j = 0; j < NDMPADM_NPROP; j++) {
2677917SReza.Sabdar@Sun.COM 		if (strcmp(arg, prop_table[j]) == 0) {
2687917SReza.Sabdar@Sun.COM 			if (ndmp_get_prop(arg, &propval)) {
2697917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout, "\t%s=\n", arg);
2707917SReza.Sabdar@Sun.COM 			} else {
2717917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout, "\t%s=%s\n",
2727917SReza.Sabdar@Sun.COM 				    arg, propval);
2737917SReza.Sabdar@Sun.COM 				free(propval);
2747917SReza.Sabdar@Sun.COM 			}
2757917SReza.Sabdar@Sun.COM 			break;
2767917SReza.Sabdar@Sun.COM 		}
2777917SReza.Sabdar@Sun.COM 	}
2787917SReza.Sabdar@Sun.COM 	if (j == NDMPADM_NPROP) {
2797917SReza.Sabdar@Sun.COM 		(void) fprintf(stdout, gettext("\t%s is invalid property "
2807917SReza.Sabdar@Sun.COM 		    "or variable\n"), arg);
2817917SReza.Sabdar@Sun.COM 	}
2827917SReza.Sabdar@Sun.COM }
2837917SReza.Sabdar@Sun.COM 
2847917SReza.Sabdar@Sun.COM /*ARGSUSED*/
2857917SReza.Sabdar@Sun.COM static int
ndmp_set_config(int argc,char ** argv,ndmp_command_t * cur_cmd)2867917SReza.Sabdar@Sun.COM ndmp_set_config(int argc, char **argv, ndmp_command_t *cur_cmd)
2877917SReza.Sabdar@Sun.COM {
2887917SReza.Sabdar@Sun.COM 	int c, i;
2897917SReza.Sabdar@Sun.COM 
2907917SReza.Sabdar@Sun.COM 	if (argc < 2) {
2917917SReza.Sabdar@Sun.COM 		(void) fprintf(stderr, gettext("Missing property=value "
2927917SReza.Sabdar@Sun.COM 		    "argument\n"));
2937917SReza.Sabdar@Sun.COM 		usage(B_FALSE, cur_cmd);
2947917SReza.Sabdar@Sun.COM 	}
2957917SReza.Sabdar@Sun.COM 	while ((c = getopt(argc, argv, ":p:")) != -1) {
2967917SReza.Sabdar@Sun.COM 		switch (c) {
2977917SReza.Sabdar@Sun.COM 		case 'p':
2987917SReza.Sabdar@Sun.COM 			ndmp_set_config_process(optarg);
2997917SReza.Sabdar@Sun.COM 			break;
3007917SReza.Sabdar@Sun.COM 		case ':':
3017917SReza.Sabdar@Sun.COM 			(void) fprintf(stderr, gettext("Option -%c "
3027917SReza.Sabdar@Sun.COM 			    "requires an operand\n"), optopt);
3037917SReza.Sabdar@Sun.COM 			break;
3047917SReza.Sabdar@Sun.COM 		case '?':
3057917SReza.Sabdar@Sun.COM 			(void) fprintf(stderr, gettext("Unrecognized "
3067917SReza.Sabdar@Sun.COM 			    "option: -%c\n"), optopt);
3077917SReza.Sabdar@Sun.COM 		}
3087917SReza.Sabdar@Sun.COM 	}
3097917SReza.Sabdar@Sun.COM 	/*
3107917SReza.Sabdar@Sun.COM 	 * optind is initialized to 1 if the -p option is not used,
3117917SReza.Sabdar@Sun.COM 	 * otherwise index to argv.
3127917SReza.Sabdar@Sun.COM 	 */
3137917SReza.Sabdar@Sun.COM 	argc -= optind;
3147917SReza.Sabdar@Sun.COM 	argv += optind;
3157917SReza.Sabdar@Sun.COM 
3167917SReza.Sabdar@Sun.COM 	for (i = 0; i < argc; i++) {
3177917SReza.Sabdar@Sun.COM 		if (strncmp(argv[i], "-p", 2) == 0)
3187917SReza.Sabdar@Sun.COM 			continue;
3197917SReza.Sabdar@Sun.COM 
3207917SReza.Sabdar@Sun.COM 		ndmp_set_config_process(argv[i]);
3217917SReza.Sabdar@Sun.COM 	}
3227917SReza.Sabdar@Sun.COM 	return (0);
3237917SReza.Sabdar@Sun.COM }
3247917SReza.Sabdar@Sun.COM 
3257917SReza.Sabdar@Sun.COM static void
ndmp_set_config_process(char * propname)3267917SReza.Sabdar@Sun.COM ndmp_set_config_process(char *propname)
3277917SReza.Sabdar@Sun.COM {
3287917SReza.Sabdar@Sun.COM 	char *propvalue;
3297917SReza.Sabdar@Sun.COM 	int ret, j;
3307917SReza.Sabdar@Sun.COM 
3317917SReza.Sabdar@Sun.COM 	if ((propvalue = strchr(propname, '=')) == NULL) {
3327917SReza.Sabdar@Sun.COM 		(void) fprintf(stderr, gettext("Missing value in "
3337917SReza.Sabdar@Sun.COM 		    "property=value argument for %s\n"), propname);
3347917SReza.Sabdar@Sun.COM 			return;
3357917SReza.Sabdar@Sun.COM 	}
3367917SReza.Sabdar@Sun.COM 	*propvalue = '\0';
3377917SReza.Sabdar@Sun.COM 	propvalue++;
3387917SReza.Sabdar@Sun.COM 
3397917SReza.Sabdar@Sun.COM 	if (*propname == '\0') {
3407917SReza.Sabdar@Sun.COM 		(void) fprintf(stderr, gettext("Missing property in "
3417917SReza.Sabdar@Sun.COM 		    "property=value argument for %s\n"), propname);
3427917SReza.Sabdar@Sun.COM 			return;
3437917SReza.Sabdar@Sun.COM 	}
3447917SReza.Sabdar@Sun.COM 	for (j = 0; j < NDMPADM_NPROP; j++) {
3457917SReza.Sabdar@Sun.COM 		if (strcmp(propname, prop_table[j]) == 0)
3467917SReza.Sabdar@Sun.COM 			break;
3477917SReza.Sabdar@Sun.COM 	}
3487917SReza.Sabdar@Sun.COM 	if (j == NDMPADM_NPROP) {
3497917SReza.Sabdar@Sun.COM 		(void) fprintf(stdout, gettext("%s is invalid property or "
3507917SReza.Sabdar@Sun.COM 		    "variable\n"), propname);
3517917SReza.Sabdar@Sun.COM 		return;
3527917SReza.Sabdar@Sun.COM 	}
3537917SReza.Sabdar@Sun.COM 	ret = ndmp_set_prop(propname, propvalue);
3547917SReza.Sabdar@Sun.COM 	if (ret != -1) {
3557917SReza.Sabdar@Sun.COM 		if (!ndmp_door_status()) {
3567917SReza.Sabdar@Sun.COM 			if (ndmp_service_refresh() == -1)
3577917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout, gettext("Could not "
3587917SReza.Sabdar@Sun.COM 				    "refesh property of service ndmpd\n"));
3597917SReza.Sabdar@Sun.COM 		}
3607917SReza.Sabdar@Sun.COM 	} else {
3617917SReza.Sabdar@Sun.COM 		(void) fprintf(stdout, gettext("Could not set property for "
3627917SReza.Sabdar@Sun.COM 		    "%s - %s\n"), propname, ndmp_strerror(ndmp_errno));
3637917SReza.Sabdar@Sun.COM 	}
3647917SReza.Sabdar@Sun.COM }
3657917SReza.Sabdar@Sun.COM 
3667917SReza.Sabdar@Sun.COM /*ARGSUSED*/
3677917SReza.Sabdar@Sun.COM static int
ndmp_show_devices(int argc,char ** argv,ndmp_command_t * cur_cmd)3687917SReza.Sabdar@Sun.COM ndmp_show_devices(int argc, char **argv, ndmp_command_t *cur_cmd)
3697917SReza.Sabdar@Sun.COM {
3707917SReza.Sabdar@Sun.COM 	int ret;
3717917SReza.Sabdar@Sun.COM 	ndmp_devinfo_t *dip = NULL;
3727917SReza.Sabdar@Sun.COM 	size_t size;
3737917SReza.Sabdar@Sun.COM 
3747917SReza.Sabdar@Sun.COM 	if (ndmp_door_status()) {
3757917SReza.Sabdar@Sun.COM 		(void) fprintf(stdout,
3767917SReza.Sabdar@Sun.COM 		    gettext("Service ndmpd not running\n"));
3777917SReza.Sabdar@Sun.COM 		return (-1);
3787917SReza.Sabdar@Sun.COM 	}
3797917SReza.Sabdar@Sun.COM 
3807917SReza.Sabdar@Sun.COM 	ret = ndmp_get_devinfo(&dip, &size);
3817917SReza.Sabdar@Sun.COM 
3827917SReza.Sabdar@Sun.COM 	if (ret == -1)
3837917SReza.Sabdar@Sun.COM 		(void) fprintf(stdout,
3847917SReza.Sabdar@Sun.COM 		    gettext("Could not get device information\n"));
3857917SReza.Sabdar@Sun.COM 	else
3867917SReza.Sabdar@Sun.COM 		ndmp_devinfo_print(dip, size);
3877917SReza.Sabdar@Sun.COM 
3887917SReza.Sabdar@Sun.COM 	ndmp_get_devinfo_free(dip, size);
3897917SReza.Sabdar@Sun.COM 	return (0);
3907917SReza.Sabdar@Sun.COM }
3917917SReza.Sabdar@Sun.COM 
3927917SReza.Sabdar@Sun.COM static int
ndmp_show_sessions(int argc,char ** argv,ndmp_command_t * cur_cmd)3937917SReza.Sabdar@Sun.COM ndmp_show_sessions(int argc, char **argv, ndmp_command_t *cur_cmd)
3947917SReza.Sabdar@Sun.COM {
3957917SReza.Sabdar@Sun.COM 	ndmp_session_info_t *sinfo = NULL;
3967917SReza.Sabdar@Sun.COM 	ndmp_session_info_t *sp = NULL;
3977917SReza.Sabdar@Sun.COM 	uint_t num;
3987917SReza.Sabdar@Sun.COM 	int c, ret, i, j;
3997917SReza.Sabdar@Sun.COM 	int statarg = 0;
4007917SReza.Sabdar@Sun.COM 	char *value;
4017917SReza.Sabdar@Sun.COM 	char *type_subopts[] = { "tape", "scsi", "data", "mover", NULL };
4027917SReza.Sabdar@Sun.COM 
4037917SReza.Sabdar@Sun.COM 	if (ndmp_door_status()) {
4047917SReza.Sabdar@Sun.COM 		(void) fprintf(stdout,
4057917SReza.Sabdar@Sun.COM 		    gettext("Service ndmpd not running\n"));
4067917SReza.Sabdar@Sun.COM 		return (-1);
4077917SReza.Sabdar@Sun.COM 	}
4087917SReza.Sabdar@Sun.COM 
4097917SReza.Sabdar@Sun.COM 	/* Detail output if no option is specified */
4107917SReza.Sabdar@Sun.COM 	if (argc == 1) {
4117917SReza.Sabdar@Sun.COM 		statarg = NDMP_CAT_ALL;
4127917SReza.Sabdar@Sun.COM 	} else {
4137917SReza.Sabdar@Sun.COM 		statarg = 0;
4147917SReza.Sabdar@Sun.COM 		while ((c = getopt(argc, argv, ":i:")) != -1) {
4157917SReza.Sabdar@Sun.COM 			switch (c) {
4167917SReza.Sabdar@Sun.COM 			case 'i':
4177917SReza.Sabdar@Sun.COM 				while (*optarg != '\0') {
4187917SReza.Sabdar@Sun.COM 					switch (getsubopt(&optarg, type_subopts,
4197917SReza.Sabdar@Sun.COM 					    &value)) {
4207917SReza.Sabdar@Sun.COM 					case 0:
4217917SReza.Sabdar@Sun.COM 						statarg |= NDMP_CAT_TAPE;
4227917SReza.Sabdar@Sun.COM 						break;
4237917SReza.Sabdar@Sun.COM 					case 1:
4247917SReza.Sabdar@Sun.COM 						statarg |= NDMP_CAT_SCSI;
4257917SReza.Sabdar@Sun.COM 						break;
4267917SReza.Sabdar@Sun.COM 					case 2:
4277917SReza.Sabdar@Sun.COM 						statarg |= NDMP_CAT_DATA;
4287917SReza.Sabdar@Sun.COM 						break;
4297917SReza.Sabdar@Sun.COM 					case 3:
4307917SReza.Sabdar@Sun.COM 						statarg |= NDMP_CAT_MOVER;
4317917SReza.Sabdar@Sun.COM 						break;
4327917SReza.Sabdar@Sun.COM 					default:
4337917SReza.Sabdar@Sun.COM 						(void) fprintf(stderr,
4347917SReza.Sabdar@Sun.COM 						    gettext("Invalid object "
4357917SReza.Sabdar@Sun.COM 						    "type '%s'\n"), value);
4367917SReza.Sabdar@Sun.COM 						usage(B_FALSE, cur_cmd);
4377917SReza.Sabdar@Sun.COM 					}
4387917SReza.Sabdar@Sun.COM 				}
4397917SReza.Sabdar@Sun.COM 				break;
4407917SReza.Sabdar@Sun.COM 			case ':':
4417917SReza.Sabdar@Sun.COM 				(void) fprintf(stderr,
4427917SReza.Sabdar@Sun.COM 				    gettext("Missing argument for "
4437917SReza.Sabdar@Sun.COM 				    "'%c' option\n"), optopt);
4447917SReza.Sabdar@Sun.COM 				usage(B_FALSE, cur_cmd);
4457917SReza.Sabdar@Sun.COM 				break;
4467917SReza.Sabdar@Sun.COM 			case '?':
4477917SReza.Sabdar@Sun.COM 				(void) fprintf(stderr,
4487917SReza.Sabdar@Sun.COM 				    gettext("Invalid option '%c'\n"), optopt);
4497917SReza.Sabdar@Sun.COM 				usage(B_FALSE, cur_cmd);
4507917SReza.Sabdar@Sun.COM 			}
4517917SReza.Sabdar@Sun.COM 		}
4527917SReza.Sabdar@Sun.COM 		/* if -i and its argument are not specified, display all */
4537917SReza.Sabdar@Sun.COM 		if (statarg == 0)
4547917SReza.Sabdar@Sun.COM 			statarg = NDMP_CAT_ALL;
4557917SReza.Sabdar@Sun.COM 	}
4567917SReza.Sabdar@Sun.COM 	/*
4577917SReza.Sabdar@Sun.COM 	 * optind is initialized to 1 if the -i option is not used, otherwise
4587917SReza.Sabdar@Sun.COM 	 * index to argv.
4597917SReza.Sabdar@Sun.COM 	 */
4607917SReza.Sabdar@Sun.COM 	argc -= optind;
4617917SReza.Sabdar@Sun.COM 	argv += optind;
4627917SReza.Sabdar@Sun.COM 
4637917SReza.Sabdar@Sun.COM 	ret = ndmp_get_session_info(&sinfo, &num);
4647917SReza.Sabdar@Sun.COM 	if (ret == -1) {
4657917SReza.Sabdar@Sun.COM 		(void) fprintf(stdout,
4667917SReza.Sabdar@Sun.COM 		    gettext("Could not get session information\n"));
4677917SReza.Sabdar@Sun.COM 	} else {
4687917SReza.Sabdar@Sun.COM 		if (argc == 0) {
4697917SReza.Sabdar@Sun.COM 			ndmp_session_all_print(statarg, sinfo, num);
4707917SReza.Sabdar@Sun.COM 		} else {
4717917SReza.Sabdar@Sun.COM 			for (i = 0; i < argc; i++) {
4727917SReza.Sabdar@Sun.COM 				sp = sinfo;
4737917SReza.Sabdar@Sun.COM 				for (j = 0; j < num; j++, sp++) {
4747917SReza.Sabdar@Sun.COM 					if (sp->nsi_sid == atoi(argv[i])) {
4757917SReza.Sabdar@Sun.COM 						ndmp_session_print(statarg, sp);
4767917SReza.Sabdar@Sun.COM 						(void) fprintf(stdout, "\n");
4777917SReza.Sabdar@Sun.COM 						break;
4787917SReza.Sabdar@Sun.COM 					}
4797917SReza.Sabdar@Sun.COM 				}
4807917SReza.Sabdar@Sun.COM 				if (j == num) {
4817917SReza.Sabdar@Sun.COM 					(void) fprintf(stdout,
4827917SReza.Sabdar@Sun.COM 					    gettext("Session %d not "
4837917SReza.Sabdar@Sun.COM 					    "found\n"), atoi(argv[i]));
4847917SReza.Sabdar@Sun.COM 				}
4857917SReza.Sabdar@Sun.COM 			}
4867917SReza.Sabdar@Sun.COM 		}
4877917SReza.Sabdar@Sun.COM 		ndmp_get_session_info_free(sinfo, num);
4887917SReza.Sabdar@Sun.COM 	}
4897917SReza.Sabdar@Sun.COM 	return (0);
4907917SReza.Sabdar@Sun.COM }
4917917SReza.Sabdar@Sun.COM 
4927917SReza.Sabdar@Sun.COM /*ARGSUSED*/
4937917SReza.Sabdar@Sun.COM static int
ndmp_kill_sessions(int argc,char ** argv,ndmp_command_t * cur_cmd)4947917SReza.Sabdar@Sun.COM ndmp_kill_sessions(int argc, char **argv, ndmp_command_t *cur_cmd)
4957917SReza.Sabdar@Sun.COM {
4967917SReza.Sabdar@Sun.COM 	int ret, i;
4977917SReza.Sabdar@Sun.COM 
4987917SReza.Sabdar@Sun.COM 	if (ndmp_door_status()) {
4997917SReza.Sabdar@Sun.COM 		(void) fprintf(stdout,
5007917SReza.Sabdar@Sun.COM 		    gettext("Service ndmpd not running.\n"));
5017917SReza.Sabdar@Sun.COM 		return (-1);
5027917SReza.Sabdar@Sun.COM 	}
5037917SReza.Sabdar@Sun.COM 
5047917SReza.Sabdar@Sun.COM 	/* If no arg is specified, print the usage and exit */
5057917SReza.Sabdar@Sun.COM 	if (argc == 1)
5067917SReza.Sabdar@Sun.COM 		usage(B_FALSE, cur_cmd);
5077917SReza.Sabdar@Sun.COM 
5087917SReza.Sabdar@Sun.COM 	for (i = 1; i < argc; i++) {
5097917SReza.Sabdar@Sun.COM 		if (atoi(argv[i]) > 0) {
5107917SReza.Sabdar@Sun.COM 			ret = ndmp_terminate_session(atoi(argv[i]));
5117917SReza.Sabdar@Sun.COM 		} else {
5127917SReza.Sabdar@Sun.COM 			(void) fprintf(stderr,
5137917SReza.Sabdar@Sun.COM 			    gettext("Invalid argument %s\n"), argv[i]);
5147917SReza.Sabdar@Sun.COM 				continue;
5157917SReza.Sabdar@Sun.COM 		}
5167917SReza.Sabdar@Sun.COM 		if (ret == -1)
5177917SReza.Sabdar@Sun.COM 			(void) fprintf(stdout,
5187917SReza.Sabdar@Sun.COM 			    gettext("Session id %d not found.\n"),
5197917SReza.Sabdar@Sun.COM 			    atoi(argv[i]));
5207917SReza.Sabdar@Sun.COM 	}
5217917SReza.Sabdar@Sun.COM 	return (0);
5227917SReza.Sabdar@Sun.COM }
5237917SReza.Sabdar@Sun.COM 
5247917SReza.Sabdar@Sun.COM static int
ndmp_get_password(char ** password)5257917SReza.Sabdar@Sun.COM ndmp_get_password(char **password)
5267917SReza.Sabdar@Sun.COM {
5277917SReza.Sabdar@Sun.COM 	char *pw1, pw2[257];
5287917SReza.Sabdar@Sun.COM 	int i;
5297917SReza.Sabdar@Sun.COM 
5307917SReza.Sabdar@Sun.COM 	for (i = 0; i < NDMP_PASSWORD_RETRIES; i++) {
5317917SReza.Sabdar@Sun.COM 		/*
5327917SReza.Sabdar@Sun.COM 		 * getpassphrase use the same buffer to return password, so
5337917SReza.Sabdar@Sun.COM 		 * copy the result in different buffer, before calling the
5347917SReza.Sabdar@Sun.COM 		 * getpassphrase again.
5357917SReza.Sabdar@Sun.COM 		 */
5367917SReza.Sabdar@Sun.COM 		if ((pw1 =
5377917SReza.Sabdar@Sun.COM 		    getpassphrase(gettext("Enter new password: "))) != NULL) {
5387917SReza.Sabdar@Sun.COM 			(void) strlcpy(pw2, pw1, sizeof (pw2));
5397917SReza.Sabdar@Sun.COM 			if ((pw1 =
5407917SReza.Sabdar@Sun.COM 			    getpassphrase(gettext("Re-enter  password: ")))
5417917SReza.Sabdar@Sun.COM 			    != NULL) {
5427917SReza.Sabdar@Sun.COM 				if (strncmp(pw1, pw2, strlen(pw1)) == 0) {
5437917SReza.Sabdar@Sun.COM 					*password = pw1;
5447917SReza.Sabdar@Sun.COM 					return (0);
5457917SReza.Sabdar@Sun.COM 				} else {
5467917SReza.Sabdar@Sun.COM 					(void) fprintf(stderr,
5477917SReza.Sabdar@Sun.COM 					    gettext("Both password did not "
5487917SReza.Sabdar@Sun.COM 					    "match.\n"));
5497917SReza.Sabdar@Sun.COM 				}
5507917SReza.Sabdar@Sun.COM 			}
5517917SReza.Sabdar@Sun.COM 		}
5527917SReza.Sabdar@Sun.COM 	}
5537917SReza.Sabdar@Sun.COM 	return (-1);
5547917SReza.Sabdar@Sun.COM }
5557917SReza.Sabdar@Sun.COM 
5567917SReza.Sabdar@Sun.COM static int
ndmp_enable_auth(int argc,char ** argv,ndmp_command_t * cur_cmd)5577917SReza.Sabdar@Sun.COM ndmp_enable_auth(int argc, char **argv, ndmp_command_t *cur_cmd)
5587917SReza.Sabdar@Sun.COM {
5597917SReza.Sabdar@Sun.COM 	char *auth_type, *username, *password;
5607917SReza.Sabdar@Sun.COM 	int c, i, auth_type_flag = 0;
5617917SReza.Sabdar@Sun.COM 	char *enc_password;
5627917SReza.Sabdar@Sun.COM 
5637917SReza.Sabdar@Sun.COM 	/* enable <-a auth-type> <-u username> */
5647917SReza.Sabdar@Sun.COM 	if (argc != 5) {
5657917SReza.Sabdar@Sun.COM 		usage(B_FALSE, cur_cmd);
5667917SReza.Sabdar@Sun.COM 	}
5677917SReza.Sabdar@Sun.COM 
5687917SReza.Sabdar@Sun.COM 	while ((c = getopt(argc, argv, ":a:u:")) != -1) {
5697917SReza.Sabdar@Sun.COM 		switch (c) {
5707917SReza.Sabdar@Sun.COM 		case 'a':
5717917SReza.Sabdar@Sun.COM 			auth_type = strdup(optarg);
5727917SReza.Sabdar@Sun.COM 			break;
5737917SReza.Sabdar@Sun.COM 		case 'u':
5747917SReza.Sabdar@Sun.COM 			username = strdup(optarg);
5757917SReza.Sabdar@Sun.COM 			break;
5767917SReza.Sabdar@Sun.COM 		case ':':
5777917SReza.Sabdar@Sun.COM 			(void) fprintf(stderr, gettext("Option -%c "
5787917SReza.Sabdar@Sun.COM 			    "requires an operand\n"), optopt);
5797917SReza.Sabdar@Sun.COM 			usage(B_FALSE, cur_cmd);
5807917SReza.Sabdar@Sun.COM 			break;
5817917SReza.Sabdar@Sun.COM 		case '?':
5827917SReza.Sabdar@Sun.COM 			(void) fprintf(stderr, gettext("Unrecognized "
5837917SReza.Sabdar@Sun.COM 			    "option: -%c\n"), optopt);
5847917SReza.Sabdar@Sun.COM 			usage(B_FALSE, cur_cmd);
5857917SReza.Sabdar@Sun.COM 		}
5867917SReza.Sabdar@Sun.COM 	}
5877917SReza.Sabdar@Sun.COM 
5887917SReza.Sabdar@Sun.COM 	if ((auth_type) && (username)) {
5897917SReza.Sabdar@Sun.COM 		if (ndmp_get_password(&password)) {
5907917SReza.Sabdar@Sun.COM 			(void) fprintf(stderr, gettext("Could not get correct "
5917917SReza.Sabdar@Sun.COM 			    "password, exiting..."));
5927917SReza.Sabdar@Sun.COM 			free(auth_type);
5937917SReza.Sabdar@Sun.COM 			free(username);
5947917SReza.Sabdar@Sun.COM 			exit(-1);
5957917SReza.Sabdar@Sun.COM 		}
5967917SReza.Sabdar@Sun.COM 	} else {
5977917SReza.Sabdar@Sun.COM 		(void) fprintf(stderr, gettext("%s or %s can not be blank"),
5987917SReza.Sabdar@Sun.COM 		    "'auth-type'", "'username'");
5997917SReza.Sabdar@Sun.COM 		free(auth_type);
6007917SReza.Sabdar@Sun.COM 		free(username);
6017917SReza.Sabdar@Sun.COM 		exit(-1);
6027917SReza.Sabdar@Sun.COM 	}
6037917SReza.Sabdar@Sun.COM 
6047917SReza.Sabdar@Sun.COM 	if ((enc_password = ndmp_base64_encode(password)) == NULL) {
6057917SReza.Sabdar@Sun.COM 		(void) fprintf(stdout,
6067917SReza.Sabdar@Sun.COM 		    gettext("Could not encode password - %s\n"),
6077917SReza.Sabdar@Sun.COM 		    ndmp_strerror(ndmp_errno));
6087917SReza.Sabdar@Sun.COM 		free(auth_type);
6097917SReza.Sabdar@Sun.COM 		free(username);
6107917SReza.Sabdar@Sun.COM 		exit(-1);
6117917SReza.Sabdar@Sun.COM 	}
6127917SReza.Sabdar@Sun.COM 
6137917SReza.Sabdar@Sun.COM 	for (i = 0; i < NAUTH; i++) {
6147917SReza.Sabdar@Sun.COM 		if (strncmp(auth_type, ndmp_auth_table[i].auth_type,
6157917SReza.Sabdar@Sun.COM 		    strlen(ndmp_auth_table[i].auth_type)) == 0) {
6167917SReza.Sabdar@Sun.COM 			auth_type_flag = 1;
6177917SReza.Sabdar@Sun.COM 			if ((ndmp_set_prop((char *)ndmp_auth_table[i].username,
6187917SReza.Sabdar@Sun.COM 			    username)) == -1) {
6197917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout,
6207917SReza.Sabdar@Sun.COM 				    gettext("Could not set username - %s\n"),
6217917SReza.Sabdar@Sun.COM 				    ndmp_strerror(ndmp_errno));
6227917SReza.Sabdar@Sun.COM 				continue;
6237917SReza.Sabdar@Sun.COM 			}
6247917SReza.Sabdar@Sun.COM 			if ((ndmp_set_prop((char *)ndmp_auth_table[i].password,
6257917SReza.Sabdar@Sun.COM 			    enc_password)) == -1) {
6267917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout,
6277917SReza.Sabdar@Sun.COM 				    gettext("Could not set password - %s\n"),
6287917SReza.Sabdar@Sun.COM 				    ndmp_strerror(ndmp_errno));
6297917SReza.Sabdar@Sun.COM 				continue;
6307917SReza.Sabdar@Sun.COM 			}
6317917SReza.Sabdar@Sun.COM 			if (!ndmp_door_status() &&
6327917SReza.Sabdar@Sun.COM 			    (ndmp_service_refresh()) == -1) {
6337917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout,
6347917SReza.Sabdar@Sun.COM 				    gettext("Could not refesh ndmpd service "
6357917SReza.Sabdar@Sun.COM 				    "properties\n"));
6367917SReza.Sabdar@Sun.COM 			}
6377917SReza.Sabdar@Sun.COM 		}
6387917SReza.Sabdar@Sun.COM 	}
6397917SReza.Sabdar@Sun.COM 	free(auth_type);
6407917SReza.Sabdar@Sun.COM 	free(username);
6417917SReza.Sabdar@Sun.COM 	free(enc_password);
6427917SReza.Sabdar@Sun.COM 
6437917SReza.Sabdar@Sun.COM 	if (!auth_type_flag)
6447917SReza.Sabdar@Sun.COM 		usage(B_FALSE, cur_cmd);
6457917SReza.Sabdar@Sun.COM 
6467917SReza.Sabdar@Sun.COM 	return (0);
6477917SReza.Sabdar@Sun.COM }
6487917SReza.Sabdar@Sun.COM 
6497917SReza.Sabdar@Sun.COM static int
ndmp_disable_auth(int argc,char ** argv,ndmp_command_t * cur_cmd)6507917SReza.Sabdar@Sun.COM ndmp_disable_auth(int argc, char **argv, ndmp_command_t *cur_cmd)
6517917SReza.Sabdar@Sun.COM {
6527917SReza.Sabdar@Sun.COM 	char *auth_type;
6537917SReza.Sabdar@Sun.COM 	int c, i, auth_type_flag = 0;
6547917SReza.Sabdar@Sun.COM 
6557917SReza.Sabdar@Sun.COM 	/* disable <-a auth-type> */
6567917SReza.Sabdar@Sun.COM 	if (argc != 3) {
6577917SReza.Sabdar@Sun.COM 		usage(B_FALSE, cur_cmd);
6587917SReza.Sabdar@Sun.COM 	}
6597917SReza.Sabdar@Sun.COM 
6607917SReza.Sabdar@Sun.COM 	while ((c = getopt(argc, argv, ":a:")) != -1) {
6617917SReza.Sabdar@Sun.COM 		switch (c) {
6627917SReza.Sabdar@Sun.COM 		case 'a':
6637917SReza.Sabdar@Sun.COM 			auth_type = strdup(optarg);
6647917SReza.Sabdar@Sun.COM 			break;
6657917SReza.Sabdar@Sun.COM 		case ':':
6667917SReza.Sabdar@Sun.COM 			(void) fprintf(stderr, gettext("Option -%c "
6677917SReza.Sabdar@Sun.COM 			    "requires an operand\n"), optopt);
6687917SReza.Sabdar@Sun.COM 			break;
6697917SReza.Sabdar@Sun.COM 		case '?':
6707917SReza.Sabdar@Sun.COM 			(void) fprintf(stderr, gettext("Unrecognized "
6717917SReza.Sabdar@Sun.COM 			    "option: -%c\n"), optopt);
6727917SReza.Sabdar@Sun.COM 		}
6737917SReza.Sabdar@Sun.COM 	}
6747917SReza.Sabdar@Sun.COM 	for (i = 0; i < NAUTH; i++) {
6757917SReza.Sabdar@Sun.COM 		if (strncmp(auth_type, ndmp_auth_table[i].auth_type,
6767917SReza.Sabdar@Sun.COM 		    strlen(ndmp_auth_table[i].auth_type)) == 0) {
6777917SReza.Sabdar@Sun.COM 			auth_type_flag = 1;
6787917SReza.Sabdar@Sun.COM 			if ((ndmp_set_prop((char *)ndmp_auth_table[i].username,
6797917SReza.Sabdar@Sun.COM 			    "")) == -1) {
6807917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout,
6817917SReza.Sabdar@Sun.COM 				    gettext("Could not clear username - %s\n"),
6827917SReza.Sabdar@Sun.COM 				    ndmp_strerror(ndmp_errno));
6837917SReza.Sabdar@Sun.COM 				continue;
6847917SReza.Sabdar@Sun.COM 			}
6857917SReza.Sabdar@Sun.COM 			if ((ndmp_set_prop((char *)ndmp_auth_table[i].password,
6867917SReza.Sabdar@Sun.COM 			    "")) == -1) {
6877917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout,
6887917SReza.Sabdar@Sun.COM 				    gettext("Could not clear password - %s\n"),
6897917SReza.Sabdar@Sun.COM 				    ndmp_strerror(ndmp_errno));
6907917SReza.Sabdar@Sun.COM 				continue;
6917917SReza.Sabdar@Sun.COM 			}
6927917SReza.Sabdar@Sun.COM 			if (!ndmp_door_status() &&
6937917SReza.Sabdar@Sun.COM 			    (ndmp_service_refresh()) == -1) {
6947917SReza.Sabdar@Sun.COM 				(void) fprintf(stdout, gettext("Could not "
6957917SReza.Sabdar@Sun.COM 				    "refesh ndmpd service properties\n"));
6967917SReza.Sabdar@Sun.COM 			}
6977917SReza.Sabdar@Sun.COM 		}
6987917SReza.Sabdar@Sun.COM 	}
6997917SReza.Sabdar@Sun.COM 	free(auth_type);
7007917SReza.Sabdar@Sun.COM 
7017917SReza.Sabdar@Sun.COM 	if (!auth_type_flag)
7027917SReza.Sabdar@Sun.COM 		usage(B_FALSE, cur_cmd);
7037917SReza.Sabdar@Sun.COM 
7047917SReza.Sabdar@Sun.COM 	return (0);
7057917SReza.Sabdar@Sun.COM }
7067917SReza.Sabdar@Sun.COM 
7077917SReza.Sabdar@Sun.COM int
main(int argc,char ** argv)7087917SReza.Sabdar@Sun.COM main(int argc, char **argv)
7097917SReza.Sabdar@Sun.COM {
7107917SReza.Sabdar@Sun.COM 	int ret;
7117917SReza.Sabdar@Sun.COM 	int i;
7127917SReza.Sabdar@Sun.COM 	char *cmdname;
7137917SReza.Sabdar@Sun.COM 	ndmp_command_t	*current_command = NULL;
7147917SReza.Sabdar@Sun.COM 
7157917SReza.Sabdar@Sun.COM 	(void) setlocale(LC_ALL, "");
7167917SReza.Sabdar@Sun.COM 	(void) textdomain(TEXT_DOMAIN);
7177917SReza.Sabdar@Sun.COM 
7187917SReza.Sabdar@Sun.COM 	opterr = 0;
7197917SReza.Sabdar@Sun.COM 
7207917SReza.Sabdar@Sun.COM 	/* Make sure the user has specified some command. */
7217917SReza.Sabdar@Sun.COM 	if (argc < 2) {
7227917SReza.Sabdar@Sun.COM 		(void) fprintf(stderr, gettext("Missing command.\n"));
7237917SReza.Sabdar@Sun.COM 		usage(B_FALSE, current_command);
7247917SReza.Sabdar@Sun.COM 	}
7257917SReza.Sabdar@Sun.COM 
7267917SReza.Sabdar@Sun.COM 	cmdname = argv[1];
7277917SReza.Sabdar@Sun.COM 
7287917SReza.Sabdar@Sun.COM 	/*
7297917SReza.Sabdar@Sun.COM 	 * Special case '-?'
7307917SReza.Sabdar@Sun.COM 	 */
7317917SReza.Sabdar@Sun.COM 	if (strcmp(cmdname, "-?") == 0)
7327917SReza.Sabdar@Sun.COM 		usage(B_TRUE, current_command);
7337917SReza.Sabdar@Sun.COM 
7347917SReza.Sabdar@Sun.COM 	/*
7357917SReza.Sabdar@Sun.COM 	 * Run the appropriate sub-command.
7367917SReza.Sabdar@Sun.COM 	 */
7377917SReza.Sabdar@Sun.COM 	for (i = 0; i < NCOMMAND; i++) {
7387917SReza.Sabdar@Sun.COM 		if (strcmp(cmdname, command_table[i].nc_name) == 0) {
7397917SReza.Sabdar@Sun.COM 			current_command = &command_table[i];
7407917SReza.Sabdar@Sun.COM 			ret = command_table[i].func(argc - 1, argv + 1,
7417917SReza.Sabdar@Sun.COM 			    current_command);
7427917SReza.Sabdar@Sun.COM 			break;
7437917SReza.Sabdar@Sun.COM 		}
7447917SReza.Sabdar@Sun.COM 	}
7457917SReza.Sabdar@Sun.COM 
7467917SReza.Sabdar@Sun.COM 	if (i == NCOMMAND) {
7477917SReza.Sabdar@Sun.COM 		(void) fprintf(stderr, gettext("Unrecognized "
7487917SReza.Sabdar@Sun.COM 		    "command '%s'\n"), cmdname);
7497917SReza.Sabdar@Sun.COM 		usage(B_FALSE, current_command);
7507917SReza.Sabdar@Sun.COM 	}
7517917SReza.Sabdar@Sun.COM 
7527917SReza.Sabdar@Sun.COM 	return (ret);
7537917SReza.Sabdar@Sun.COM }
754