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. 24*33f5ff17SMilan Jurik * Copyright 2012 Milan Jurik. All rights reserved. 25fcf3ce44SJohn Forte */ 26fcf3ce44SJohn Forte #include <stdlib.h> 27fcf3ce44SJohn Forte #include <stdio.h> 28fcf3ce44SJohn Forte #include <sys/types.h> 29fcf3ce44SJohn Forte #include <sys/stat.h> 30fcf3ce44SJohn Forte #include <fcntl.h> 31fcf3ce44SJohn Forte #include <unistd.h> 32fcf3ce44SJohn Forte #include <libintl.h> 33fcf3ce44SJohn Forte #include <errno.h> 34fcf3ce44SJohn Forte #include <string.h> 35fcf3ce44SJohn Forte #include <assert.h> 36fcf3ce44SJohn Forte #include <getopt.h> 37fcf3ce44SJohn Forte #include <strings.h> 38fcf3ce44SJohn Forte #include <ctype.h> 39fcf3ce44SJohn Forte #include <libnvpair.h> 408fe96085Stim szeto #include <locale.h> 41fcf3ce44SJohn Forte 42fcf3ce44SJohn Forte #include <cmdparse.h> 43fcf3ce44SJohn Forte #include <sys/stmf_defines.h> 44fcf3ce44SJohn Forte #include <libstmf.h> 45fcf3ce44SJohn Forte #include <sys/stmf_sbd_ioctl.h> 46fcf3ce44SJohn Forte 47fcf3ce44SJohn Forte #define MAX_LU_LIST 8192 48fcf3ce44SJohn Forte #define LU_LIST_MAX_RETRIES 3 498fe96085Stim szeto #define GUID_INPUT 32 50fcf3ce44SJohn Forte 518fe96085Stim szeto #define VERSION_STRING_MAJOR "1" 528fe96085Stim szeto #define VERSION_STRING_MINOR "0" 538fe96085Stim szeto #define VERSION_STRING_MAX_LEN 10 54fcf3ce44SJohn Forte 558fe96085Stim szeto 568fe96085Stim szeto char *cmdName; 578fe96085Stim szeto 588fe96085Stim szeto static char *getExecBasename(char *); 59fcf3ce44SJohn Forte int delete_lu(int argc, char *argv[], cmdOptions_t *options, 60fcf3ce44SJohn Forte void *callData); 61fcf3ce44SJohn Forte int create_lu(int argc, char *argv[], cmdOptions_t *options, void *callData); 62fcf3ce44SJohn Forte int list_lus(int argc, char *argv[], cmdOptions_t *options, void *callData); 63fcf3ce44SJohn Forte int modify_lu(int argc, char *argv[], cmdOptions_t *options, void *callData); 648fe96085Stim szeto int import_lu(int argc, char *argv[], cmdOptions_t *options, void *callData); 658fe96085Stim szeto static int callModify(char *, stmfGuid *, uint32_t, const char *, const char *); 668fe96085Stim szeto int print_lu_attr(stmfGuid *); 67fcf3ce44SJohn Forte void print_guid(uint8_t *g, FILE *f); 68fcf3ce44SJohn Forte void print_attr_header(); 69fcf3ce44SJohn Forte 70fcf3ce44SJohn Forte optionTbl_t options[] = { 71fcf3ce44SJohn Forte { "disk-size", required_argument, 's', 72fcf3ce44SJohn Forte "Size with <none>/k/m/g/t/p/e modifier" }, 73fcf3ce44SJohn Forte { "keep-views", no_arg, 'k', 74fcf3ce44SJohn Forte "Dont delete view entries related to the LU" }, 75fcf3ce44SJohn Forte { NULL, 0, 0 } 76fcf3ce44SJohn Forte }; 77fcf3ce44SJohn Forte 78fcf3ce44SJohn Forte subCommandProps_t subCommands[] = { 79fcf3ce44SJohn Forte { "create-lu", create_lu, "s", NULL, NULL, 80fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE, 81fcf3ce44SJohn Forte "Full path of the file to initialize" }, 82fcf3ce44SJohn Forte { "delete-lu", delete_lu, "k", NULL, NULL, 83fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE, "GUID of the LU to deregister" }, 84fcf3ce44SJohn Forte { "import-lu", import_lu, NULL, NULL, NULL, 85fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE, "filename of the LU to import" }, 86fcf3ce44SJohn Forte { "list-lu", list_lus, NULL, NULL, NULL, 87fcf3ce44SJohn Forte OPERAND_NONE, "List all the exported LUs" }, 88fcf3ce44SJohn Forte { "modify-lu", modify_lu, "s", "s", NULL, 89fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE, 90fcf3ce44SJohn Forte "Full path of the LU or GUID of a registered LU" }, 91fcf3ce44SJohn Forte { NULL, 0, 0, NULL, 0, NULL} 92fcf3ce44SJohn Forte }; 93fcf3ce44SJohn Forte 948fe96085Stim szeto /*ARGSUSED*/ 95fcf3ce44SJohn Forte int 968fe96085Stim szeto create_lu(int argc, char *operands[], cmdOptions_t *options, void *callData) 97fcf3ce44SJohn Forte { 988fe96085Stim szeto luResource hdl = NULL; 99fcf3ce44SJohn Forte int ret = 0; 1008fe96085Stim szeto stmfGuid createdGuid; 101fcf3ce44SJohn Forte 1028fe96085Stim szeto ret = stmfCreateLuResource(STMF_DISK, &hdl); 1038fe96085Stim szeto 104fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 1058fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", 1068fe96085Stim szeto cmdName, gettext("Failure to create lu resource\n")); 107fcf3ce44SJohn Forte return (1); 108fcf3ce44SJohn Forte } 109fcf3ce44SJohn Forte 110fcf3ce44SJohn Forte for (; options->optval; options++) { 111fcf3ce44SJohn Forte switch (options->optval) { 1128fe96085Stim szeto case 's': 1138fe96085Stim szeto ret = stmfSetLuProp(hdl, STMF_LU_PROP_SIZE, 1148fe96085Stim szeto options->optarg); 1158fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 1168fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 1178fe96085Stim szeto cmdName, options->optval, 1188fe96085Stim szeto gettext("size param invalid")); 1198fe96085Stim szeto (void) stmfFreeLuResource(hdl); 1208fe96085Stim szeto return (1); 1218fe96085Stim szeto } 1228fe96085Stim szeto break; 1238fe96085Stim szeto default: 1248fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 1258fe96085Stim szeto cmdName, options->optval, 1268fe96085Stim szeto gettext("unknown option")); 1278fe96085Stim szeto return (1); 1288fe96085Stim szeto } 1298fe96085Stim szeto } 1308fe96085Stim szeto 1318fe96085Stim szeto ret = stmfSetLuProp(hdl, STMF_LU_PROP_FILENAME, operands[0]); 1328fe96085Stim szeto 1338fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 1348fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", 1358fe96085Stim szeto cmdName, gettext("could not set filename")); 1368fe96085Stim szeto return (1); 1378fe96085Stim szeto } 1388fe96085Stim szeto 1398fe96085Stim szeto ret = stmfCreateLu(hdl, &createdGuid); 1408fe96085Stim szeto switch (ret) { 1418fe96085Stim szeto case STMF_STATUS_SUCCESS: 1428fe96085Stim szeto break; 1438fe96085Stim szeto case STMF_ERROR_BUSY: 1448fe96085Stim szeto case STMF_ERROR_LU_BUSY: 1458fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1468fe96085Stim szeto gettext("resource busy")); 1478fe96085Stim szeto ret++; 1488fe96085Stim szeto break; 1498fe96085Stim szeto case STMF_ERROR_PERM: 1508fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1518fe96085Stim szeto gettext("permission denied")); 1528fe96085Stim szeto ret++; 1538fe96085Stim szeto break; 1548fe96085Stim szeto case STMF_ERROR_FILE_IN_USE: 1558fe96085Stim szeto (void) fprintf(stderr, "%s: filename %s: %s\n", cmdName, 1568fe96085Stim szeto operands[0], gettext("in use")); 1578fe96085Stim szeto ret++; 1588fe96085Stim szeto break; 1598fe96085Stim szeto case STMF_ERROR_INVALID_BLKSIZE: 1608fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1618fe96085Stim szeto gettext("invalid block size")); 1628fe96085Stim szeto ret++; 1638fe96085Stim szeto break; 1648fe96085Stim szeto case STMF_ERROR_GUID_IN_USE: 1658fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1668fe96085Stim szeto gettext("guid in use")); 1678fe96085Stim szeto ret++; 1688fe96085Stim szeto break; 1698fe96085Stim szeto case STMF_ERROR_META_FILE_NAME: 1708fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1718fe96085Stim szeto gettext("meta file error")); 1728fe96085Stim szeto ret++; 1738fe96085Stim szeto break; 1748fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME: 1758fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1768fe96085Stim szeto gettext("data file error")); 1778fe96085Stim szeto ret++; 1788fe96085Stim szeto break; 1798fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE: 1808fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1818fe96085Stim szeto gettext("invalid size")); 1828fe96085Stim szeto ret++; 1838fe96085Stim szeto break; 1848fe96085Stim szeto case STMF_ERROR_META_CREATION: 1858fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1868fe96085Stim szeto gettext("could not create meta file")); 1878fe96085Stim szeto ret++; 1888fe96085Stim szeto break; 1898fe96085Stim szeto default: 1908fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1918fe96085Stim szeto gettext("unknown error")); 1928fe96085Stim szeto ret++; 193fcf3ce44SJohn Forte break; 194fcf3ce44SJohn Forte } 1958fe96085Stim szeto 1968fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 1978fe96085Stim szeto goto done; 198fcf3ce44SJohn Forte } 199fcf3ce44SJohn Forte 2008fe96085Stim szeto (void) printf("Created the following LU:\n"); 2018fe96085Stim szeto print_attr_header(); 2028fe96085Stim szeto ret = print_lu_attr(&createdGuid); 203fcf3ce44SJohn Forte 2048fe96085Stim szeto done: 2058fe96085Stim szeto (void) stmfFreeLuResource(hdl); 206fcf3ce44SJohn Forte return (ret); 207fcf3ce44SJohn Forte } 208fcf3ce44SJohn Forte 209fcf3ce44SJohn Forte /*ARGSUSED*/ 210fcf3ce44SJohn Forte int 2118fe96085Stim szeto import_lu(int argc, char *operands[], cmdOptions_t *options, void *callData) 212fcf3ce44SJohn Forte { 2138fe96085Stim szeto int ret = 0; 2148fe96085Stim szeto stmfGuid createdGuid; 215fcf3ce44SJohn Forte 2168fe96085Stim szeto ret = stmfImportLu(STMF_DISK, operands[0], &createdGuid); 2178fe96085Stim szeto switch (ret) { 2188fe96085Stim szeto case STMF_STATUS_SUCCESS: 2198fe96085Stim szeto break; 2208fe96085Stim szeto case STMF_ERROR_BUSY: 2218fe96085Stim szeto case STMF_ERROR_LU_BUSY: 2228fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2238fe96085Stim szeto gettext("resource busy")); 2248fe96085Stim szeto ret++; 2258fe96085Stim szeto break; 2268fe96085Stim szeto case STMF_ERROR_PERM: 2278fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2288fe96085Stim szeto gettext("permission denied")); 2298fe96085Stim szeto ret++; 2308fe96085Stim szeto break; 2318fe96085Stim szeto case STMF_ERROR_FILE_IN_USE: 2328fe96085Stim szeto (void) fprintf(stderr, "%s: filename %s: %s\n", cmdName, 2338fe96085Stim szeto operands[0], gettext("in use")); 2348fe96085Stim szeto ret++; 2358fe96085Stim szeto break; 2368fe96085Stim szeto case STMF_ERROR_GUID_IN_USE: 2378fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2388fe96085Stim szeto gettext("guid in use")); 2398fe96085Stim szeto ret++; 2408fe96085Stim szeto break; 2418fe96085Stim szeto case STMF_ERROR_META_FILE_NAME: 2428fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2438fe96085Stim szeto gettext("meta file error")); 2448fe96085Stim szeto ret++; 2458fe96085Stim szeto break; 2468fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME: 2478fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2488fe96085Stim szeto gettext("data file error")); 2498fe96085Stim szeto ret++; 2508fe96085Stim szeto break; 2518fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE: 2528fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2538fe96085Stim szeto gettext("invalid size")); 2548fe96085Stim szeto ret++; 2558fe96085Stim szeto break; 2568fe96085Stim szeto case STMF_ERROR_META_CREATION: 2578fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2588fe96085Stim szeto gettext("could not create meta file")); 2598fe96085Stim szeto ret++; 2608fe96085Stim szeto break; 2618fe96085Stim szeto default: 2628fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2638fe96085Stim szeto gettext("unknown error")); 2648fe96085Stim szeto ret++; 2658fe96085Stim szeto break; 266fcf3ce44SJohn Forte } 2678fe96085Stim szeto 2688fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 2698fe96085Stim szeto goto done; 2708fe96085Stim szeto } 2718fe96085Stim szeto 2728fe96085Stim szeto (void) printf("Imported the following LU:\n"); 2738fe96085Stim szeto print_attr_header(); 2748fe96085Stim szeto ret = print_lu_attr(&createdGuid); 2758fe96085Stim szeto 2768fe96085Stim szeto done: 2778fe96085Stim szeto return (ret); 2788fe96085Stim szeto } 2798fe96085Stim szeto 2808fe96085Stim szeto /*ARGSUSED*/ 2818fe96085Stim szeto int 2828fe96085Stim szeto delete_lu(int operandLen, char *operands[], cmdOptions_t *options, 2838fe96085Stim szeto void *callData) 2848fe96085Stim szeto { 2858fe96085Stim szeto int i, j; 2868fe96085Stim szeto int ret = 0; 2878fe96085Stim szeto int stmfRet; 2888fe96085Stim szeto unsigned int inGuid[sizeof (stmfGuid)]; 2898fe96085Stim szeto stmfGuid delGuid; 2908fe96085Stim szeto boolean_t keepViews = B_FALSE; 2918fe96085Stim szeto boolean_t viewEntriesRemoved = B_FALSE; 2928fe96085Stim szeto boolean_t noLunFound = B_FALSE; 2938fe96085Stim szeto boolean_t views = B_FALSE; 2947b506e25Ssrivijitha dugganapalli boolean_t notValidHexNumber = B_FALSE; 2958fe96085Stim szeto char sGuid[GUID_INPUT + 1]; 2968fe96085Stim szeto stmfViewEntryList *viewEntryList = NULL; 2978fe96085Stim szeto 2988fe96085Stim szeto for (; options->optval; options++) { 2998fe96085Stim szeto switch (options->optval) { 3008fe96085Stim szeto /* Keep views for logical unit */ 3018fe96085Stim szeto case 'k': 3028fe96085Stim szeto keepViews = B_TRUE; 3038fe96085Stim szeto break; 3048fe96085Stim szeto default: 3058fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 3068fe96085Stim szeto cmdName, options->optval, 3078fe96085Stim szeto gettext("unknown option")); 308fcf3ce44SJohn Forte return (1); 309fcf3ce44SJohn Forte } 3108fe96085Stim szeto } 311fcf3ce44SJohn Forte 3128fe96085Stim szeto 3138fe96085Stim szeto for (i = 0; i < operandLen; i++) { 3148fe96085Stim szeto for (j = 0; j < GUID_INPUT; j++) { 3158fe96085Stim szeto if (!isxdigit(operands[i][j])) { 3167b506e25Ssrivijitha dugganapalli notValidHexNumber = B_TRUE; 3178fe96085Stim szeto break; 3188fe96085Stim szeto } 3198fe96085Stim szeto sGuid[j] = tolower(operands[i][j]); 3208fe96085Stim szeto } 3217b506e25Ssrivijitha dugganapalli if ((notValidHexNumber == B_TRUE) || 3227b506e25Ssrivijitha dugganapalli (strlen(operands[i]) != GUID_INPUT)) { 3238fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s%d%s\n", 3248fe96085Stim szeto cmdName, operands[i], gettext("must be "), 3258fe96085Stim szeto GUID_INPUT, 3268fe96085Stim szeto gettext(" hexadecimal digits long")); 3277b506e25Ssrivijitha dugganapalli notValidHexNumber = B_FALSE; 3288fe96085Stim szeto ret++; 3298fe96085Stim szeto continue; 3308fe96085Stim szeto } 3318fe96085Stim szeto 3328fe96085Stim szeto sGuid[j] = 0; 3338fe96085Stim szeto 3348fe96085Stim szeto (void) sscanf(sGuid, 3358fe96085Stim szeto "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", 3368fe96085Stim szeto &inGuid[0], &inGuid[1], &inGuid[2], &inGuid[3], 3378fe96085Stim szeto &inGuid[4], &inGuid[5], &inGuid[6], &inGuid[7], 3388fe96085Stim szeto &inGuid[8], &inGuid[9], &inGuid[10], &inGuid[11], 3398fe96085Stim szeto &inGuid[12], &inGuid[13], &inGuid[14], &inGuid[15]); 3408fe96085Stim szeto 3418fe96085Stim szeto for (j = 0; j < sizeof (stmfGuid); j++) { 3428fe96085Stim szeto delGuid.guid[j] = inGuid[j]; 3438fe96085Stim szeto } 3448fe96085Stim szeto 3458fe96085Stim szeto stmfRet = stmfDeleteLu(&delGuid); 3468fe96085Stim szeto switch (stmfRet) { 3478fe96085Stim szeto case STMF_STATUS_SUCCESS: 3488fe96085Stim szeto break; 3498fe96085Stim szeto case STMF_ERROR_NOT_FOUND: 3508fe96085Stim szeto noLunFound = B_TRUE; 3518fe96085Stim szeto break; 3528fe96085Stim szeto case STMF_ERROR_BUSY: 3538fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 3548fe96085Stim szeto gettext("resource busy")); 3558fe96085Stim szeto ret++; 3568fe96085Stim szeto break; 3578fe96085Stim szeto case STMF_ERROR_PERM: 3588fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 3598fe96085Stim szeto gettext("permission denied")); 3608fe96085Stim szeto ret++; 3618fe96085Stim szeto break; 3628fe96085Stim szeto default: 3638fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 3648fe96085Stim szeto gettext("unknown error")); 3658fe96085Stim szeto ret++; 3668fe96085Stim szeto break; 3678fe96085Stim szeto } 3688fe96085Stim szeto 3698fe96085Stim szeto if (!keepViews) { 3708fe96085Stim szeto stmfRet = stmfGetViewEntryList(&delGuid, 3718fe96085Stim szeto &viewEntryList); 3728fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 3738fe96085Stim szeto for (j = 0; j < viewEntryList->cnt; j++) { 3748fe96085Stim szeto (void) stmfRemoveViewEntry(&delGuid, 3758fe96085Stim szeto viewEntryList->ve[j].veIndex); 3768fe96085Stim szeto } 3777b506e25Ssrivijitha dugganapalli /* check if viewEntryList is empty */ 3787b506e25Ssrivijitha dugganapalli if (viewEntryList->cnt != 0) 3798fe96085Stim szeto viewEntriesRemoved = B_TRUE; 3808fe96085Stim szeto stmfFreeMemory(viewEntryList); 3817b506e25Ssrivijitha dugganapalli } else { 3828fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 3838fe96085Stim szeto gettext("unable to remove view entries\n")); 3848fe96085Stim szeto ret++; 3857b506e25Ssrivijitha dugganapalli } 3868fe96085Stim szeto } 3878fe96085Stim szeto if (keepViews) { 3888fe96085Stim szeto stmfRet = stmfGetViewEntryList(&delGuid, 3898fe96085Stim szeto &viewEntryList); 3908fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 3918fe96085Stim szeto views = B_TRUE; 3928fe96085Stim szeto stmfFreeMemory(viewEntryList); 3938fe96085Stim szeto } 3948fe96085Stim szeto } 3958fe96085Stim szeto 3968fe96085Stim szeto if ((!viewEntriesRemoved && noLunFound && !views) || 3978fe96085Stim szeto (!views && keepViews && noLunFound)) { 3988fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s\n", 3998fe96085Stim szeto cmdName, sGuid, 4008fe96085Stim szeto gettext("not found")); 4018fe96085Stim szeto ret++; 4028fe96085Stim szeto } 4038fe96085Stim szeto noLunFound = viewEntriesRemoved = views = B_FALSE; 4048fe96085Stim szeto } 4058fe96085Stim szeto return (ret); 4068fe96085Stim szeto } 4078fe96085Stim szeto 4088fe96085Stim szeto /*ARGSUSED*/ 4098fe96085Stim szeto int 4108fe96085Stim szeto modify_lu(int operandLen, char *operands[], cmdOptions_t *options, 4118fe96085Stim szeto void *callData) 4128fe96085Stim szeto { 4138fe96085Stim szeto stmfGuid inGuid; 4148fe96085Stim szeto unsigned int guid[sizeof (stmfGuid)]; 4158fe96085Stim szeto int ret = 0; 4168fe96085Stim szeto int i; 4178fe96085Stim szeto char *fname = NULL; 4188fe96085Stim szeto char sGuid[GUID_INPUT + 1]; 4198fe96085Stim szeto boolean_t fnameUsed = B_FALSE; 4208fe96085Stim szeto 4218fe96085Stim szeto if (operands[0][0] == '/') { 4228fe96085Stim szeto fnameUsed = B_TRUE; 4238fe96085Stim szeto fname = operands[0]; 4248fe96085Stim szeto } 4258fe96085Stim szeto 4268fe96085Stim szeto /* check input length */ 4278fe96085Stim szeto if (!fnameUsed && strlen(operands[0]) != GUID_INPUT) { 4288fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s%d%s\n", cmdName, operands[0], 4298fe96085Stim szeto gettext("must be "), GUID_INPUT, 4308fe96085Stim szeto gettext(" hexadecimal digits")); 4318fe96085Stim szeto return (1); 4328fe96085Stim szeto } 4338fe96085Stim szeto 4348fe96085Stim szeto if (!fnameUsed) { 4358fe96085Stim szeto /* convert to lower case for scan */ 4368fe96085Stim szeto for (i = 0; i < 32; i++) 4378fe96085Stim szeto sGuid[i] = tolower(operands[0][i]); 4388fe96085Stim szeto sGuid[i] = 0; 4398fe96085Stim szeto (void) sscanf(sGuid, 4408fe96085Stim szeto "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", 4418fe96085Stim szeto &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5], 4428fe96085Stim szeto &guid[6], &guid[7], &guid[8], &guid[9], &guid[10], 4438fe96085Stim szeto &guid[11], &guid[12], &guid[13], &guid[14], &guid[15]); 4448fe96085Stim szeto 4458fe96085Stim szeto for (i = 0; i < sizeof (stmfGuid); i++) { 4468fe96085Stim szeto inGuid.guid[i] = guid[i]; 4478fe96085Stim szeto } 4488fe96085Stim szeto } 4498fe96085Stim szeto 450fcf3ce44SJohn Forte for (; options->optval; options++) { 4518fe96085Stim szeto switch (options->optval) { 4528fe96085Stim szeto case 's': 4538fe96085Stim szeto if (callModify(fname, &inGuid, 4548fe96085Stim szeto STMF_LU_PROP_SIZE, options->optarg, 4558fe96085Stim szeto "size") != 0) { 4568fe96085Stim szeto return (1); 457fcf3ce44SJohn Forte } 4588fe96085Stim szeto break; 4598fe96085Stim szeto default: 4608fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 4618fe96085Stim szeto cmdName, options->optval, 4628fe96085Stim szeto gettext("unknown option")); 4638fe96085Stim szeto return (1); 464fcf3ce44SJohn Forte } 465fcf3ce44SJohn Forte } 4668fe96085Stim szeto return (ret); 467fcf3ce44SJohn Forte } 468fcf3ce44SJohn Forte 4698fe96085Stim szeto static int 4708fe96085Stim szeto callModify(char *fname, stmfGuid *luGuid, uint32_t prop, const char *propVal, 4718fe96085Stim szeto const char *propString) 4728fe96085Stim szeto { 4738fe96085Stim szeto int ret = 0; 4748fe96085Stim szeto int stmfRet = 0; 4758fe96085Stim szeto 4768fe96085Stim szeto if (!fname) { 4778fe96085Stim szeto stmfRet = stmfModifyLu(luGuid, prop, propVal); 4788fe96085Stim szeto } else { 4798fe96085Stim szeto stmfRet = stmfModifyLuByFname(STMF_DISK, fname, prop, 4808fe96085Stim szeto propVal); 4818fe96085Stim szeto } 4828fe96085Stim szeto switch (stmfRet) { 4838fe96085Stim szeto case STMF_STATUS_SUCCESS: 4848fe96085Stim szeto break; 4858fe96085Stim szeto case STMF_ERROR_BUSY: 4868fe96085Stim szeto case STMF_ERROR_LU_BUSY: 4878fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 4888fe96085Stim szeto gettext("resource busy")); 4898fe96085Stim szeto ret++; 4908fe96085Stim szeto break; 4918fe96085Stim szeto case STMF_ERROR_PERM: 4928fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 4938fe96085Stim szeto gettext("permission denied")); 4948fe96085Stim szeto ret++; 4958fe96085Stim szeto break; 4968fe96085Stim szeto case STMF_ERROR_INVALID_BLKSIZE: 4978fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 4988fe96085Stim szeto gettext("invalid block size")); 4998fe96085Stim szeto ret++; 5008fe96085Stim szeto break; 5018fe96085Stim szeto case STMF_ERROR_GUID_IN_USE: 5028fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5038fe96085Stim szeto gettext("guid in use")); 5048fe96085Stim szeto ret++; 5058fe96085Stim szeto break; 5068fe96085Stim szeto case STMF_ERROR_META_FILE_NAME: 5078fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5088fe96085Stim szeto gettext("meta file error")); 5098fe96085Stim szeto ret++; 5108fe96085Stim szeto break; 5118fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME: 5128fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5138fe96085Stim szeto gettext("data file error")); 5148fe96085Stim szeto ret++; 5158fe96085Stim szeto break; 5168fe96085Stim szeto case STMF_ERROR_FILE_SIZE_INVALID: 5178fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5188fe96085Stim szeto gettext("file size invalid")); 5198fe96085Stim szeto ret++; 5208fe96085Stim szeto break; 5218fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE: 5228fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5238fe96085Stim szeto gettext("invalid size")); 5248fe96085Stim szeto ret++; 5258fe96085Stim szeto break; 5268fe96085Stim szeto case STMF_ERROR_META_CREATION: 5278fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5288fe96085Stim szeto gettext("could not create meta file")); 5298fe96085Stim szeto ret++; 5308fe96085Stim szeto break; 5318fe96085Stim szeto default: 5328fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s: %d\n", cmdName, 5338fe96085Stim szeto gettext("could not set property"), propString, 5348fe96085Stim szeto stmfRet); 5358fe96085Stim szeto ret++; 5368fe96085Stim szeto break; 5378fe96085Stim szeto } 5388fe96085Stim szeto 539fcf3ce44SJohn Forte return (ret); 540fcf3ce44SJohn Forte } 541fcf3ce44SJohn Forte 542fcf3ce44SJohn Forte 543fcf3ce44SJohn Forte /*ARGSUSED*/ 544fcf3ce44SJohn Forte int 545fcf3ce44SJohn Forte list_lus(int argc, char *argv[], cmdOptions_t *options, void *callData) 546fcf3ce44SJohn Forte { 5478fe96085Stim szeto int stmfRet; 5488fe96085Stim szeto stmfGuidList *luList; 5498fe96085Stim szeto stmfLogicalUnitProperties luProps; 5508fe96085Stim szeto int sbdLuCnt = 0; 5518fe96085Stim szeto int i; 552fcf3ce44SJohn Forte 5538fe96085Stim szeto if ((stmfRet = stmfGetLogicalUnitList(&luList)) 5548fe96085Stim szeto != STMF_STATUS_SUCCESS) { 5558fe96085Stim szeto switch (stmfRet) { 5568fe96085Stim szeto case STMF_ERROR_SERVICE_NOT_FOUND: 5578fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5588fe96085Stim szeto gettext("STMF service not found")); 5598fe96085Stim szeto break; 5608fe96085Stim szeto case STMF_ERROR_BUSY: 5618fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5628fe96085Stim szeto gettext("resource busy")); 5638fe96085Stim szeto break; 5648fe96085Stim szeto case STMF_ERROR_PERM: 5658fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5668fe96085Stim szeto gettext("permission denied")); 5678fe96085Stim szeto break; 5688fe96085Stim szeto case STMF_ERROR_SERVICE_DATA_VERSION: 5698fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5708fe96085Stim szeto gettext("STMF service version incorrect")); 5718fe96085Stim szeto break; 5728fe96085Stim szeto default: 5738fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5748fe96085Stim szeto gettext("list failed")); 5758fe96085Stim szeto break; 576fcf3ce44SJohn Forte } 577fcf3ce44SJohn Forte return (1); 578fcf3ce44SJohn Forte } 579fcf3ce44SJohn Forte 5808fe96085Stim szeto for (i = 0; i < luList->cnt; i++) { 5818fe96085Stim szeto stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i], 5828fe96085Stim szeto &luProps); 5838fe96085Stim szeto if (stmfRet != STMF_STATUS_SUCCESS) { 5848fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5858fe96085Stim szeto gettext("list failed")); 586fcf3ce44SJohn Forte return (1); 587fcf3ce44SJohn Forte } 5888fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) { 5898fe96085Stim szeto sbdLuCnt++; 590fcf3ce44SJohn Forte } 591fcf3ce44SJohn Forte } 592fcf3ce44SJohn Forte 593fcf3ce44SJohn Forte 5948fe96085Stim szeto if (sbdLuCnt == 0) 5958fe96085Stim szeto return (0); 5968fe96085Stim szeto 5978fe96085Stim szeto (void) printf("\nFound %d LU(s)\n", sbdLuCnt); 598fcf3ce44SJohn Forte print_attr_header(); 599fcf3ce44SJohn Forte 6008fe96085Stim szeto for (i = 0; i < luList->cnt; i++) { 6018fe96085Stim szeto stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i], 6028fe96085Stim szeto &luProps); 6038fe96085Stim szeto if (stmfRet != STMF_STATUS_SUCCESS) { 6048fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 6058fe96085Stim szeto gettext("list failed")); 6068fe96085Stim szeto return (1); 607fcf3ce44SJohn Forte } 6088fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) { 6098fe96085Stim szeto (void) print_lu_attr(&luList->guid[i]); 6108fe96085Stim szeto } 6118fe96085Stim szeto } 612fcf3ce44SJohn Forte return (0); 613fcf3ce44SJohn Forte } 614fcf3ce44SJohn Forte 615fcf3ce44SJohn Forte void 616fcf3ce44SJohn Forte print_attr_header() 617fcf3ce44SJohn Forte { 618fcf3ce44SJohn Forte (void) printf("\n"); 619fcf3ce44SJohn Forte (void) printf(" GUID DATA SIZE " 620fcf3ce44SJohn Forte " SOURCE\n"); 621fcf3ce44SJohn Forte (void) printf("-------------------------------- -------------------" 622fcf3ce44SJohn Forte " ----------------\n"); 623fcf3ce44SJohn Forte } 624fcf3ce44SJohn Forte 625fcf3ce44SJohn Forte void 626fcf3ce44SJohn Forte print_guid(uint8_t *g, FILE *f) 627fcf3ce44SJohn Forte { 628fcf3ce44SJohn Forte int i; 629fcf3ce44SJohn Forte 630fcf3ce44SJohn Forte for (i = 0; i < 16; i++) { 631fcf3ce44SJohn Forte (void) fprintf(f, "%02x", g[i]); 632fcf3ce44SJohn Forte } 633fcf3ce44SJohn Forte } 634fcf3ce44SJohn Forte 635fcf3ce44SJohn Forte int 6368fe96085Stim szeto print_lu_attr(stmfGuid *guid) 637fcf3ce44SJohn Forte { 6388fe96085Stim szeto luResource hdl = NULL; 6398fe96085Stim szeto int stmfRet = 0; 6408fe96085Stim szeto int ret = 0; 6418fe96085Stim szeto char propVal[MAXPATHLEN]; 6428fe96085Stim szeto size_t propValSize = sizeof (propVal); 643fcf3ce44SJohn Forte 6448fe96085Stim szeto if ((stmfRet = stmfGetLuResource(guid, &hdl)) != STMF_STATUS_SUCCESS) { 6458fe96085Stim szeto switch (stmfRet) { 6468fe96085Stim szeto case STMF_ERROR_BUSY: 6478fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 6488fe96085Stim szeto gettext("resource busy")); 6498fe96085Stim szeto break; 6508fe96085Stim szeto case STMF_ERROR_PERM: 6518fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 6528fe96085Stim szeto gettext("permission denied")); 6538fe96085Stim szeto break; 6548fe96085Stim szeto case STMF_ERROR_NOT_FOUND: 6558fe96085Stim szeto /* No error here */ 656fcf3ce44SJohn Forte return (0); 6578fe96085Stim szeto default: 6588fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 6598fe96085Stim szeto gettext("get extended properties failed")); 6608fe96085Stim szeto break; 661fcf3ce44SJohn Forte } 662fcf3ce44SJohn Forte return (1); 663fcf3ce44SJohn Forte } 6648fe96085Stim szeto 6658fe96085Stim szeto print_guid((uint8_t *)guid, stdout); 6668fe96085Stim szeto 6678fe96085Stim szeto stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_SIZE, propVal, 6688fe96085Stim szeto &propValSize); 6698fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 6708fe96085Stim szeto (void) printf(" %-19s ", propVal); 6718fe96085Stim szeto } else if (stmfRet == STMF_ERROR_NO_PROP) { 6728fe96085Stim szeto (void) printf("not set\n"); 6738fe96085Stim szeto } else { 67445039663SJohn Forte (void) printf("<error retrieving property>\n"); 6758fe96085Stim szeto ret++; 6768fe96085Stim szeto } 6778fe96085Stim szeto 6788fe96085Stim szeto stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_FILENAME, propVal, 6798fe96085Stim szeto &propValSize); 6808fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 6818fe96085Stim szeto (void) printf("%s\n", propVal); 6828fe96085Stim szeto } else if (stmfRet == STMF_ERROR_NO_PROP) { 6838fe96085Stim szeto (void) printf("not set\n"); 6848fe96085Stim szeto } else { 68545039663SJohn Forte (void) printf("<error retrieving property>\n"); 6868fe96085Stim szeto ret++; 6878fe96085Stim szeto } 6888fe96085Stim szeto 6898fe96085Stim szeto 6908fe96085Stim szeto (void) stmfFreeLuResource(hdl); 6918fe96085Stim szeto return (ret); 6928fe96085Stim szeto } 6938fe96085Stim szeto 6948fe96085Stim szeto /* 6958fe96085Stim szeto * input: 6968fe96085Stim szeto * execFullName - exec name of program (argv[0]) 6978fe96085Stim szeto * 6988fe96085Stim szeto * copied from usr/src/cmd/zoneadm/zoneadm.c in OS/Net 6998fe96085Stim szeto * (changed name to lowerCamelCase to keep consistent with this file) 7008fe96085Stim szeto * 7018fe96085Stim szeto * Returns: 7028fe96085Stim szeto * command name portion of execFullName 7038fe96085Stim szeto */ 7048fe96085Stim szeto static char * 7058fe96085Stim szeto getExecBasename(char *execFullname) 7068fe96085Stim szeto { 7078fe96085Stim szeto char *lastSlash, *execBasename; 7088fe96085Stim szeto 7098fe96085Stim szeto /* guard against '/' at end of command invocation */ 7108fe96085Stim szeto for (;;) { 7118fe96085Stim szeto lastSlash = strrchr(execFullname, '/'); 7128fe96085Stim szeto if (lastSlash == NULL) { 7138fe96085Stim szeto execBasename = execFullname; 7148fe96085Stim szeto break; 7158fe96085Stim szeto } else { 7168fe96085Stim szeto execBasename = lastSlash + 1; 7178fe96085Stim szeto if (*execBasename == '\0') { 7188fe96085Stim szeto *lastSlash = '\0'; 7198fe96085Stim szeto continue; 7208fe96085Stim szeto } 7218fe96085Stim szeto break; 7228fe96085Stim szeto } 7238fe96085Stim szeto } 7248fe96085Stim szeto return (execBasename); 7258fe96085Stim szeto } 7268fe96085Stim szeto int 7278fe96085Stim szeto main(int argc, char *argv[]) 7288fe96085Stim szeto { 7298fe96085Stim szeto synTables_t synTables; 7308fe96085Stim szeto char versionString[VERSION_STRING_MAX_LEN]; 7318fe96085Stim szeto int ret; 7328fe96085Stim szeto int funcRet; 7338fe96085Stim szeto void *subcommandArgs = NULL; 7348fe96085Stim szeto 7358fe96085Stim szeto (void) setlocale(LC_ALL, ""); 7368fe96085Stim szeto (void) textdomain(TEXT_DOMAIN); 7378fe96085Stim szeto /* set global command name */ 7388fe96085Stim szeto cmdName = getExecBasename(argv[0]); 7398fe96085Stim szeto 7408fe96085Stim szeto (void) snprintf(versionString, VERSION_STRING_MAX_LEN, "%s.%s", 7418fe96085Stim szeto VERSION_STRING_MAJOR, VERSION_STRING_MINOR); 7428fe96085Stim szeto synTables.versionString = versionString; 7438fe96085Stim szeto synTables.longOptionTbl = options; 7448fe96085Stim szeto synTables.subCommandPropsTbl = subCommands; 7458fe96085Stim szeto 7468fe96085Stim szeto ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet); 7478fe96085Stim szeto if (ret != 0) { 7488fe96085Stim szeto return (ret); 7498fe96085Stim szeto } 7508fe96085Stim szeto 7518fe96085Stim szeto return (funcRet); 7528fe96085Stim szeto } /* end main */ 753