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