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