16185db85Sdougm /*
26185db85Sdougm  * CDDL HEADER START
36185db85Sdougm  *
46185db85Sdougm  * The contents of this file are subject to the terms of the
56185db85Sdougm  * Common Development and Distribution License (the "License").
66185db85Sdougm  * You may not use this file except in compliance with the License.
76185db85Sdougm  *
86185db85Sdougm  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96185db85Sdougm  * or http://www.opensolaris.org/os/licensing.
106185db85Sdougm  * See the License for the specific language governing permissions
116185db85Sdougm  * and limitations under the License.
126185db85Sdougm  *
136185db85Sdougm  * When distributing Covered Code, include this CDDL HEADER in each
146185db85Sdougm  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156185db85Sdougm  * If applicable, add the following below this CDDL HEADER, with the
166185db85Sdougm  * fields enclosed by brackets "[]" replaced with your own identifying
176185db85Sdougm  * information: Portions Copyright [yyyy] [name of copyright owner]
186185db85Sdougm  *
196185db85Sdougm  * CDDL HEADER END
206185db85Sdougm  */
216185db85Sdougm 
226185db85Sdougm /*
23549ec3ffSdougm  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
246185db85Sdougm  * Use is subject to license terms.
256185db85Sdougm  */
266185db85Sdougm 
276185db85Sdougm #pragma ident	"%Z%%M%	%I%	%E% SMI"
286185db85Sdougm 
296185db85Sdougm #include <stdlib.h>
306185db85Sdougm #include <stdio.h>
316185db85Sdougm #include <string.h>
326185db85Sdougm #include <ctype.h>
336185db85Sdougm #include <unistd.h>
346185db85Sdougm #include <getopt.h>
356185db85Sdougm #include <libgen.h>
366185db85Sdougm 
376185db85Sdougm #include <libshare.h>
386185db85Sdougm #include "sharemgr.h"
396185db85Sdougm #include <libintl.h>
406185db85Sdougm #include <locale.h>
416185db85Sdougm 
426185db85Sdougm char *protocol = NULL;
436185db85Sdougm static int help = 0;
446185db85Sdougm 
45549ec3ffSdougm static int run_command(char *, int, char **, char *, sa_handle_t);
466185db85Sdougm extern sa_command_t *sa_lookup(char *, char *);
476185db85Sdougm extern void sub_command_help(char *proto);
486185db85Sdougm 
496185db85Sdougm static void
506185db85Sdougm global_help()
516185db85Sdougm {
526185db85Sdougm 	(void) printf(gettext("usage: sharemgr [-h | <command> [options]]\n"));
536185db85Sdougm 	sub_command_help(NULL);
546185db85Sdougm }
556185db85Sdougm 
566185db85Sdougm int
576185db85Sdougm main(int argc, char *argv[])
586185db85Sdougm {
596185db85Sdougm 	int c;
606185db85Sdougm 	int rval;
616185db85Sdougm 	char *command = NULL;
62549ec3ffSdougm 	sa_handle_t handle;
636185db85Sdougm 
646185db85Sdougm 	/*
656185db85Sdougm 	 * make sure locale and gettext domain is setup
666185db85Sdougm 	 */
676185db85Sdougm 	(void) setlocale(LC_ALL, "");
686185db85Sdougm 	(void) textdomain(TEXT_DOMAIN);
696185db85Sdougm 
706185db85Sdougm 	/*
716185db85Sdougm 	 * parse enough of command line to get protocol, if any.
726185db85Sdougm 	 * Note that options need to come "after" the subcommand.
736185db85Sdougm 	 */
746185db85Sdougm 	command = basename(argv[0]);
756185db85Sdougm 	if (strcmp(command, "share") != 0 && strcmp(command, "unshare") != 0) {
76*25a68471Sdougm 		while ((c = getopt(argc, argv, "h?")) != EOF) {
77*25a68471Sdougm 			switch (c) {
78*25a68471Sdougm 			default:
79*25a68471Sdougm 			case 'h':
80*25a68471Sdougm 			case '?':
81*25a68471Sdougm 				help = 1;
82*25a68471Sdougm 				break;
83*25a68471Sdougm 			}
846185db85Sdougm 		}
85*25a68471Sdougm 		if (argc == 1)
86*25a68471Sdougm 			help = 1;
876185db85Sdougm 	}
886185db85Sdougm 
896185db85Sdougm 	if (strcmp(command, "sharemgr") == 0) {
90*25a68471Sdougm 		command = argv[optind];
91*25a68471Sdougm 		argv++;
92*25a68471Sdougm 		argc--;
936185db85Sdougm 	}
946185db85Sdougm 
956185db85Sdougm 	if (help) {
966185db85Sdougm 		/* no subcommand */
976185db85Sdougm 		global_help();
986185db85Sdougm 		exit(SA_OK);
996185db85Sdougm 	}
1006185db85Sdougm 
1016185db85Sdougm 	/*
1026185db85Sdougm 	 * now have enough to parse rest of command line
1037d968cb8Sdougm 	 *
1047d968cb8Sdougm 	 * First, initialize the plugin architecture.
1057d968cb8Sdougm 	 * Plugins are needed in the event of a global help
1067d968cb8Sdougm 	 * request.
1077d968cb8Sdougm 	 *
1087d968cb8Sdougm 	 * reset optind to 1 so the parsing that takes place in
1097d968cb8Sdougm 	 * sa_init() will work correctly.
1107d968cb8Sdougm 	 */
1117d968cb8Sdougm 
1127d968cb8Sdougm 	optind = 1;
113549ec3ffSdougm 	handle = sa_init(SA_INIT_SHARE_API);
1147d968cb8Sdougm 
1157d968cb8Sdougm 	/*
1167d968cb8Sdougm 	 * reset optind again since we will start parsing all over in
1177d968cb8Sdougm 	 * the sub-commands.
1186185db85Sdougm 	 */
1197d968cb8Sdougm 	optind = 1;
120549ec3ffSdougm 	rval = run_command(command, argc, argv, protocol, handle);
1216185db85Sdougm 
122549ec3ffSdougm 	sa_fini(handle);
1236185db85Sdougm 	return (rval);
1246185db85Sdougm }
1256185db85Sdougm 
1266185db85Sdougm static int
127549ec3ffSdougm run_command(char *command, int argc, char *argv[], char *proto,
128549ec3ffSdougm 		sa_handle_t handle)
1296185db85Sdougm {
1306185db85Sdougm 	sa_command_t *cmdvec;
1316185db85Sdougm 	int ret;
1326185db85Sdougm 
1336185db85Sdougm 	/*
1346185db85Sdougm 	 * To get here, we know there should be a command due to the
1356185db85Sdougm 	 * preprocessing done earlier.  Need to find the protocol
1366185db85Sdougm 	 * that is being affected. If no protocol, then it is ALL
1376185db85Sdougm 	 * protocols.
1386185db85Sdougm 	 *
1396185db85Sdougm 	 * We don't currently use the protocol here at this point. It
1406185db85Sdougm 	 * is left in as a placeholder for the future addition of
1416185db85Sdougm 	 * protocol specific sub-commands.
1426185db85Sdougm 	 *
1436185db85Sdougm 	 * Known sub-commands are handled at this level. An unknown
1446185db85Sdougm 	 * command will be passed down to the shared object that
1456185db85Sdougm 	 * actually implements it. We can do this since the semantics
1466185db85Sdougm 	 * of the common sub-commands is well defined.
1476185db85Sdougm 	 */
1486185db85Sdougm 
1496185db85Sdougm 	cmdvec = sa_lookup(command, proto);
1506185db85Sdougm 	if (cmdvec == NULL) {
1516185db85Sdougm 		(void) printf(gettext("command %s not found\n"), command);
1526185db85Sdougm 		exit(1);
1536185db85Sdougm 	}
1546185db85Sdougm 	/*
1556185db85Sdougm 	 * need to check priviledges and restrict what can be done
1566185db85Sdougm 	 * based on least priviledge and sub-command so pass this in
1576185db85Sdougm 	 * as a flag.
1586185db85Sdougm 	 */
159549ec3ffSdougm 	ret = cmdvec->cmdfunc(handle, cmdvec->priv, argc, argv);
1606185db85Sdougm 	return (ret);
1616185db85Sdougm }
162