1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <strings.h>
29 #include <sys/types.h>
30 #include <unistd.h>
31 #include <wchar.h>
32 #include <libintl.h>
33 #include <errno.h>
34 #include <time.h>
35 #include <string.h>
36 #include <assert.h>
37 #include <getopt.h>
38 #include <cmdparse.h>
39 #include <libstmf.h>
40 #include <signal.h>
41 #include <pthread.h>
42 #include <locale.h>
43
44 static char *getExecBasename(char *);
45 static int setLuStandbyFunc(int, char **, cmdOptions_t *, void *);
46 static int disableAluaFunc(int, char **, cmdOptions_t *, void *);
47 static int enableAluaFunc(int, char **, cmdOptions_t *, void *);
48
49 #define OPERANDSTRING_LU "LU-name"
50 #define OPERANDSTRING_NODE_ID "node ID (0 or 1)"
51
52 #define VERSION_STRING_MAJOR "1"
53 #define VERSION_STRING_MINOR "0"
54 #define VERSION_STRING_MAX_LEN 10
55
56 #define GUID_INPUT 32
57
58 /* tables set up based on cmdparse instructions */
59
60 /* add new options here */
61 optionTbl_t longOptions[] = {
62 {NULL, 0, 0, 0}
63 };
64
65 /*
66 * Add new subcommands here
67 */
68 subCommandProps_t subcommands[] = {
69 {"standby", setLuStandbyFunc, NULL, NULL, NULL,
70 OPERAND_MANDATORY_SINGLE, OPERANDSTRING_LU, NULL},
71 {"disable", disableAluaFunc, NULL, NULL, NULL,
72 OPERAND_NONE, NULL, NULL},
73 {"enable", enableAluaFunc, NULL, NULL, NULL,
74 OPERAND_MANDATORY_SINGLE, OPERANDSTRING_NODE_ID, NULL},
75 {NULL, 0, NULL, NULL, 0, NULL, 0, NULL, NULL}
76 };
77
78 /* globals */
79 char *cmdName;
80
81 /*
82 * setLuStandbyFunc
83 *
84 * Purpose: set lu to standby
85 *
86 */
87 /*ARGSUSED*/
88 static int
setLuStandbyFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)89 setLuStandbyFunc(int operandLen, char *operands[], cmdOptions_t *options,
90 void *args)
91 {
92 char sGuid[GUID_INPUT + 1];
93 stmfGuid inGuid;
94 unsigned int guid[sizeof (stmfGuid)];
95 int i;
96 int ret = 0;
97
98 if (strlen(operands[0]) != GUID_INPUT) {
99 (void) fprintf(stderr, "%s: %s: %s %d %s\n", cmdName,
100 operands[0], gettext("must be"), GUID_INPUT,
101 gettext("hexadecimal digits long"));
102 return (1);
103 }
104
105 bcopy(operands[0], sGuid, GUID_INPUT);
106
107 for (i = 0; i < GUID_INPUT; i++)
108 sGuid[i] = tolower(sGuid[i]);
109 sGuid[i] = 0;
110
111 (void) sscanf(sGuid, "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
112 &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5],
113 &guid[6], &guid[7], &guid[8], &guid[9], &guid[10], &guid[11],
114 &guid[12], &guid[13], &guid[14], &guid[15]);
115
116 for (i = 0; i < sizeof (stmfGuid); i++) {
117 inGuid.guid[i] = guid[i];
118 }
119
120 ret = stmfLuStandby(&inGuid);
121 if (ret != STMF_STATUS_SUCCESS) {
122 switch (ret) {
123 case STMF_ERROR_PERM:
124 (void) fprintf(stderr, "%s: %s\n", cmdName,
125 gettext("permission denied"));
126 break;
127 case STMF_ERROR_SERVICE_NOT_FOUND:
128 (void) fprintf(stderr, "%s: %s\n", cmdName,
129 gettext("STMF service not found"));
130 break;
131 case STMF_ERROR_NOT_FOUND:
132 (void) fprintf(stderr, "%s: %s: %s\n", cmdName,
133 operands[0], gettext("not found"));
134 break;
135 case STMF_ERROR_SERVICE_DATA_VERSION:
136 (void) fprintf(stderr, "%s: %s\n", cmdName,
137 gettext("STMF service version incorrect"));
138 break;
139 default:
140 (void) fprintf(stderr, "%s: %s\n", cmdName,
141 gettext("unknown error"));
142 break;
143 }
144 }
145 return (ret);
146 }
147
148 /*
149 * disableAluaFunc
150 *
151 * Purpose: disable alua mode
152 *
153 */
154 /*ARGSUSED*/
155 static int
disableAluaFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)156 disableAluaFunc(int operandLen, char *operands[], cmdOptions_t *options,
157 void *args)
158 {
159 return (stmfSetAluaState(B_FALSE, 0));
160 }
161
162 /*
163 * enableAluaFunc
164 *
165 * Purpose: enable alua mode
166 *
167 */
168 /*ARGSUSED*/
169 static int
enableAluaFunc(int operandLen,char * operands[],cmdOptions_t * options,void * args)170 enableAluaFunc(int operandLen, char *operands[], cmdOptions_t *options,
171 void *args)
172 {
173 uint8_t node_id = 0;
174 if (operands[0][0] == '1') {
175 node_id = 1;
176 }
177 return (stmfSetAluaState(B_TRUE, node_id));
178 }
179
180
181 /*
182 * input:
183 * execFullName - exec name of program (argv[0])
184 *
185 * copied from usr/src/cmd/zoneadm/zoneadm.c in OS/Net
186 * (changed name to lowerCamelCase to keep consistent with this file)
187 *
188 * Returns:
189 * command name portion of execFullName
190 */
191 static char *
getExecBasename(char * execFullname)192 getExecBasename(char *execFullname)
193 {
194 char *lastSlash, *execBasename;
195
196 /* guard against '/' at end of command invocation */
197 for (;;) {
198 lastSlash = strrchr(execFullname, '/');
199 if (lastSlash == NULL) {
200 execBasename = execFullname;
201 break;
202 } else {
203 execBasename = lastSlash + 1;
204 if (*execBasename == '\0') {
205 *lastSlash = '\0';
206 continue;
207 }
208 break;
209 }
210 }
211 return (execBasename);
212 }
213
214 int
main(int argc,char * argv[])215 main(int argc, char *argv[])
216 {
217 synTables_t synTables;
218 char versionString[VERSION_STRING_MAX_LEN];
219 int ret;
220 int funcRet;
221 void *subcommandArgs = NULL;
222
223 (void) setlocale(LC_ALL, "");
224 (void) textdomain(TEXT_DOMAIN);
225 /* set global command name */
226 cmdName = getExecBasename(argv[0]);
227
228 (void) snprintf(versionString, VERSION_STRING_MAX_LEN, "%s.%s",
229 VERSION_STRING_MAJOR, VERSION_STRING_MINOR);
230 synTables.versionString = versionString;
231 synTables.longOptionTbl = &longOptions[0];
232 synTables.subCommandPropsTbl = &subcommands[0];
233
234 ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet);
235 if (ret != 0) {
236 return (ret);
237 }
238
239 return (funcRet);
240 } /* end main */
241