1fcf3ce44SJohn Forte /*
2fcf3ce44SJohn Forte * CDDL HEADER START
3fcf3ce44SJohn Forte *
4fcf3ce44SJohn Forte * The contents of this file are subject to the terms of the
5fcf3ce44SJohn Forte * Common Development and Distribution License (the "License").
6fcf3ce44SJohn Forte * You may not use this file except in compliance with the License.
7fcf3ce44SJohn Forte *
8fcf3ce44SJohn Forte * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9fcf3ce44SJohn Forte * or http://www.opensolaris.org/os/licensing.
10fcf3ce44SJohn Forte * See the License for the specific language governing permissions
11fcf3ce44SJohn Forte * and limitations under the License.
12fcf3ce44SJohn Forte *
13fcf3ce44SJohn Forte * When distributing Covered Code, include this CDDL HEADER in each
14fcf3ce44SJohn Forte * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15fcf3ce44SJohn Forte * If applicable, add the following below this CDDL HEADER, with the
16fcf3ce44SJohn Forte * fields enclosed by brackets "[]" replaced with your own identifying
17fcf3ce44SJohn Forte * information: Portions Copyright [yyyy] [name of copyright owner]
18fcf3ce44SJohn Forte *
19fcf3ce44SJohn Forte * CDDL HEADER END
20fcf3ce44SJohn Forte */
21fcf3ce44SJohn Forte /*
227b506e25Ssrivijitha dugganapalli * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23fcf3ce44SJohn Forte * Use is subject to license terms.
2433f5ff17SMilan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
25bc54f855SJohn Levon * Copyright (c) 2018, Joyent, Inc.
26fcf3ce44SJohn Forte */
27fcf3ce44SJohn Forte #include <stdlib.h>
28fcf3ce44SJohn Forte #include <stdio.h>
29fcf3ce44SJohn Forte #include <sys/types.h>
30fcf3ce44SJohn Forte #include <sys/stat.h>
31fcf3ce44SJohn Forte #include <fcntl.h>
32fcf3ce44SJohn Forte #include <unistd.h>
33fcf3ce44SJohn Forte #include <libintl.h>
34fcf3ce44SJohn Forte #include <errno.h>
35fcf3ce44SJohn Forte #include <string.h>
36fcf3ce44SJohn Forte #include <assert.h>
37fcf3ce44SJohn Forte #include <getopt.h>
38fcf3ce44SJohn Forte #include <strings.h>
39fcf3ce44SJohn Forte #include <ctype.h>
40fcf3ce44SJohn Forte #include <libnvpair.h>
418fe96085Stim szeto #include <locale.h>
42fcf3ce44SJohn Forte
43fcf3ce44SJohn Forte #include <cmdparse.h>
44fcf3ce44SJohn Forte #include <sys/stmf_defines.h>
45fcf3ce44SJohn Forte #include <libstmf.h>
46fcf3ce44SJohn Forte #include <sys/stmf_sbd_ioctl.h>
47fcf3ce44SJohn Forte
48fcf3ce44SJohn Forte #define MAX_LU_LIST 8192
49fcf3ce44SJohn Forte #define LU_LIST_MAX_RETRIES 3
508fe96085Stim szeto #define GUID_INPUT 32
51fcf3ce44SJohn Forte
528fe96085Stim szeto #define VERSION_STRING_MAJOR "1"
538fe96085Stim szeto #define VERSION_STRING_MINOR "0"
548fe96085Stim szeto #define VERSION_STRING_MAX_LEN 10
55fcf3ce44SJohn Forte
568fe96085Stim szeto
578fe96085Stim szeto char *cmdName;
588fe96085Stim szeto
598fe96085Stim szeto static char *getExecBasename(char *);
60fcf3ce44SJohn Forte int delete_lu(int argc, char *argv[], cmdOptions_t *options,
61fcf3ce44SJohn Forte void *callData);
62fcf3ce44SJohn Forte int create_lu(int argc, char *argv[], cmdOptions_t *options, void *callData);
63fcf3ce44SJohn Forte int list_lus(int argc, char *argv[], cmdOptions_t *options, void *callData);
64fcf3ce44SJohn Forte int modify_lu(int argc, char *argv[], cmdOptions_t *options, void *callData);
658fe96085Stim szeto int import_lu(int argc, char *argv[], cmdOptions_t *options, void *callData);
668fe96085Stim szeto static int callModify(char *, stmfGuid *, uint32_t, const char *, const char *);
678fe96085Stim szeto int print_lu_attr(stmfGuid *);
68fcf3ce44SJohn Forte void print_guid(uint8_t *g, FILE *f);
69fcf3ce44SJohn Forte void print_attr_header();
70fcf3ce44SJohn Forte
71fcf3ce44SJohn Forte optionTbl_t options[] = {
72fcf3ce44SJohn Forte { "disk-size", required_argument, 's',
73fcf3ce44SJohn Forte "Size with <none>/k/m/g/t/p/e modifier" },
74fcf3ce44SJohn Forte { "keep-views", no_arg, 'k',
75fcf3ce44SJohn Forte "Dont delete view entries related to the LU" },
76fcf3ce44SJohn Forte { NULL, 0, 0 }
77fcf3ce44SJohn Forte };
78fcf3ce44SJohn Forte
79fcf3ce44SJohn Forte subCommandProps_t subCommands[] = {
80fcf3ce44SJohn Forte { "create-lu", create_lu, "s", NULL, NULL,
81fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE,
82fcf3ce44SJohn Forte "Full path of the file to initialize" },
83fcf3ce44SJohn Forte { "delete-lu", delete_lu, "k", NULL, NULL,
84fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE, "GUID of the LU to deregister" },
85fcf3ce44SJohn Forte { "import-lu", import_lu, NULL, NULL, NULL,
86fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE, "filename of the LU to import" },
87fcf3ce44SJohn Forte { "list-lu", list_lus, NULL, NULL, NULL,
88fcf3ce44SJohn Forte OPERAND_NONE, "List all the exported LUs" },
89fcf3ce44SJohn Forte { "modify-lu", modify_lu, "s", "s", NULL,
90fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE,
91fcf3ce44SJohn Forte "Full path of the LU or GUID of a registered LU" },
92*09ece02eSToomas Soome { NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL}
93fcf3ce44SJohn Forte };
94fcf3ce44SJohn Forte
958fe96085Stim szeto /*ARGSUSED*/
96fcf3ce44SJohn Forte int
create_lu(int argc,char * operands[],cmdOptions_t * options,void * callData)978fe96085Stim szeto create_lu(int argc, char *operands[], cmdOptions_t *options, void *callData)
98fcf3ce44SJohn Forte {
998fe96085Stim szeto luResource hdl = NULL;
1008fe96085Stim szeto int ret = 0;
1018fe96085Stim szeto stmfGuid createdGuid;
102fcf3ce44SJohn Forte
1038fe96085Stim szeto ret = stmfCreateLuResource(STMF_DISK, &hdl);
104fcf3ce44SJohn Forte
1058fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
1068fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n",
1078fe96085Stim szeto cmdName, gettext("Failure to create lu resource\n"));
1088fe96085Stim szeto return (1);
1098fe96085Stim szeto }
110fcf3ce44SJohn Forte
1118fe96085Stim szeto for (; options->optval; options++) {
1128fe96085Stim szeto switch (options->optval) {
1138fe96085Stim szeto case 's':
1148fe96085Stim szeto ret = stmfSetLuProp(hdl, STMF_LU_PROP_SIZE,
1158fe96085Stim szeto options->optarg);
1168fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
1178fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n",
1188fe96085Stim szeto cmdName, options->optval,
1198fe96085Stim szeto gettext("size param invalid"));
1208fe96085Stim szeto (void) stmfFreeLuResource(hdl);
1218fe96085Stim szeto return (1);
1228fe96085Stim szeto }
1238fe96085Stim szeto break;
1248fe96085Stim szeto default:
1258fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n",
1268fe96085Stim szeto cmdName, options->optval,
1278fe96085Stim szeto gettext("unknown option"));
128fcf3ce44SJohn Forte return (1);
129fcf3ce44SJohn Forte }
130fcf3ce44SJohn Forte }
131fcf3ce44SJohn Forte
1328fe96085Stim szeto ret = stmfSetLuProp(hdl, STMF_LU_PROP_FILENAME, operands[0]);
133fcf3ce44SJohn Forte
1348fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
1358fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n",
1368fe96085Stim szeto cmdName, gettext("could not set filename"));
137fcf3ce44SJohn Forte return (1);
138fcf3ce44SJohn Forte }
139fcf3ce44SJohn Forte
1408fe96085Stim szeto ret = stmfCreateLu(hdl, &createdGuid);
1418fe96085Stim szeto switch (ret) {
1428fe96085Stim szeto case STMF_STATUS_SUCCESS:
1438fe96085Stim szeto break;
1448fe96085Stim szeto case STMF_ERROR_BUSY:
1458fe96085Stim szeto case STMF_ERROR_LU_BUSY:
1468fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
1478fe96085Stim szeto gettext("resource busy"));
1488fe96085Stim szeto ret++;
1498fe96085Stim szeto break;
1508fe96085Stim szeto case STMF_ERROR_PERM:
1518fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
1528fe96085Stim szeto gettext("permission denied"));
1538fe96085Stim szeto ret++;
1548fe96085Stim szeto break;
1558fe96085Stim szeto case STMF_ERROR_FILE_IN_USE:
1568fe96085Stim szeto (void) fprintf(stderr, "%s: filename %s: %s\n", cmdName,
1578fe96085Stim szeto operands[0], gettext("in use"));
1588fe96085Stim szeto ret++;
1598fe96085Stim szeto break;
1608fe96085Stim szeto case STMF_ERROR_INVALID_BLKSIZE:
1618fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
1628fe96085Stim szeto gettext("invalid block size"));
1638fe96085Stim szeto ret++;
1648fe96085Stim szeto break;
1658fe96085Stim szeto case STMF_ERROR_GUID_IN_USE:
1668fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
1678fe96085Stim szeto gettext("guid in use"));
1688fe96085Stim szeto ret++;
1698fe96085Stim szeto break;
1708fe96085Stim szeto case STMF_ERROR_META_FILE_NAME:
1718fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
1728fe96085Stim szeto gettext("meta file error"));
1738fe96085Stim szeto ret++;
1748fe96085Stim szeto break;
1758fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME:
1768fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
1778fe96085Stim szeto gettext("data file error"));
1788fe96085Stim szeto ret++;
1798fe96085Stim szeto break;
1808fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE:
1818fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
1828fe96085Stim szeto gettext("invalid size"));
1838fe96085Stim szeto ret++;
1848fe96085Stim szeto break;
1858fe96085Stim szeto case STMF_ERROR_META_CREATION:
1868fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
1878fe96085Stim szeto gettext("could not create meta file"));
1888fe96085Stim szeto ret++;
1898fe96085Stim szeto break;
1908fe96085Stim szeto default:
1918fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
1928fe96085Stim szeto gettext("unknown error"));
1938fe96085Stim szeto ret++;
1948fe96085Stim szeto break;
195fcf3ce44SJohn Forte }
196fcf3ce44SJohn Forte
1978fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
1988fe96085Stim szeto goto done;
199fcf3ce44SJohn Forte }
200fcf3ce44SJohn Forte
2018fe96085Stim szeto (void) printf("Created the following LU:\n");
2028fe96085Stim szeto print_attr_header();
2038fe96085Stim szeto ret = print_lu_attr(&createdGuid);
204fcf3ce44SJohn Forte
2058fe96085Stim szeto done:
2068fe96085Stim szeto (void) stmfFreeLuResource(hdl);
207fcf3ce44SJohn Forte return (ret);
208fcf3ce44SJohn Forte }
209fcf3ce44SJohn Forte
210fcf3ce44SJohn Forte /*ARGSUSED*/
211fcf3ce44SJohn Forte int
import_lu(int argc,char * operands[],cmdOptions_t * options,void * callData)2128fe96085Stim szeto import_lu(int argc, char *operands[], cmdOptions_t *options, void *callData)
213fcf3ce44SJohn Forte {
214fcf3ce44SJohn Forte int ret = 0;
2158fe96085Stim szeto stmfGuid createdGuid;
216fcf3ce44SJohn Forte
2178fe96085Stim szeto ret = stmfImportLu(STMF_DISK, operands[0], &createdGuid);
2188fe96085Stim szeto switch (ret) {
2198fe96085Stim szeto case STMF_STATUS_SUCCESS:
2208fe96085Stim szeto break;
2218fe96085Stim szeto case STMF_ERROR_BUSY:
2228fe96085Stim szeto case STMF_ERROR_LU_BUSY:
2238fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
2248fe96085Stim szeto gettext("resource busy"));
2258fe96085Stim szeto ret++;
2268fe96085Stim szeto break;
2278fe96085Stim szeto case STMF_ERROR_PERM:
2288fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
2298fe96085Stim szeto gettext("permission denied"));
2308fe96085Stim szeto ret++;
2318fe96085Stim szeto break;
2328fe96085Stim szeto case STMF_ERROR_FILE_IN_USE:
2338fe96085Stim szeto (void) fprintf(stderr, "%s: filename %s: %s\n", cmdName,
2348fe96085Stim szeto operands[0], gettext("in use"));
2358fe96085Stim szeto ret++;
2368fe96085Stim szeto break;
2378fe96085Stim szeto case STMF_ERROR_GUID_IN_USE:
2388fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
2398fe96085Stim szeto gettext("guid in use"));
2408fe96085Stim szeto ret++;
2418fe96085Stim szeto break;
2428fe96085Stim szeto case STMF_ERROR_META_FILE_NAME:
2438fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
2448fe96085Stim szeto gettext("meta file error"));
2458fe96085Stim szeto ret++;
2468fe96085Stim szeto break;
2478fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME:
2488fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
2498fe96085Stim szeto gettext("data file error"));
2508fe96085Stim szeto ret++;
2518fe96085Stim szeto break;
2528fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE:
2538fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
2548fe96085Stim szeto gettext("invalid size"));
2558fe96085Stim szeto ret++;
2568fe96085Stim szeto break;
2578fe96085Stim szeto case STMF_ERROR_META_CREATION:
2588fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
2598fe96085Stim szeto gettext("could not create meta file"));
2608fe96085Stim szeto ret++;
2618fe96085Stim szeto break;
2628fe96085Stim szeto default:
2638fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
2648fe96085Stim szeto gettext("unknown error"));
2658fe96085Stim szeto ret++;
2668fe96085Stim szeto break;
267fcf3ce44SJohn Forte }
268fcf3ce44SJohn Forte
2698fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) {
2708fe96085Stim szeto goto done;
271fcf3ce44SJohn Forte }
272fcf3ce44SJohn Forte
2738fe96085Stim szeto (void) printf("Imported the following LU:\n");
2748fe96085Stim szeto print_attr_header();
2758fe96085Stim szeto ret = print_lu_attr(&createdGuid);
2768fe96085Stim szeto
2778fe96085Stim szeto done:
278fcf3ce44SJohn Forte return (ret);
279fcf3ce44SJohn Forte }
280fcf3ce44SJohn Forte
281fcf3ce44SJohn Forte /*ARGSUSED*/
282fcf3ce44SJohn Forte int
delete_lu(int operandLen,char * operands[],cmdOptions_t * options,void * callData)2838fe96085Stim szeto delete_lu(int operandLen, char *operands[], cmdOptions_t *options,
2848fe96085Stim szeto void *callData)
285fcf3ce44SJohn Forte {
2868fe96085Stim szeto int i, j;
2878fe96085Stim szeto int ret = 0;
2888fe96085Stim szeto int stmfRet;
2898fe96085Stim szeto unsigned int inGuid[sizeof (stmfGuid)];
2908fe96085Stim szeto stmfGuid delGuid;
2918fe96085Stim szeto boolean_t keepViews = B_FALSE;
2928fe96085Stim szeto boolean_t viewEntriesRemoved = B_FALSE;
2938fe96085Stim szeto boolean_t noLunFound = B_FALSE;
2948fe96085Stim szeto boolean_t views = B_FALSE;
2957b506e25Ssrivijitha dugganapalli boolean_t notValidHexNumber = B_FALSE;
2968fe96085Stim szeto char sGuid[GUID_INPUT + 1];
2978fe96085Stim szeto stmfViewEntryList *viewEntryList = NULL;
298fcf3ce44SJohn Forte
299fcf3ce44SJohn Forte for (; options->optval; options++) {
300fcf3ce44SJohn Forte switch (options->optval) {
3018fe96085Stim szeto /* Keep views for logical unit */
3028fe96085Stim szeto case 'k':
3038fe96085Stim szeto keepViews = B_TRUE;
3048fe96085Stim szeto break;
3058fe96085Stim szeto default:
3068fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n",
3078fe96085Stim szeto cmdName, options->optval,
3088fe96085Stim szeto gettext("unknown option"));
3098fe96085Stim szeto return (1);
310fcf3ce44SJohn Forte }
311fcf3ce44SJohn Forte }
312fcf3ce44SJohn Forte
313fcf3ce44SJohn Forte
3148fe96085Stim szeto for (i = 0; i < operandLen; i++) {
3158fe96085Stim szeto for (j = 0; j < GUID_INPUT; j++) {
3168fe96085Stim szeto if (!isxdigit(operands[i][j])) {
3177b506e25Ssrivijitha dugganapalli notValidHexNumber = B_TRUE;
3188fe96085Stim szeto break;
319fcf3ce44SJohn Forte }
320bc54f855SJohn Levon sGuid[j] = tolower(operands[i][j]);
321fcf3ce44SJohn Forte }
3227b506e25Ssrivijitha dugganapalli if ((notValidHexNumber == B_TRUE) ||
3237b506e25Ssrivijitha dugganapalli (strlen(operands[i]) != GUID_INPUT)) {
3248fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s%d%s\n",
3258fe96085Stim szeto cmdName, operands[i], gettext("must be "),
3268fe96085Stim szeto GUID_INPUT,
3278fe96085Stim szeto gettext(" hexadecimal digits long"));
3287b506e25Ssrivijitha dugganapalli notValidHexNumber = B_FALSE;
3298fe96085Stim szeto ret++;
3308fe96085Stim szeto continue;
331fcf3ce44SJohn Forte }
332fcf3ce44SJohn Forte
3338fe96085Stim szeto sGuid[j] = 0;
334fcf3ce44SJohn Forte
3358fe96085Stim szeto (void) sscanf(sGuid,
3368fe96085Stim szeto "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
3378fe96085Stim szeto &inGuid[0], &inGuid[1], &inGuid[2], &inGuid[3],
3388fe96085Stim szeto &inGuid[4], &inGuid[5], &inGuid[6], &inGuid[7],
3398fe96085Stim szeto &inGuid[8], &inGuid[9], &inGuid[10], &inGuid[11],
3408fe96085Stim szeto &inGuid[12], &inGuid[13], &inGuid[14], &inGuid[15]);
3418fe96085Stim szeto
3428fe96085Stim szeto for (j = 0; j < sizeof (stmfGuid); j++) {
3438fe96085Stim szeto delGuid.guid[j] = inGuid[j];
344fcf3ce44SJohn Forte }
345fcf3ce44SJohn Forte
3468fe96085Stim szeto stmfRet = stmfDeleteLu(&delGuid);
3478fe96085Stim szeto switch (stmfRet) {
3488fe96085Stim szeto case STMF_STATUS_SUCCESS:
3498fe96085Stim szeto break;
3508fe96085Stim szeto case STMF_ERROR_NOT_FOUND:
3518fe96085Stim szeto noLunFound = B_TRUE;
3528fe96085Stim szeto break;
3538fe96085Stim szeto case STMF_ERROR_BUSY:
3548fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
3558fe96085Stim szeto gettext("resource busy"));
3568fe96085Stim szeto ret++;
3578fe96085Stim szeto break;
3588fe96085Stim szeto case STMF_ERROR_PERM:
3598fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
3608fe96085Stim szeto gettext("permission denied"));
3618fe96085Stim szeto ret++;
3628fe96085Stim szeto break;
3638fe96085Stim szeto default:
3648fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
3658fe96085Stim szeto gettext("unknown error"));
3668fe96085Stim szeto ret++;
3678fe96085Stim szeto break;
3688fe96085Stim szeto }
369fcf3ce44SJohn Forte
3708fe96085Stim szeto if (!keepViews) {
3718fe96085Stim szeto stmfRet = stmfGetViewEntryList(&delGuid,
3728fe96085Stim szeto &viewEntryList);
3738fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) {
3748fe96085Stim szeto for (j = 0; j < viewEntryList->cnt; j++) {
3758fe96085Stim szeto (void) stmfRemoveViewEntry(&delGuid,
3768fe96085Stim szeto viewEntryList->ve[j].veIndex);
3778fe96085Stim szeto }
3787b506e25Ssrivijitha dugganapalli /* check if viewEntryList is empty */
3797b506e25Ssrivijitha dugganapalli if (viewEntryList->cnt != 0)
3807b506e25Ssrivijitha dugganapalli viewEntriesRemoved = B_TRUE;
3818fe96085Stim szeto stmfFreeMemory(viewEntryList);
3827b506e25Ssrivijitha dugganapalli } else {
3838fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
3848fe96085Stim szeto gettext("unable to remove view entries\n"));
3858fe96085Stim szeto ret++;
3867b506e25Ssrivijitha dugganapalli }
3878fe96085Stim szeto }
3888fe96085Stim szeto if (keepViews) {
3898fe96085Stim szeto stmfRet = stmfGetViewEntryList(&delGuid,
3908fe96085Stim szeto &viewEntryList);
3918fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) {
3928fe96085Stim szeto views = B_TRUE;
3938fe96085Stim szeto stmfFreeMemory(viewEntryList);
394fcf3ce44SJohn Forte }
395fcf3ce44SJohn Forte }
396fcf3ce44SJohn Forte
3978fe96085Stim szeto if ((!viewEntriesRemoved && noLunFound && !views) ||
3988fe96085Stim szeto (!views && keepViews && noLunFound)) {
3998fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s\n",
4008fe96085Stim szeto cmdName, sGuid,
4018fe96085Stim szeto gettext("not found"));
4028fe96085Stim szeto ret++;
4038fe96085Stim szeto }
4048fe96085Stim szeto noLunFound = viewEntriesRemoved = views = B_FALSE;
405fcf3ce44SJohn Forte }
406fcf3ce44SJohn Forte return (ret);
407fcf3ce44SJohn Forte }
408fcf3ce44SJohn Forte
409fcf3ce44SJohn Forte /*ARGSUSED*/
410fcf3ce44SJohn Forte int
modify_lu(int operandLen,char * operands[],cmdOptions_t * options,void * callData)4118fe96085Stim szeto modify_lu(int operandLen, char *operands[], cmdOptions_t *options,
4128fe96085Stim szeto void *callData)
413fcf3ce44SJohn Forte {
4148fe96085Stim szeto stmfGuid inGuid;
4158fe96085Stim szeto unsigned int guid[sizeof (stmfGuid)];
4168fe96085Stim szeto int ret = 0;
4178fe96085Stim szeto int i;
4188fe96085Stim szeto char *fname = NULL;
4198fe96085Stim szeto char sGuid[GUID_INPUT + 1];
4208fe96085Stim szeto boolean_t fnameUsed = B_FALSE;
4218fe96085Stim szeto
4228fe96085Stim szeto if (operands[0][0] == '/') {
4238fe96085Stim szeto fnameUsed = B_TRUE;
4248fe96085Stim szeto fname = operands[0];
425fcf3ce44SJohn Forte }
4268fe96085Stim szeto
4278fe96085Stim szeto /* check input length */
4288fe96085Stim szeto if (!fnameUsed && strlen(operands[0]) != GUID_INPUT) {
4298fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s%d%s\n", cmdName, operands[0],
4308fe96085Stim szeto gettext("must be "), GUID_INPUT,
4318fe96085Stim szeto gettext(" hexadecimal digits"));
432fcf3ce44SJohn Forte return (1);
433fcf3ce44SJohn Forte }
434fcf3ce44SJohn Forte
4358fe96085Stim szeto if (!fnameUsed) {
4368fe96085Stim szeto /* convert to lower case for scan */
4378fe96085Stim szeto for (i = 0; i < 32; i++)
4388fe96085Stim szeto sGuid[i] = tolower(operands[0][i]);
4398fe96085Stim szeto sGuid[i] = 0;
4408fe96085Stim szeto (void) sscanf(sGuid,
4418fe96085Stim szeto "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x",
4428fe96085Stim szeto &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5],
4438fe96085Stim szeto &guid[6], &guid[7], &guid[8], &guid[9], &guid[10],
4448fe96085Stim szeto &guid[11], &guid[12], &guid[13], &guid[14], &guid[15]);
4458fe96085Stim szeto
4468fe96085Stim szeto for (i = 0; i < sizeof (stmfGuid); i++) {
4478fe96085Stim szeto inGuid.guid[i] = guid[i];
448fcf3ce44SJohn Forte }
449fcf3ce44SJohn Forte }
450fcf3ce44SJohn Forte
4518fe96085Stim szeto for (; options->optval; options++) {
4528fe96085Stim szeto switch (options->optval) {
4538fe96085Stim szeto case 's':
4548fe96085Stim szeto if (callModify(fname, &inGuid,
4558fe96085Stim szeto STMF_LU_PROP_SIZE, options->optarg,
4568fe96085Stim szeto "size") != 0) {
4578fe96085Stim szeto return (1);
4588fe96085Stim szeto }
4598fe96085Stim szeto break;
4608fe96085Stim szeto default:
4618fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n",
4628fe96085Stim szeto cmdName, options->optval,
4638fe96085Stim szeto gettext("unknown option"));
4648fe96085Stim szeto return (1);
465fcf3ce44SJohn Forte }
466fcf3ce44SJohn Forte }
4678fe96085Stim szeto return (ret);
4688fe96085Stim szeto }
4698fe96085Stim szeto
4708fe96085Stim szeto static int
callModify(char * fname,stmfGuid * luGuid,uint32_t prop,const char * propVal,const char * propString)4718fe96085Stim szeto callModify(char *fname, stmfGuid *luGuid, uint32_t prop, const char *propVal,
4728fe96085Stim szeto const char *propString)
4738fe96085Stim szeto {
4748fe96085Stim szeto int ret = 0;
4758fe96085Stim szeto int stmfRet = 0;
4768fe96085Stim szeto
4778fe96085Stim szeto if (!fname) {
4788fe96085Stim szeto stmfRet = stmfModifyLu(luGuid, prop, propVal);
479fcf3ce44SJohn Forte } else {
4808fe96085Stim szeto stmfRet = stmfModifyLuByFname(STMF_DISK, fname, prop,
4818fe96085Stim szeto propVal);
4828fe96085Stim szeto }
4838fe96085Stim szeto switch (stmfRet) {
4848fe96085Stim szeto case STMF_STATUS_SUCCESS:
4858fe96085Stim szeto break;
4868fe96085Stim szeto case STMF_ERROR_BUSY:
4878fe96085Stim szeto case STMF_ERROR_LU_BUSY:
4888fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
4898fe96085Stim szeto gettext("resource busy"));
4908fe96085Stim szeto ret++;
4918fe96085Stim szeto break;
4928fe96085Stim szeto case STMF_ERROR_PERM:
4938fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
4948fe96085Stim szeto gettext("permission denied"));
4958fe96085Stim szeto ret++;
4968fe96085Stim szeto break;
4978fe96085Stim szeto case STMF_ERROR_INVALID_BLKSIZE:
4988fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
4998fe96085Stim szeto gettext("invalid block size"));
5008fe96085Stim szeto ret++;
5018fe96085Stim szeto break;
5028fe96085Stim szeto case STMF_ERROR_GUID_IN_USE:
5038fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5048fe96085Stim szeto gettext("guid in use"));
5058fe96085Stim szeto ret++;
5068fe96085Stim szeto break;
5078fe96085Stim szeto case STMF_ERROR_META_FILE_NAME:
5088fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5098fe96085Stim szeto gettext("meta file error"));
5108fe96085Stim szeto ret++;
5118fe96085Stim szeto break;
5128fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME:
5138fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5148fe96085Stim szeto gettext("data file error"));
5158fe96085Stim szeto ret++;
5168fe96085Stim szeto break;
5178fe96085Stim szeto case STMF_ERROR_FILE_SIZE_INVALID:
5188fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5198fe96085Stim szeto gettext("file size invalid"));
5208fe96085Stim szeto ret++;
5218fe96085Stim szeto break;
5228fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE:
5238fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5248fe96085Stim szeto gettext("invalid size"));
5258fe96085Stim szeto ret++;
5268fe96085Stim szeto break;
5278fe96085Stim szeto case STMF_ERROR_META_CREATION:
5288fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5298fe96085Stim szeto gettext("could not create meta file"));
5308fe96085Stim szeto ret++;
5318fe96085Stim szeto break;
5328fe96085Stim szeto default:
5338fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s: %d\n", cmdName,
5348fe96085Stim szeto gettext("could not set property"), propString,
5358fe96085Stim szeto stmfRet);
5368fe96085Stim szeto ret++;
5378fe96085Stim szeto break;
538fcf3ce44SJohn Forte }
539fcf3ce44SJohn Forte
540fcf3ce44SJohn Forte return (ret);
541fcf3ce44SJohn Forte }
542fcf3ce44SJohn Forte
543fcf3ce44SJohn Forte
544fcf3ce44SJohn Forte /*ARGSUSED*/
545fcf3ce44SJohn Forte int
list_lus(int argc,char * argv[],cmdOptions_t * options,void * callData)546fcf3ce44SJohn Forte list_lus(int argc, char *argv[], cmdOptions_t *options, void *callData)
547fcf3ce44SJohn Forte {
5488fe96085Stim szeto int stmfRet;
5498fe96085Stim szeto stmfGuidList *luList;
5508fe96085Stim szeto stmfLogicalUnitProperties luProps;
5518fe96085Stim szeto int sbdLuCnt = 0;
5528fe96085Stim szeto int i;
553fcf3ce44SJohn Forte
5548fe96085Stim szeto if ((stmfRet = stmfGetLogicalUnitList(&luList))
5558fe96085Stim szeto != STMF_STATUS_SUCCESS) {
5568fe96085Stim szeto switch (stmfRet) {
5578fe96085Stim szeto case STMF_ERROR_SERVICE_NOT_FOUND:
5588fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5598fe96085Stim szeto gettext("STMF service not found"));
5608fe96085Stim szeto break;
5618fe96085Stim szeto case STMF_ERROR_BUSY:
5628fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5638fe96085Stim szeto gettext("resource busy"));
5648fe96085Stim szeto break;
5658fe96085Stim szeto case STMF_ERROR_PERM:
5668fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5678fe96085Stim szeto gettext("permission denied"));
5688fe96085Stim szeto break;
5698fe96085Stim szeto case STMF_ERROR_SERVICE_DATA_VERSION:
5708fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5718fe96085Stim szeto gettext("STMF service version incorrect"));
5728fe96085Stim szeto break;
5738fe96085Stim szeto default:
5748fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5758fe96085Stim szeto gettext("list failed"));
5768fe96085Stim szeto break;
577fcf3ce44SJohn Forte }
578fcf3ce44SJohn Forte return (1);
579fcf3ce44SJohn Forte }
580fcf3ce44SJohn Forte
5818fe96085Stim szeto for (i = 0; i < luList->cnt; i++) {
5828fe96085Stim szeto stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i],
5838fe96085Stim szeto &luProps);
5848fe96085Stim szeto if (stmfRet != STMF_STATUS_SUCCESS) {
5858fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
5868fe96085Stim szeto gettext("list failed"));
587fcf3ce44SJohn Forte return (1);
588fcf3ce44SJohn Forte }
5898fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) {
5908fe96085Stim szeto sbdLuCnt++;
5918fe96085Stim szeto }
592fcf3ce44SJohn Forte }
593fcf3ce44SJohn Forte
594fcf3ce44SJohn Forte
5958fe96085Stim szeto if (sbdLuCnt == 0)
5968fe96085Stim szeto return (0);
5978fe96085Stim szeto
5988fe96085Stim szeto (void) printf("\nFound %d LU(s)\n", sbdLuCnt);
599fcf3ce44SJohn Forte print_attr_header();
600fcf3ce44SJohn Forte
6018fe96085Stim szeto for (i = 0; i < luList->cnt; i++) {
6028fe96085Stim szeto stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i],
6038fe96085Stim szeto &luProps);
6048fe96085Stim szeto if (stmfRet != STMF_STATUS_SUCCESS) {
6058fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
6068fe96085Stim szeto gettext("list failed"));
6078fe96085Stim szeto return (1);
6088fe96085Stim szeto }
6098fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) {
6108fe96085Stim szeto (void) print_lu_attr(&luList->guid[i]);
6118fe96085Stim szeto }
612fcf3ce44SJohn Forte }
613fcf3ce44SJohn Forte return (0);
614fcf3ce44SJohn Forte }
615fcf3ce44SJohn Forte
616fcf3ce44SJohn Forte void
print_attr_header()617fcf3ce44SJohn Forte print_attr_header()
618fcf3ce44SJohn Forte {
619fcf3ce44SJohn Forte (void) printf("\n");
620fcf3ce44SJohn Forte (void) printf(" GUID DATA SIZE "
621fcf3ce44SJohn Forte " SOURCE\n");
622fcf3ce44SJohn Forte (void) printf("-------------------------------- -------------------"
623fcf3ce44SJohn Forte " ----------------\n");
624fcf3ce44SJohn Forte }
625fcf3ce44SJohn Forte
626fcf3ce44SJohn Forte void
print_guid(uint8_t * g,FILE * f)627fcf3ce44SJohn Forte print_guid(uint8_t *g, FILE *f)
628fcf3ce44SJohn Forte {
629fcf3ce44SJohn Forte int i;
630fcf3ce44SJohn Forte
631fcf3ce44SJohn Forte for (i = 0; i < 16; i++) {
632fcf3ce44SJohn Forte (void) fprintf(f, "%02x", g[i]);
633fcf3ce44SJohn Forte }
634fcf3ce44SJohn Forte }
635fcf3ce44SJohn Forte
636fcf3ce44SJohn Forte int
print_lu_attr(stmfGuid * guid)6378fe96085Stim szeto print_lu_attr(stmfGuid *guid)
638fcf3ce44SJohn Forte {
6398fe96085Stim szeto luResource hdl = NULL;
6408fe96085Stim szeto int stmfRet = 0;
6418fe96085Stim szeto int ret = 0;
6428fe96085Stim szeto char propVal[MAXPATHLEN];
6438fe96085Stim szeto size_t propValSize = sizeof (propVal);
6448fe96085Stim szeto
6458fe96085Stim szeto if ((stmfRet = stmfGetLuResource(guid, &hdl)) != STMF_STATUS_SUCCESS) {
6468fe96085Stim szeto switch (stmfRet) {
6478fe96085Stim szeto case STMF_ERROR_BUSY:
6488fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
6498fe96085Stim szeto gettext("resource busy"));
6508fe96085Stim szeto break;
6518fe96085Stim szeto case STMF_ERROR_PERM:
6528fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
6538fe96085Stim szeto gettext("permission denied"));
6548fe96085Stim szeto break;
6558fe96085Stim szeto case STMF_ERROR_NOT_FOUND:
6568fe96085Stim szeto /* No error here */
6578fe96085Stim szeto return (0);
6588fe96085Stim szeto default:
6598fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName,
6608fe96085Stim szeto gettext("get extended properties failed"));
6618fe96085Stim szeto break;
6628fe96085Stim szeto }
6638fe96085Stim szeto return (1);
6648fe96085Stim szeto }
665fcf3ce44SJohn Forte
6668fe96085Stim szeto print_guid((uint8_t *)guid, stdout);
667fcf3ce44SJohn Forte
6688fe96085Stim szeto stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_SIZE, propVal,
6698fe96085Stim szeto &propValSize);
6708fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) {
6718fe96085Stim szeto (void) printf(" %-19s ", propVal);
6728fe96085Stim szeto } else if (stmfRet == STMF_ERROR_NO_PROP) {
6738fe96085Stim szeto (void) printf("not set\n");
6748fe96085Stim szeto } else {
67545039663SJohn Forte (void) printf("<error retrieving property>\n");
6768fe96085Stim szeto ret++;
6778fe96085Stim szeto }
678fcf3ce44SJohn Forte
6798fe96085Stim szeto stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_FILENAME, propVal,
6808fe96085Stim szeto &propValSize);
6818fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) {
6828fe96085Stim szeto (void) printf("%s\n", propVal);
6838fe96085Stim szeto } else if (stmfRet == STMF_ERROR_NO_PROP) {
6848fe96085Stim szeto (void) printf("not set\n");
6858fe96085Stim szeto } else {
68645039663SJohn Forte (void) printf("<error retrieving property>\n");
6878fe96085Stim szeto ret++;
688fcf3ce44SJohn Forte }
689fcf3ce44SJohn Forte
690fcf3ce44SJohn Forte
6918fe96085Stim szeto (void) stmfFreeLuResource(hdl);
6928fe96085Stim szeto return (ret);
6938fe96085Stim szeto }
694fcf3ce44SJohn Forte
6958fe96085Stim szeto /*
6968fe96085Stim szeto * input:
6978fe96085Stim szeto * execFullName - exec name of program (argv[0])
6988fe96085Stim szeto *
6998fe96085Stim szeto * copied from usr/src/cmd/zoneadm/zoneadm.c in OS/Net
7008fe96085Stim szeto * (changed name to lowerCamelCase to keep consistent with this file)
7018fe96085Stim szeto *
7028fe96085Stim szeto * Returns:
7038fe96085Stim szeto * command name portion of execFullName
7048fe96085Stim szeto */
7058fe96085Stim szeto static char *
getExecBasename(char * execFullname)7068fe96085Stim szeto getExecBasename(char *execFullname)
7078fe96085Stim szeto {
7088fe96085Stim szeto char *lastSlash, *execBasename;
7098fe96085Stim szeto
7108fe96085Stim szeto /* guard against '/' at end of command invocation */
7118fe96085Stim szeto for (;;) {
7128fe96085Stim szeto lastSlash = strrchr(execFullname, '/');
7138fe96085Stim szeto if (lastSlash == NULL) {
7148fe96085Stim szeto execBasename = execFullname;
7158fe96085Stim szeto break;
7168fe96085Stim szeto } else {
7178fe96085Stim szeto execBasename = lastSlash + 1;
7188fe96085Stim szeto if (*execBasename == '\0') {
7198fe96085Stim szeto *lastSlash = '\0';
7208fe96085Stim szeto continue;
7218fe96085Stim szeto }
7228fe96085Stim szeto break;
7238fe96085Stim szeto }
724fcf3ce44SJohn Forte }
7258fe96085Stim szeto return (execBasename);
726fcf3ce44SJohn Forte }
7278fe96085Stim szeto int
main(int argc,char * argv[])7288fe96085Stim szeto main(int argc, char *argv[])
7298fe96085Stim szeto {
7308fe96085Stim szeto synTables_t synTables;
7318fe96085Stim szeto char versionString[VERSION_STRING_MAX_LEN];
7328fe96085Stim szeto int ret;
7338fe96085Stim szeto int funcRet;
7348fe96085Stim szeto void *subcommandArgs = NULL;
7358fe96085Stim szeto
7368fe96085Stim szeto (void) setlocale(LC_ALL, "");
7378fe96085Stim szeto (void) textdomain(TEXT_DOMAIN);
7388fe96085Stim szeto /* set global command name */
7398fe96085Stim szeto cmdName = getExecBasename(argv[0]);
7408fe96085Stim szeto
7418fe96085Stim szeto (void) snprintf(versionString, VERSION_STRING_MAX_LEN, "%s.%s",
7428fe96085Stim szeto VERSION_STRING_MAJOR, VERSION_STRING_MINOR);
7438fe96085Stim szeto synTables.versionString = versionString;
7448fe96085Stim szeto synTables.longOptionTbl = options;
7458fe96085Stim szeto synTables.subCommandPropsTbl = subCommands;
7468fe96085Stim szeto
7478fe96085Stim szeto ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet);
7488fe96085Stim szeto if (ret != 0) {
7498fe96085Stim szeto return (ret);
7508fe96085Stim szeto }
7518fe96085Stim szeto
7528fe96085Stim szeto return (funcRet);
7538fe96085Stim szeto } /* end main */
754