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