xref: /onnv-gate/usr/src/cmd/iscsitsvc/iscsitsvc.c (revision 7978:4559e57ec313)
1*7978SPeter.Dunlap@Sun.COM /*
2*7978SPeter.Dunlap@Sun.COM  * CDDL HEADER START
3*7978SPeter.Dunlap@Sun.COM  *
4*7978SPeter.Dunlap@Sun.COM  * The contents of this file are subject to the terms of the
5*7978SPeter.Dunlap@Sun.COM  * Common Development and Distribution License (the "License").
6*7978SPeter.Dunlap@Sun.COM  * You may not use this file except in compliance with the License.
7*7978SPeter.Dunlap@Sun.COM  *
8*7978SPeter.Dunlap@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*7978SPeter.Dunlap@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*7978SPeter.Dunlap@Sun.COM  * See the License for the specific language governing permissions
11*7978SPeter.Dunlap@Sun.COM  * and limitations under the License.
12*7978SPeter.Dunlap@Sun.COM  *
13*7978SPeter.Dunlap@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*7978SPeter.Dunlap@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*7978SPeter.Dunlap@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*7978SPeter.Dunlap@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*7978SPeter.Dunlap@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*7978SPeter.Dunlap@Sun.COM  *
19*7978SPeter.Dunlap@Sun.COM  * CDDL HEADER END
20*7978SPeter.Dunlap@Sun.COM  */
21*7978SPeter.Dunlap@Sun.COM /*
22*7978SPeter.Dunlap@Sun.COM  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23*7978SPeter.Dunlap@Sun.COM  * Use is subject to license terms.
24*7978SPeter.Dunlap@Sun.COM  */
25*7978SPeter.Dunlap@Sun.COM 
26*7978SPeter.Dunlap@Sun.COM #include <stdlib.h>
27*7978SPeter.Dunlap@Sun.COM #include <stdio.h>
28*7978SPeter.Dunlap@Sun.COM #include <strings.h>
29*7978SPeter.Dunlap@Sun.COM #include <sys/types.h>
30*7978SPeter.Dunlap@Sun.COM #include <unistd.h>
31*7978SPeter.Dunlap@Sun.COM #include <stropts.h>
32*7978SPeter.Dunlap@Sun.COM #include <libintl.h>
33*7978SPeter.Dunlap@Sun.COM #include <errno.h>
34*7978SPeter.Dunlap@Sun.COM #include <time.h>
35*7978SPeter.Dunlap@Sun.COM #include <string.h>
36*7978SPeter.Dunlap@Sun.COM #include <assert.h>
37*7978SPeter.Dunlap@Sun.COM #include <getopt.h>
38*7978SPeter.Dunlap@Sun.COM #include <cmdparse.h>
39*7978SPeter.Dunlap@Sun.COM #include <signal.h>
40*7978SPeter.Dunlap@Sun.COM #include <pthread.h>
41*7978SPeter.Dunlap@Sun.COM #include <fcntl.h>
42*7978SPeter.Dunlap@Sun.COM #include <locale.h>
43*7978SPeter.Dunlap@Sun.COM #include <sys/systeminfo.h>
44*7978SPeter.Dunlap@Sun.COM 
45*7978SPeter.Dunlap@Sun.COM #include <libiscsit.h>
46*7978SPeter.Dunlap@Sun.COM #include <sys/iscsit/iscsit_common.h>
47*7978SPeter.Dunlap@Sun.COM 
48*7978SPeter.Dunlap@Sun.COM static int it_enable(int, char **, cmdOptions_t *, void *);
49*7978SPeter.Dunlap@Sun.COM static int it_disable(int, char **, cmdOptions_t *, void *);
50*7978SPeter.Dunlap@Sun.COM 
51*7978SPeter.Dunlap@Sun.COM /*
52*7978SPeter.Dunlap@Sun.COM  *  MAJOR - This should only change when there is an incompatible change made
53*7978SPeter.Dunlap@Sun.COM  *  to the interfaces or the output.
54*7978SPeter.Dunlap@Sun.COM  *
55*7978SPeter.Dunlap@Sun.COM  *  MINOR - This should change whenever there is a new command or new feature
56*7978SPeter.Dunlap@Sun.COM  *  with no incompatible change.
57*7978SPeter.Dunlap@Sun.COM  */
58*7978SPeter.Dunlap@Sun.COM #define	VERSION_STRING_MAJOR	    "1"
59*7978SPeter.Dunlap@Sun.COM #define	VERSION_STRING_MINOR	    "0"
60*7978SPeter.Dunlap@Sun.COM #define	VERSION_STRING_MAX_LEN	    10
61*7978SPeter.Dunlap@Sun.COM 
62*7978SPeter.Dunlap@Sun.COM /* 10 ms sleep in nanoseconds */
63*7978SPeter.Dunlap@Sun.COM #define	TEN_MS_NANOSLEEP  10000000
64*7978SPeter.Dunlap@Sun.COM 
65*7978SPeter.Dunlap@Sun.COM /* tables set up based on cmdparse instructions */
66*7978SPeter.Dunlap@Sun.COM 
67*7978SPeter.Dunlap@Sun.COM /* add new options here */
68*7978SPeter.Dunlap@Sun.COM optionTbl_t longOptions[] = {
69*7978SPeter.Dunlap@Sun.COM 	{NULL, 0, 0, 0}
70*7978SPeter.Dunlap@Sun.COM };
71*7978SPeter.Dunlap@Sun.COM 
72*7978SPeter.Dunlap@Sun.COM /*
73*7978SPeter.Dunlap@Sun.COM  * Add new subcommands here
74*7978SPeter.Dunlap@Sun.COM  */
75*7978SPeter.Dunlap@Sun.COM subCommandProps_t subcommands[] = {
76*7978SPeter.Dunlap@Sun.COM 	{"start", it_enable, NULL, NULL, NULL, OPERAND_NONE, NULL},
77*7978SPeter.Dunlap@Sun.COM 	{"stop", it_disable, NULL, NULL, NULL, OPERAND_NONE, NULL},
78*7978SPeter.Dunlap@Sun.COM 	{NULL, 0, NULL, NULL, 0, NULL, 0, NULL}
79*7978SPeter.Dunlap@Sun.COM };
80*7978SPeter.Dunlap@Sun.COM 
81*7978SPeter.Dunlap@Sun.COM /* globals */
82*7978SPeter.Dunlap@Sun.COM char *cmdName;
83*7978SPeter.Dunlap@Sun.COM 
84*7978SPeter.Dunlap@Sun.COM /*
85*7978SPeter.Dunlap@Sun.COM  * Opens the iSCSI Target Node
86*7978SPeter.Dunlap@Sun.COM  *
87*7978SPeter.Dunlap@Sun.COM  * fd - Return the iscsit file descriptor
88*7978SPeter.Dunlap@Sun.COM  */
89*7978SPeter.Dunlap@Sun.COM static int
it_open(int * fd)90*7978SPeter.Dunlap@Sun.COM it_open(int *fd)
91*7978SPeter.Dunlap@Sun.COM {
92*7978SPeter.Dunlap@Sun.COM 
93*7978SPeter.Dunlap@Sun.COM 	int ret = ITADM_SUCCESS;
94*7978SPeter.Dunlap@Sun.COM 
95*7978SPeter.Dunlap@Sun.COM 	*fd = open(ISCSIT_NODE, O_RDONLY);
96*7978SPeter.Dunlap@Sun.COM 	if (*fd < 0) {
97*7978SPeter.Dunlap@Sun.COM 		if (errno == EPERM) {
98*7978SPeter.Dunlap@Sun.COM 			(void) fprintf(stdout, "open failed: EPERM");
99*7978SPeter.Dunlap@Sun.COM 			ret = ITADM_PERM;
100*7978SPeter.Dunlap@Sun.COM 		} else {
101*7978SPeter.Dunlap@Sun.COM 			(void) fprintf(stdout, "open failed: INVALID");
102*7978SPeter.Dunlap@Sun.COM 			ret = ITADM_INVALID;
103*7978SPeter.Dunlap@Sun.COM 		}
104*7978SPeter.Dunlap@Sun.COM 	}
105*7978SPeter.Dunlap@Sun.COM 
106*7978SPeter.Dunlap@Sun.COM 	return (ret);
107*7978SPeter.Dunlap@Sun.COM }
108*7978SPeter.Dunlap@Sun.COM 
109*7978SPeter.Dunlap@Sun.COM /*
110*7978SPeter.Dunlap@Sun.COM  * Enables the iSCSI Target
111*7978SPeter.Dunlap@Sun.COM  */
112*7978SPeter.Dunlap@Sun.COM /*ARGSUSED*/
113*7978SPeter.Dunlap@Sun.COM static int
it_enable(int operandLen,char * operands[],cmdOptions_t * options,void * args)114*7978SPeter.Dunlap@Sun.COM it_enable(int operandLen, char *operands[], cmdOptions_t *options,
115*7978SPeter.Dunlap@Sun.COM     void *args)
116*7978SPeter.Dunlap@Sun.COM {
117*7978SPeter.Dunlap@Sun.COM 	int	ret;
118*7978SPeter.Dunlap@Sun.COM 	int	fd;
119*7978SPeter.Dunlap@Sun.COM 	char	buf[256];
120*7978SPeter.Dunlap@Sun.COM 	uint32_t *buflenp;
121*7978SPeter.Dunlap@Sun.COM 	char	*fqhnp;
122*7978SPeter.Dunlap@Sun.COM 	iscsit_hostinfo_t hostinfo;
123*7978SPeter.Dunlap@Sun.COM 
124*7978SPeter.Dunlap@Sun.COM 	(void) fprintf(stdout, "%s: %s\n", cmdName,
125*7978SPeter.Dunlap@Sun.COM 	    gettext("Requesting to enable iscsi target"));
126*7978SPeter.Dunlap@Sun.COM 
127*7978SPeter.Dunlap@Sun.COM 	bzero(buf, 256);
128*7978SPeter.Dunlap@Sun.COM 	bzero(hostinfo.fqhn, sizeof (hostinfo.fqhn));
129*7978SPeter.Dunlap@Sun.COM 
130*7978SPeter.Dunlap@Sun.COM 	/* Open the iscsi target node */
131*7978SPeter.Dunlap@Sun.COM 	if ((ret = it_open(&fd)) != ITADM_SUCCESS) {
132*7978SPeter.Dunlap@Sun.COM 		(void) fprintf(stdout, "Unable to open device %s", ISCSIT_NODE);
133*7978SPeter.Dunlap@Sun.COM 		return (ret);
134*7978SPeter.Dunlap@Sun.COM 	}
135*7978SPeter.Dunlap@Sun.COM 
136*7978SPeter.Dunlap@Sun.COM 	(void) fprintf(stdout, "it_enable [fd=%d]\n", fd);
137*7978SPeter.Dunlap@Sun.COM 	/* enable the iscsi target */
138*7978SPeter.Dunlap@Sun.COM 	buflenp = (uint32_t *)((void *)&buf);
139*7978SPeter.Dunlap@Sun.COM 	*buflenp = strlen("target_name") + 1;
140*7978SPeter.Dunlap@Sun.COM 	(void) strncpy(buf + sizeof (uint32_t), "target_name",
141*7978SPeter.Dunlap@Sun.COM 	    256 - sizeof (uint32_t));
142*7978SPeter.Dunlap@Sun.COM 
143*7978SPeter.Dunlap@Sun.COM 	fqhnp = &hostinfo.fqhn[0];
144*7978SPeter.Dunlap@Sun.COM 
145*7978SPeter.Dunlap@Sun.COM 	ret = sysinfo(SI_HOSTNAME, fqhnp, 256);
146*7978SPeter.Dunlap@Sun.COM 
147*7978SPeter.Dunlap@Sun.COM 	if ((ret != -1) && (ret < sizeof (hostinfo.fqhn))) {
148*7978SPeter.Dunlap@Sun.COM 		fqhnp += ret;
149*7978SPeter.Dunlap@Sun.COM 		hostinfo.length = ret;
150*7978SPeter.Dunlap@Sun.COM 		hostinfo.fqhn[ret-1] = '.';
151*7978SPeter.Dunlap@Sun.COM 		hostinfo.length += sysinfo(SI_SRPC_DOMAIN, fqhnp,
152*7978SPeter.Dunlap@Sun.COM 		    sizeof (hostinfo.fqhn) - ret);
153*7978SPeter.Dunlap@Sun.COM 	}
154*7978SPeter.Dunlap@Sun.COM 
155*7978SPeter.Dunlap@Sun.COM 	(void) fprintf(stdout, "it_enable: fqhn = '%s'\n", hostinfo.fqhn);
156*7978SPeter.Dunlap@Sun.COM 
157*7978SPeter.Dunlap@Sun.COM 	if ((ret = ioctl(fd, ISCSIT_IOC_ENABLE_SVC, &hostinfo)) != 0) {
158*7978SPeter.Dunlap@Sun.COM 		(void) fprintf(stdout, "Unable to issue ioctl: %d", errno);
159*7978SPeter.Dunlap@Sun.COM 		return (ret);
160*7978SPeter.Dunlap@Sun.COM 	}
161*7978SPeter.Dunlap@Sun.COM 	return (ITADM_SUCCESS);
162*7978SPeter.Dunlap@Sun.COM }
163*7978SPeter.Dunlap@Sun.COM 
164*7978SPeter.Dunlap@Sun.COM 
165*7978SPeter.Dunlap@Sun.COM /*
166*7978SPeter.Dunlap@Sun.COM  * Disable the iSCSI target
167*7978SPeter.Dunlap@Sun.COM  */
168*7978SPeter.Dunlap@Sun.COM /* ARGSUSED */
169*7978SPeter.Dunlap@Sun.COM static int
it_disable(int operandLen,char * operands[],cmdOptions_t * options,void * args)170*7978SPeter.Dunlap@Sun.COM it_disable(int operandLen, char *operands[], cmdOptions_t *options,
171*7978SPeter.Dunlap@Sun.COM     void *args)
172*7978SPeter.Dunlap@Sun.COM {
173*7978SPeter.Dunlap@Sun.COM 	int	ret;
174*7978SPeter.Dunlap@Sun.COM 	int	fd;
175*7978SPeter.Dunlap@Sun.COM 
176*7978SPeter.Dunlap@Sun.COM 	(void) fprintf(stdout, "%s: %s\n", cmdName,
177*7978SPeter.Dunlap@Sun.COM 	    gettext("Requesting to disable iscsi target"));
178*7978SPeter.Dunlap@Sun.COM 
179*7978SPeter.Dunlap@Sun.COM 	/* Open the iscsi target node */
180*7978SPeter.Dunlap@Sun.COM 	if ((ret = it_open(&fd)) != ITADM_SUCCESS) {
181*7978SPeter.Dunlap@Sun.COM 		return (ret);
182*7978SPeter.Dunlap@Sun.COM 	}
183*7978SPeter.Dunlap@Sun.COM 
184*7978SPeter.Dunlap@Sun.COM 	/* disable the iSCSI target */
185*7978SPeter.Dunlap@Sun.COM 	if ((ret = ioctl(fd, ISCSIT_IOC_DISABLE_SVC, NULL)) != 0) {
186*7978SPeter.Dunlap@Sun.COM 		return (ret);
187*7978SPeter.Dunlap@Sun.COM 	}
188*7978SPeter.Dunlap@Sun.COM 	return (ITADM_SUCCESS);
189*7978SPeter.Dunlap@Sun.COM }
190*7978SPeter.Dunlap@Sun.COM 
191*7978SPeter.Dunlap@Sun.COM /*
192*7978SPeter.Dunlap@Sun.COM  * input:
193*7978SPeter.Dunlap@Sun.COM  *  execFullName - exec name of program (argv[0])
194*7978SPeter.Dunlap@Sun.COM  *
195*7978SPeter.Dunlap@Sun.COM  *  copied from usr/src/cmd/zoneadm/zoneadm.c in OS/Net
196*7978SPeter.Dunlap@Sun.COM  *  (changed name to lowerCamelCase to keep consistent with this file)
197*7978SPeter.Dunlap@Sun.COM  *
198*7978SPeter.Dunlap@Sun.COM  * Returns:
199*7978SPeter.Dunlap@Sun.COM  *  command name portion of execFullName
200*7978SPeter.Dunlap@Sun.COM  */
201*7978SPeter.Dunlap@Sun.COM static char *
getExecBasename(char * execFullname)202*7978SPeter.Dunlap@Sun.COM getExecBasename(char *execFullname)
203*7978SPeter.Dunlap@Sun.COM {
204*7978SPeter.Dunlap@Sun.COM 	char *lastSlash, *execBasename;
205*7978SPeter.Dunlap@Sun.COM 
206*7978SPeter.Dunlap@Sun.COM 	/* guard against '/' at end of command invocation */
207*7978SPeter.Dunlap@Sun.COM 	for (;;) {
208*7978SPeter.Dunlap@Sun.COM 		lastSlash = strrchr(execFullname, '/');
209*7978SPeter.Dunlap@Sun.COM 		if (lastSlash == NULL) {
210*7978SPeter.Dunlap@Sun.COM 			execBasename = execFullname;
211*7978SPeter.Dunlap@Sun.COM 			break;
212*7978SPeter.Dunlap@Sun.COM 		} else {
213*7978SPeter.Dunlap@Sun.COM 			execBasename = lastSlash + 1;
214*7978SPeter.Dunlap@Sun.COM 			if (*execBasename == '\0') {
215*7978SPeter.Dunlap@Sun.COM 				*lastSlash = '\0';
216*7978SPeter.Dunlap@Sun.COM 				continue;
217*7978SPeter.Dunlap@Sun.COM 			}
218*7978SPeter.Dunlap@Sun.COM 			break;
219*7978SPeter.Dunlap@Sun.COM 		}
220*7978SPeter.Dunlap@Sun.COM 	}
221*7978SPeter.Dunlap@Sun.COM 	return (execBasename);
222*7978SPeter.Dunlap@Sun.COM }
223*7978SPeter.Dunlap@Sun.COM 
224*7978SPeter.Dunlap@Sun.COM int
main(int argc,char * argv[])225*7978SPeter.Dunlap@Sun.COM main(int argc, char *argv[])
226*7978SPeter.Dunlap@Sun.COM {
227*7978SPeter.Dunlap@Sun.COM 	synTables_t synTables;
228*7978SPeter.Dunlap@Sun.COM 	char versionString[VERSION_STRING_MAX_LEN];
229*7978SPeter.Dunlap@Sun.COM 	int ret;
230*7978SPeter.Dunlap@Sun.COM 	int funcRet;
231*7978SPeter.Dunlap@Sun.COM 	void *subcommandArgs = NULL;
232*7978SPeter.Dunlap@Sun.COM 
233*7978SPeter.Dunlap@Sun.COM 	(void) setlocale(LC_ALL, "");
234*7978SPeter.Dunlap@Sun.COM 	/* set global command name */
235*7978SPeter.Dunlap@Sun.COM 	cmdName = getExecBasename(argv[0]);
236*7978SPeter.Dunlap@Sun.COM 
237*7978SPeter.Dunlap@Sun.COM 	(void) snprintf(versionString, VERSION_STRING_MAX_LEN, "%s.%s",
238*7978SPeter.Dunlap@Sun.COM 	    VERSION_STRING_MAJOR, VERSION_STRING_MINOR);
239*7978SPeter.Dunlap@Sun.COM 	synTables.versionString = versionString;
240*7978SPeter.Dunlap@Sun.COM 	synTables.longOptionTbl = &longOptions[0];
241*7978SPeter.Dunlap@Sun.COM 	synTables.subCommandPropsTbl = &subcommands[0];
242*7978SPeter.Dunlap@Sun.COM 
243*7978SPeter.Dunlap@Sun.COM 	ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet);
244*7978SPeter.Dunlap@Sun.COM 	if (ret != 0) {
245*7978SPeter.Dunlap@Sun.COM 		return (ret);
246*7978SPeter.Dunlap@Sun.COM 	}
247*7978SPeter.Dunlap@Sun.COM 
248*7978SPeter.Dunlap@Sun.COM 	return (funcRet);
249*7978SPeter.Dunlap@Sun.COM } /* end main */
250