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 /* 228fe96085Stim szeto * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23fcf3ce44SJohn Forte * Use is subject to license terms. 24fcf3ce44SJohn Forte */ 25fcf3ce44SJohn Forte #include <stdlib.h> 26fcf3ce44SJohn Forte #include <stdio.h> 27fcf3ce44SJohn Forte #include <sys/types.h> 28fcf3ce44SJohn Forte #include <sys/stat.h> 29fcf3ce44SJohn Forte #include <fcntl.h> 30fcf3ce44SJohn Forte #include <unistd.h> 31fcf3ce44SJohn Forte #include <libintl.h> 32fcf3ce44SJohn Forte #include <errno.h> 33fcf3ce44SJohn Forte #include <string.h> 34fcf3ce44SJohn Forte #include <assert.h> 35fcf3ce44SJohn Forte #include <getopt.h> 36fcf3ce44SJohn Forte #include <strings.h> 37fcf3ce44SJohn Forte #include <ctype.h> 38fcf3ce44SJohn Forte #include <libnvpair.h> 398fe96085Stim szeto #include <locale.h> 40fcf3ce44SJohn Forte 41fcf3ce44SJohn Forte #include <cmdparse.h> 42fcf3ce44SJohn Forte #include <sys/stmf_defines.h> 43fcf3ce44SJohn Forte #include <libstmf.h> 44fcf3ce44SJohn Forte #include <sys/stmf_sbd_ioctl.h> 45fcf3ce44SJohn Forte 46fcf3ce44SJohn Forte #define MAX_LU_LIST 8192 47fcf3ce44SJohn Forte #define LU_LIST_MAX_RETRIES 3 488fe96085Stim szeto #define GUID_INPUT 32 49fcf3ce44SJohn Forte 508fe96085Stim szeto #define VERSION_STRING_MAJOR "1" 518fe96085Stim szeto #define VERSION_STRING_MINOR "0" 528fe96085Stim szeto #define VERSION_STRING_MAX_LEN 10 53fcf3ce44SJohn Forte 548fe96085Stim szeto 558fe96085Stim szeto char *cmdName; 568fe96085Stim szeto 578fe96085Stim szeto static char *getExecBasename(char *); 58fcf3ce44SJohn Forte int delete_lu(int argc, char *argv[], cmdOptions_t *options, 59fcf3ce44SJohn Forte void *callData); 60fcf3ce44SJohn Forte int create_lu(int argc, char *argv[], cmdOptions_t *options, void *callData); 61fcf3ce44SJohn Forte int list_lus(int argc, char *argv[], cmdOptions_t *options, void *callData); 62fcf3ce44SJohn Forte int modify_lu(int argc, char *argv[], cmdOptions_t *options, void *callData); 638fe96085Stim szeto int import_lu(int argc, char *argv[], cmdOptions_t *options, void *callData); 648fe96085Stim szeto static int callModify(char *, stmfGuid *, uint32_t, const char *, const char *); 658fe96085Stim szeto int print_lu_attr(stmfGuid *); 66fcf3ce44SJohn Forte void print_guid(uint8_t *g, FILE *f); 67fcf3ce44SJohn Forte void print_attr_header(); 68fcf3ce44SJohn Forte 69fcf3ce44SJohn Forte optionTbl_t options[] = { 70fcf3ce44SJohn Forte { "disk-size", required_argument, 's', 71fcf3ce44SJohn Forte "Size with <none>/k/m/g/t/p/e modifier" }, 72fcf3ce44SJohn Forte { "keep-views", no_arg, 'k', 73fcf3ce44SJohn Forte "Dont delete view entries related to the LU" }, 74fcf3ce44SJohn Forte { NULL, 0, 0 } 75fcf3ce44SJohn Forte }; 76fcf3ce44SJohn Forte 77fcf3ce44SJohn Forte subCommandProps_t subCommands[] = { 78fcf3ce44SJohn Forte { "create-lu", create_lu, "s", NULL, NULL, 79fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE, 80fcf3ce44SJohn Forte "Full path of the file to initialize" }, 81fcf3ce44SJohn Forte { "delete-lu", delete_lu, "k", NULL, NULL, 82fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE, "GUID of the LU to deregister" }, 83fcf3ce44SJohn Forte { "import-lu", import_lu, NULL, NULL, NULL, 84fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE, "filename of the LU to import" }, 85fcf3ce44SJohn Forte { "list-lu", list_lus, NULL, NULL, NULL, 86fcf3ce44SJohn Forte OPERAND_NONE, "List all the exported LUs" }, 87fcf3ce44SJohn Forte { "modify-lu", modify_lu, "s", "s", NULL, 88fcf3ce44SJohn Forte OPERAND_MANDATORY_SINGLE, 89fcf3ce44SJohn Forte "Full path of the LU or GUID of a registered LU" }, 90fcf3ce44SJohn Forte { NULL, 0, 0, NULL, 0, NULL} 91fcf3ce44SJohn Forte }; 92fcf3ce44SJohn Forte 938fe96085Stim szeto /*ARGSUSED*/ 94fcf3ce44SJohn Forte int 958fe96085Stim szeto create_lu(int argc, char *operands[], cmdOptions_t *options, void *callData) 96fcf3ce44SJohn Forte { 978fe96085Stim szeto luResource hdl = NULL; 98fcf3ce44SJohn Forte int ret = 0; 998fe96085Stim szeto stmfGuid createdGuid; 100fcf3ce44SJohn Forte 1018fe96085Stim szeto ret = stmfCreateLuResource(STMF_DISK, &hdl); 1028fe96085Stim szeto 103fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 1048fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", 1058fe96085Stim szeto cmdName, gettext("Failure to create lu resource\n")); 106fcf3ce44SJohn Forte return (1); 107fcf3ce44SJohn Forte } 108fcf3ce44SJohn Forte 109fcf3ce44SJohn Forte for (; options->optval; options++) { 110fcf3ce44SJohn Forte switch (options->optval) { 1118fe96085Stim szeto case 's': 1128fe96085Stim szeto ret = stmfSetLuProp(hdl, STMF_LU_PROP_SIZE, 1138fe96085Stim szeto options->optarg); 1148fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 1158fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 1168fe96085Stim szeto cmdName, options->optval, 1178fe96085Stim szeto gettext("size param invalid")); 1188fe96085Stim szeto (void) stmfFreeLuResource(hdl); 1198fe96085Stim szeto return (1); 1208fe96085Stim szeto } 1218fe96085Stim szeto break; 1228fe96085Stim szeto default: 1238fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 1248fe96085Stim szeto cmdName, options->optval, 1258fe96085Stim szeto gettext("unknown option")); 1268fe96085Stim szeto return (1); 1278fe96085Stim szeto } 1288fe96085Stim szeto } 1298fe96085Stim szeto 1308fe96085Stim szeto ret = stmfSetLuProp(hdl, STMF_LU_PROP_FILENAME, operands[0]); 1318fe96085Stim szeto 1328fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 1338fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", 1348fe96085Stim szeto cmdName, gettext("could not set filename")); 1358fe96085Stim szeto return (1); 1368fe96085Stim szeto } 1378fe96085Stim szeto 1388fe96085Stim szeto ret = stmfCreateLu(hdl, &createdGuid); 1398fe96085Stim szeto switch (ret) { 1408fe96085Stim szeto case STMF_STATUS_SUCCESS: 1418fe96085Stim szeto break; 1428fe96085Stim szeto case STMF_ERROR_BUSY: 1438fe96085Stim szeto case STMF_ERROR_LU_BUSY: 1448fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1458fe96085Stim szeto gettext("resource busy")); 1468fe96085Stim szeto ret++; 1478fe96085Stim szeto break; 1488fe96085Stim szeto case STMF_ERROR_PERM: 1498fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1508fe96085Stim szeto gettext("permission denied")); 1518fe96085Stim szeto ret++; 1528fe96085Stim szeto break; 1538fe96085Stim szeto case STMF_ERROR_FILE_IN_USE: 1548fe96085Stim szeto (void) fprintf(stderr, "%s: filename %s: %s\n", cmdName, 1558fe96085Stim szeto operands[0], gettext("in use")); 1568fe96085Stim szeto ret++; 1578fe96085Stim szeto break; 1588fe96085Stim szeto case STMF_ERROR_INVALID_BLKSIZE: 1598fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1608fe96085Stim szeto gettext("invalid block size")); 1618fe96085Stim szeto ret++; 1628fe96085Stim szeto break; 1638fe96085Stim szeto case STMF_ERROR_GUID_IN_USE: 1648fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1658fe96085Stim szeto gettext("guid in use")); 1668fe96085Stim szeto ret++; 1678fe96085Stim szeto break; 1688fe96085Stim szeto case STMF_ERROR_META_FILE_NAME: 1698fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1708fe96085Stim szeto gettext("meta file error")); 1718fe96085Stim szeto ret++; 1728fe96085Stim szeto break; 1738fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME: 1748fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1758fe96085Stim szeto gettext("data file error")); 1768fe96085Stim szeto ret++; 1778fe96085Stim szeto break; 1788fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE: 1798fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1808fe96085Stim szeto gettext("invalid size")); 1818fe96085Stim szeto ret++; 1828fe96085Stim szeto break; 1838fe96085Stim szeto case STMF_ERROR_META_CREATION: 1848fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1858fe96085Stim szeto gettext("could not create meta file")); 1868fe96085Stim szeto ret++; 1878fe96085Stim szeto break; 1888fe96085Stim szeto default: 1898fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 1908fe96085Stim szeto gettext("unknown error")); 1918fe96085Stim szeto ret++; 192fcf3ce44SJohn Forte break; 193fcf3ce44SJohn Forte } 1948fe96085Stim szeto 1958fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 1968fe96085Stim szeto goto done; 197fcf3ce44SJohn Forte } 198fcf3ce44SJohn Forte 1998fe96085Stim szeto (void) printf("Created the following LU:\n"); 2008fe96085Stim szeto print_attr_header(); 2018fe96085Stim szeto ret = print_lu_attr(&createdGuid); 202fcf3ce44SJohn Forte 2038fe96085Stim szeto done: 2048fe96085Stim szeto (void) stmfFreeLuResource(hdl); 205fcf3ce44SJohn Forte return (ret); 206fcf3ce44SJohn Forte } 207fcf3ce44SJohn Forte 208fcf3ce44SJohn Forte /*ARGSUSED*/ 209fcf3ce44SJohn Forte int 2108fe96085Stim szeto import_lu(int argc, char *operands[], cmdOptions_t *options, void *callData) 211fcf3ce44SJohn Forte { 2128fe96085Stim szeto int ret = 0; 2138fe96085Stim szeto stmfGuid createdGuid; 214fcf3ce44SJohn Forte 2158fe96085Stim szeto ret = stmfImportLu(STMF_DISK, operands[0], &createdGuid); 2168fe96085Stim szeto switch (ret) { 2178fe96085Stim szeto case STMF_STATUS_SUCCESS: 2188fe96085Stim szeto break; 2198fe96085Stim szeto case STMF_ERROR_BUSY: 2208fe96085Stim szeto case STMF_ERROR_LU_BUSY: 2218fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2228fe96085Stim szeto gettext("resource busy")); 2238fe96085Stim szeto ret++; 2248fe96085Stim szeto break; 2258fe96085Stim szeto case STMF_ERROR_PERM: 2268fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2278fe96085Stim szeto gettext("permission denied")); 2288fe96085Stim szeto ret++; 2298fe96085Stim szeto break; 2308fe96085Stim szeto case STMF_ERROR_FILE_IN_USE: 2318fe96085Stim szeto (void) fprintf(stderr, "%s: filename %s: %s\n", cmdName, 2328fe96085Stim szeto operands[0], gettext("in use")); 2338fe96085Stim szeto ret++; 2348fe96085Stim szeto break; 2358fe96085Stim szeto case STMF_ERROR_GUID_IN_USE: 2368fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2378fe96085Stim szeto gettext("guid in use")); 2388fe96085Stim szeto ret++; 2398fe96085Stim szeto break; 2408fe96085Stim szeto case STMF_ERROR_META_FILE_NAME: 2418fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2428fe96085Stim szeto gettext("meta file error")); 2438fe96085Stim szeto ret++; 2448fe96085Stim szeto break; 2458fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME: 2468fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2478fe96085Stim szeto gettext("data file error")); 2488fe96085Stim szeto ret++; 2498fe96085Stim szeto break; 2508fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE: 2518fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2528fe96085Stim szeto gettext("invalid size")); 2538fe96085Stim szeto ret++; 2548fe96085Stim szeto break; 2558fe96085Stim szeto case STMF_ERROR_META_CREATION: 2568fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2578fe96085Stim szeto gettext("could not create meta file")); 2588fe96085Stim szeto ret++; 2598fe96085Stim szeto break; 2608fe96085Stim szeto default: 2618fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 2628fe96085Stim szeto gettext("unknown error")); 2638fe96085Stim szeto ret++; 2648fe96085Stim szeto break; 265fcf3ce44SJohn Forte } 2668fe96085Stim szeto 2678fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 2688fe96085Stim szeto goto done; 2698fe96085Stim szeto } 2708fe96085Stim szeto 2718fe96085Stim szeto (void) printf("Imported the following LU:\n"); 2728fe96085Stim szeto print_attr_header(); 2738fe96085Stim szeto ret = print_lu_attr(&createdGuid); 2748fe96085Stim szeto 2758fe96085Stim szeto done: 2768fe96085Stim szeto return (ret); 2778fe96085Stim szeto } 2788fe96085Stim szeto 2798fe96085Stim szeto /*ARGSUSED*/ 2808fe96085Stim szeto int 2818fe96085Stim szeto delete_lu(int operandLen, char *operands[], cmdOptions_t *options, 2828fe96085Stim szeto void *callData) 2838fe96085Stim szeto { 2848fe96085Stim szeto int i, j; 2858fe96085Stim szeto int ret = 0; 2868fe96085Stim szeto int stmfRet; 2878fe96085Stim szeto unsigned int inGuid[sizeof (stmfGuid)]; 2888fe96085Stim szeto stmfGuid delGuid; 2898fe96085Stim szeto boolean_t keepViews = B_FALSE; 2908fe96085Stim szeto boolean_t viewEntriesRemoved = B_FALSE; 2918fe96085Stim szeto boolean_t noLunFound = B_FALSE; 2928fe96085Stim szeto boolean_t views = B_FALSE; 2938fe96085Stim szeto char sGuid[GUID_INPUT + 1]; 2948fe96085Stim szeto stmfViewEntryList *viewEntryList = NULL; 2958fe96085Stim szeto 2968fe96085Stim szeto for (; options->optval; options++) { 2978fe96085Stim szeto switch (options->optval) { 2988fe96085Stim szeto /* Keep views for logical unit */ 2998fe96085Stim szeto case 'k': 3008fe96085Stim szeto keepViews = B_TRUE; 3018fe96085Stim szeto break; 3028fe96085Stim szeto default: 3038fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 3048fe96085Stim szeto cmdName, options->optval, 3058fe96085Stim szeto gettext("unknown option")); 306fcf3ce44SJohn Forte return (1); 307fcf3ce44SJohn Forte } 3088fe96085Stim szeto } 309fcf3ce44SJohn Forte 3108fe96085Stim szeto 3118fe96085Stim szeto for (i = 0; i < operandLen; i++) { 3128fe96085Stim szeto for (j = 0; j < GUID_INPUT; j++) { 3138fe96085Stim szeto if (!isxdigit(operands[i][j])) { 3148fe96085Stim szeto break; 3158fe96085Stim szeto } 3168fe96085Stim szeto sGuid[j] = tolower(operands[i][j]); 3178fe96085Stim szeto } 3188fe96085Stim szeto if (j != GUID_INPUT) { 3198fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s%d%s\n", 3208fe96085Stim szeto cmdName, operands[i], gettext("must be "), 3218fe96085Stim szeto GUID_INPUT, 3228fe96085Stim szeto gettext(" hexadecimal digits long")); 3238fe96085Stim szeto ret++; 3248fe96085Stim szeto continue; 3258fe96085Stim szeto } 3268fe96085Stim szeto 3278fe96085Stim szeto sGuid[j] = 0; 3288fe96085Stim szeto 3298fe96085Stim szeto (void) sscanf(sGuid, 3308fe96085Stim szeto "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", 3318fe96085Stim szeto &inGuid[0], &inGuid[1], &inGuid[2], &inGuid[3], 3328fe96085Stim szeto &inGuid[4], &inGuid[5], &inGuid[6], &inGuid[7], 3338fe96085Stim szeto &inGuid[8], &inGuid[9], &inGuid[10], &inGuid[11], 3348fe96085Stim szeto &inGuid[12], &inGuid[13], &inGuid[14], &inGuid[15]); 3358fe96085Stim szeto 3368fe96085Stim szeto for (j = 0; j < sizeof (stmfGuid); j++) { 3378fe96085Stim szeto delGuid.guid[j] = inGuid[j]; 3388fe96085Stim szeto } 3398fe96085Stim szeto 3408fe96085Stim szeto stmfRet = stmfDeleteLu(&delGuid); 3418fe96085Stim szeto switch (stmfRet) { 3428fe96085Stim szeto case STMF_STATUS_SUCCESS: 3438fe96085Stim szeto break; 3448fe96085Stim szeto case STMF_ERROR_NOT_FOUND: 3458fe96085Stim szeto noLunFound = B_TRUE; 3468fe96085Stim szeto break; 3478fe96085Stim szeto case STMF_ERROR_BUSY: 3488fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 3498fe96085Stim szeto gettext("resource busy")); 3508fe96085Stim szeto ret++; 3518fe96085Stim szeto break; 3528fe96085Stim szeto case STMF_ERROR_PERM: 3538fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 3548fe96085Stim szeto gettext("permission denied")); 3558fe96085Stim szeto ret++; 3568fe96085Stim szeto break; 3578fe96085Stim szeto default: 3588fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 3598fe96085Stim szeto gettext("unknown error")); 3608fe96085Stim szeto ret++; 3618fe96085Stim szeto break; 3628fe96085Stim szeto } 3638fe96085Stim szeto 3648fe96085Stim szeto if (!keepViews) { 3658fe96085Stim szeto stmfRet = stmfGetViewEntryList(&delGuid, 3668fe96085Stim szeto &viewEntryList); 3678fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 3688fe96085Stim szeto for (j = 0; j < viewEntryList->cnt; j++) { 3698fe96085Stim szeto (void) stmfRemoveViewEntry(&delGuid, 3708fe96085Stim szeto viewEntryList->ve[j].veIndex); 3718fe96085Stim szeto } 3728fe96085Stim szeto viewEntriesRemoved = B_TRUE; 3738fe96085Stim szeto stmfFreeMemory(viewEntryList); 3748fe96085Stim szeto } else if (stmfRet != STMF_ERROR_NOT_FOUND) { 3758fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 3768fe96085Stim szeto gettext("unable to remove view entries\n")); 3778fe96085Stim szeto ret++; 3788fe96085Stim szeto } /* No view entries to remove */ 3798fe96085Stim szeto } 3808fe96085Stim szeto if (keepViews) { 3818fe96085Stim szeto stmfRet = stmfGetViewEntryList(&delGuid, 3828fe96085Stim szeto &viewEntryList); 3838fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 3848fe96085Stim szeto views = B_TRUE; 3858fe96085Stim szeto stmfFreeMemory(viewEntryList); 3868fe96085Stim szeto } 3878fe96085Stim szeto } 3888fe96085Stim szeto 3898fe96085Stim szeto if ((!viewEntriesRemoved && noLunFound && !views) || 3908fe96085Stim szeto (!views && keepViews && noLunFound)) { 3918fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s\n", 3928fe96085Stim szeto cmdName, sGuid, 3938fe96085Stim szeto gettext("not found")); 3948fe96085Stim szeto ret++; 3958fe96085Stim szeto } 3968fe96085Stim szeto noLunFound = viewEntriesRemoved = views = B_FALSE; 3978fe96085Stim szeto } 3988fe96085Stim szeto return (ret); 3998fe96085Stim szeto } 4008fe96085Stim szeto 4018fe96085Stim szeto /*ARGSUSED*/ 4028fe96085Stim szeto int 4038fe96085Stim szeto modify_lu(int operandLen, char *operands[], cmdOptions_t *options, 4048fe96085Stim szeto void *callData) 4058fe96085Stim szeto { 4068fe96085Stim szeto stmfGuid inGuid; 4078fe96085Stim szeto unsigned int guid[sizeof (stmfGuid)]; 4088fe96085Stim szeto int ret = 0; 4098fe96085Stim szeto int i; 4108fe96085Stim szeto char *fname = NULL; 4118fe96085Stim szeto char sGuid[GUID_INPUT + 1]; 4128fe96085Stim szeto boolean_t fnameUsed = B_FALSE; 4138fe96085Stim szeto 4148fe96085Stim szeto if (operands[0][0] == '/') { 4158fe96085Stim szeto fnameUsed = B_TRUE; 4168fe96085Stim szeto fname = operands[0]; 4178fe96085Stim szeto } 4188fe96085Stim szeto 4198fe96085Stim szeto /* check input length */ 4208fe96085Stim szeto if (!fnameUsed && strlen(operands[0]) != GUID_INPUT) { 4218fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s%d%s\n", cmdName, operands[0], 4228fe96085Stim szeto gettext("must be "), GUID_INPUT, 4238fe96085Stim szeto gettext(" hexadecimal digits")); 4248fe96085Stim szeto return (1); 4258fe96085Stim szeto } 4268fe96085Stim szeto 4278fe96085Stim szeto if (!fnameUsed) { 4288fe96085Stim szeto /* convert to lower case for scan */ 4298fe96085Stim szeto for (i = 0; i < 32; i++) 4308fe96085Stim szeto sGuid[i] = tolower(operands[0][i]); 4318fe96085Stim szeto sGuid[i] = 0; 4328fe96085Stim szeto (void) sscanf(sGuid, 4338fe96085Stim szeto "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", 4348fe96085Stim szeto &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5], 4358fe96085Stim szeto &guid[6], &guid[7], &guid[8], &guid[9], &guid[10], 4368fe96085Stim szeto &guid[11], &guid[12], &guid[13], &guid[14], &guid[15]); 4378fe96085Stim szeto 4388fe96085Stim szeto for (i = 0; i < sizeof (stmfGuid); i++) { 4398fe96085Stim szeto inGuid.guid[i] = guid[i]; 4408fe96085Stim szeto } 4418fe96085Stim szeto } 4428fe96085Stim szeto 443fcf3ce44SJohn Forte for (; options->optval; options++) { 4448fe96085Stim szeto switch (options->optval) { 4458fe96085Stim szeto case 's': 4468fe96085Stim szeto if (callModify(fname, &inGuid, 4478fe96085Stim szeto STMF_LU_PROP_SIZE, options->optarg, 4488fe96085Stim szeto "size") != 0) { 4498fe96085Stim szeto return (1); 450fcf3ce44SJohn Forte } 4518fe96085Stim szeto break; 4528fe96085Stim szeto default: 4538fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 4548fe96085Stim szeto cmdName, options->optval, 4558fe96085Stim szeto gettext("unknown option")); 4568fe96085Stim szeto return (1); 457fcf3ce44SJohn Forte } 458fcf3ce44SJohn Forte } 4598fe96085Stim szeto return (ret); 460fcf3ce44SJohn Forte } 461fcf3ce44SJohn Forte 4628fe96085Stim szeto static int 4638fe96085Stim szeto callModify(char *fname, stmfGuid *luGuid, uint32_t prop, const char *propVal, 4648fe96085Stim szeto const char *propString) 4658fe96085Stim szeto { 4668fe96085Stim szeto int ret = 0; 4678fe96085Stim szeto int stmfRet = 0; 4688fe96085Stim szeto 4698fe96085Stim szeto if (!fname) { 4708fe96085Stim szeto stmfRet = stmfModifyLu(luGuid, prop, propVal); 4718fe96085Stim szeto } else { 4728fe96085Stim szeto stmfRet = stmfModifyLuByFname(STMF_DISK, fname, prop, 4738fe96085Stim szeto propVal); 4748fe96085Stim szeto } 4758fe96085Stim szeto switch (stmfRet) { 4768fe96085Stim szeto case STMF_STATUS_SUCCESS: 4778fe96085Stim szeto break; 4788fe96085Stim szeto case STMF_ERROR_BUSY: 4798fe96085Stim szeto case STMF_ERROR_LU_BUSY: 4808fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 4818fe96085Stim szeto gettext("resource busy")); 4828fe96085Stim szeto ret++; 4838fe96085Stim szeto break; 4848fe96085Stim szeto case STMF_ERROR_PERM: 4858fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 4868fe96085Stim szeto gettext("permission denied")); 4878fe96085Stim szeto ret++; 4888fe96085Stim szeto break; 4898fe96085Stim szeto case STMF_ERROR_INVALID_BLKSIZE: 4908fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 4918fe96085Stim szeto gettext("invalid block size")); 4928fe96085Stim szeto ret++; 4938fe96085Stim szeto break; 4948fe96085Stim szeto case STMF_ERROR_GUID_IN_USE: 4958fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 4968fe96085Stim szeto gettext("guid in use")); 4978fe96085Stim szeto ret++; 4988fe96085Stim szeto break; 4998fe96085Stim szeto case STMF_ERROR_META_FILE_NAME: 5008fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5018fe96085Stim szeto gettext("meta file error")); 5028fe96085Stim szeto ret++; 5038fe96085Stim szeto break; 5048fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME: 5058fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5068fe96085Stim szeto gettext("data file error")); 5078fe96085Stim szeto ret++; 5088fe96085Stim szeto break; 5098fe96085Stim szeto case STMF_ERROR_FILE_SIZE_INVALID: 5108fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5118fe96085Stim szeto gettext("file size invalid")); 5128fe96085Stim szeto ret++; 5138fe96085Stim szeto break; 5148fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE: 5158fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5168fe96085Stim szeto gettext("invalid size")); 5178fe96085Stim szeto ret++; 5188fe96085Stim szeto break; 5198fe96085Stim szeto case STMF_ERROR_META_CREATION: 5208fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5218fe96085Stim szeto gettext("could not create meta file")); 5228fe96085Stim szeto ret++; 5238fe96085Stim szeto break; 5248fe96085Stim szeto default: 5258fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s: %d\n", cmdName, 5268fe96085Stim szeto gettext("could not set property"), propString, 5278fe96085Stim szeto stmfRet); 5288fe96085Stim szeto ret++; 5298fe96085Stim szeto break; 5308fe96085Stim szeto } 5318fe96085Stim szeto 532fcf3ce44SJohn Forte return (ret); 533fcf3ce44SJohn Forte } 534fcf3ce44SJohn Forte 535fcf3ce44SJohn Forte 536fcf3ce44SJohn Forte /*ARGSUSED*/ 537fcf3ce44SJohn Forte int 538fcf3ce44SJohn Forte list_lus(int argc, char *argv[], cmdOptions_t *options, void *callData) 539fcf3ce44SJohn Forte { 5408fe96085Stim szeto int stmfRet; 5418fe96085Stim szeto stmfGuidList *luList; 5428fe96085Stim szeto stmfLogicalUnitProperties luProps; 5438fe96085Stim szeto int sbdLuCnt = 0; 5448fe96085Stim szeto int i; 545fcf3ce44SJohn Forte 5468fe96085Stim szeto if ((stmfRet = stmfGetLogicalUnitList(&luList)) 5478fe96085Stim szeto != STMF_STATUS_SUCCESS) { 5488fe96085Stim szeto switch (stmfRet) { 5498fe96085Stim szeto case STMF_ERROR_SERVICE_NOT_FOUND: 5508fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5518fe96085Stim szeto gettext("STMF service not found")); 5528fe96085Stim szeto break; 5538fe96085Stim szeto case STMF_ERROR_BUSY: 5548fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5558fe96085Stim szeto gettext("resource busy")); 5568fe96085Stim szeto break; 5578fe96085Stim szeto case STMF_ERROR_PERM: 5588fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5598fe96085Stim szeto gettext("permission denied")); 5608fe96085Stim szeto break; 5618fe96085Stim szeto case STMF_ERROR_SERVICE_DATA_VERSION: 5628fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5638fe96085Stim szeto gettext("STMF service version incorrect")); 5648fe96085Stim szeto break; 5658fe96085Stim szeto default: 5668fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5678fe96085Stim szeto gettext("list failed")); 5688fe96085Stim szeto break; 569fcf3ce44SJohn Forte } 570fcf3ce44SJohn Forte return (1); 571fcf3ce44SJohn Forte } 572fcf3ce44SJohn Forte 5738fe96085Stim szeto for (i = 0; i < luList->cnt; i++) { 5748fe96085Stim szeto stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i], 5758fe96085Stim szeto &luProps); 5768fe96085Stim szeto if (stmfRet != STMF_STATUS_SUCCESS) { 5778fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5788fe96085Stim szeto gettext("list failed")); 579fcf3ce44SJohn Forte return (1); 580fcf3ce44SJohn Forte } 5818fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) { 5828fe96085Stim szeto sbdLuCnt++; 583fcf3ce44SJohn Forte } 584fcf3ce44SJohn Forte } 585fcf3ce44SJohn Forte 586fcf3ce44SJohn Forte 5878fe96085Stim szeto if (sbdLuCnt == 0) 5888fe96085Stim szeto return (0); 5898fe96085Stim szeto 5908fe96085Stim szeto (void) printf("\nFound %d LU(s)\n", sbdLuCnt); 591fcf3ce44SJohn Forte print_attr_header(); 592fcf3ce44SJohn Forte 5938fe96085Stim szeto for (i = 0; i < luList->cnt; i++) { 5948fe96085Stim szeto stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i], 5958fe96085Stim szeto &luProps); 5968fe96085Stim szeto if (stmfRet != STMF_STATUS_SUCCESS) { 5978fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 5988fe96085Stim szeto gettext("list failed")); 5998fe96085Stim szeto return (1); 600fcf3ce44SJohn Forte } 6018fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) { 6028fe96085Stim szeto (void) print_lu_attr(&luList->guid[i]); 6038fe96085Stim szeto } 6048fe96085Stim szeto } 605fcf3ce44SJohn Forte return (0); 606fcf3ce44SJohn Forte } 607fcf3ce44SJohn Forte 608fcf3ce44SJohn Forte void 609fcf3ce44SJohn Forte print_attr_header() 610fcf3ce44SJohn Forte { 611fcf3ce44SJohn Forte (void) printf("\n"); 612fcf3ce44SJohn Forte (void) printf(" GUID DATA SIZE " 613fcf3ce44SJohn Forte " SOURCE\n"); 614fcf3ce44SJohn Forte (void) printf("-------------------------------- -------------------" 615fcf3ce44SJohn Forte " ----------------\n"); 616fcf3ce44SJohn Forte } 617fcf3ce44SJohn Forte 618fcf3ce44SJohn Forte void 619fcf3ce44SJohn Forte print_guid(uint8_t *g, FILE *f) 620fcf3ce44SJohn Forte { 621fcf3ce44SJohn Forte int i; 622fcf3ce44SJohn Forte 623fcf3ce44SJohn Forte for (i = 0; i < 16; i++) { 624fcf3ce44SJohn Forte (void) fprintf(f, "%02x", g[i]); 625fcf3ce44SJohn Forte } 626fcf3ce44SJohn Forte } 627fcf3ce44SJohn Forte 628fcf3ce44SJohn Forte int 6298fe96085Stim szeto print_lu_attr(stmfGuid *guid) 630fcf3ce44SJohn Forte { 6318fe96085Stim szeto luResource hdl = NULL; 6328fe96085Stim szeto int stmfRet = 0; 6338fe96085Stim szeto int ret = 0; 6348fe96085Stim szeto char propVal[MAXPATHLEN]; 6358fe96085Stim szeto size_t propValSize = sizeof (propVal); 636fcf3ce44SJohn Forte 6378fe96085Stim szeto if ((stmfRet = stmfGetLuResource(guid, &hdl)) != STMF_STATUS_SUCCESS) { 6388fe96085Stim szeto switch (stmfRet) { 6398fe96085Stim szeto case STMF_ERROR_BUSY: 6408fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 6418fe96085Stim szeto gettext("resource busy")); 6428fe96085Stim szeto break; 6438fe96085Stim szeto case STMF_ERROR_PERM: 6448fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 6458fe96085Stim szeto gettext("permission denied")); 6468fe96085Stim szeto break; 6478fe96085Stim szeto case STMF_ERROR_NOT_FOUND: 6488fe96085Stim szeto /* No error here */ 649fcf3ce44SJohn Forte return (0); 6508fe96085Stim szeto break; 6518fe96085Stim szeto default: 6528fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 6538fe96085Stim szeto gettext("get extended properties failed")); 6548fe96085Stim szeto break; 655fcf3ce44SJohn Forte } 656fcf3ce44SJohn Forte return (1); 657fcf3ce44SJohn Forte } 6588fe96085Stim szeto 6598fe96085Stim szeto print_guid((uint8_t *)guid, stdout); 6608fe96085Stim szeto 6618fe96085Stim szeto stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_SIZE, propVal, 6628fe96085Stim szeto &propValSize); 6638fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 6648fe96085Stim szeto (void) printf(" %-19s ", propVal); 6658fe96085Stim szeto } else if (stmfRet == STMF_ERROR_NO_PROP) { 6668fe96085Stim szeto (void) printf("not set\n"); 6678fe96085Stim szeto } else { 668*45039663SJohn Forte (void) printf("<error retrieving property>\n"); 6698fe96085Stim szeto ret++; 6708fe96085Stim szeto } 6718fe96085Stim szeto 6728fe96085Stim szeto stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_FILENAME, propVal, 6738fe96085Stim szeto &propValSize); 6748fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 6758fe96085Stim szeto (void) printf("%s\n", propVal); 6768fe96085Stim szeto } else if (stmfRet == STMF_ERROR_NO_PROP) { 6778fe96085Stim szeto (void) printf("not set\n"); 6788fe96085Stim szeto } else { 679*45039663SJohn Forte (void) printf("<error retrieving property>\n"); 6808fe96085Stim szeto ret++; 6818fe96085Stim szeto } 6828fe96085Stim szeto 6838fe96085Stim szeto 6848fe96085Stim szeto (void) stmfFreeLuResource(hdl); 6858fe96085Stim szeto return (ret); 6868fe96085Stim szeto } 6878fe96085Stim szeto 6888fe96085Stim szeto /* 6898fe96085Stim szeto * input: 6908fe96085Stim szeto * execFullName - exec name of program (argv[0]) 6918fe96085Stim szeto * 6928fe96085Stim szeto * copied from usr/src/cmd/zoneadm/zoneadm.c in OS/Net 6938fe96085Stim szeto * (changed name to lowerCamelCase to keep consistent with this file) 6948fe96085Stim szeto * 6958fe96085Stim szeto * Returns: 6968fe96085Stim szeto * command name portion of execFullName 6978fe96085Stim szeto */ 6988fe96085Stim szeto static char * 6998fe96085Stim szeto getExecBasename(char *execFullname) 7008fe96085Stim szeto { 7018fe96085Stim szeto char *lastSlash, *execBasename; 7028fe96085Stim szeto 7038fe96085Stim szeto /* guard against '/' at end of command invocation */ 7048fe96085Stim szeto for (;;) { 7058fe96085Stim szeto lastSlash = strrchr(execFullname, '/'); 7068fe96085Stim szeto if (lastSlash == NULL) { 7078fe96085Stim szeto execBasename = execFullname; 7088fe96085Stim szeto break; 7098fe96085Stim szeto } else { 7108fe96085Stim szeto execBasename = lastSlash + 1; 7118fe96085Stim szeto if (*execBasename == '\0') { 7128fe96085Stim szeto *lastSlash = '\0'; 7138fe96085Stim szeto continue; 7148fe96085Stim szeto } 7158fe96085Stim szeto break; 7168fe96085Stim szeto } 7178fe96085Stim szeto } 7188fe96085Stim szeto return (execBasename); 7198fe96085Stim szeto } 7208fe96085Stim szeto int 7218fe96085Stim szeto main(int argc, char *argv[]) 7228fe96085Stim szeto { 7238fe96085Stim szeto synTables_t synTables; 7248fe96085Stim szeto char versionString[VERSION_STRING_MAX_LEN]; 7258fe96085Stim szeto int ret; 7268fe96085Stim szeto int funcRet; 7278fe96085Stim szeto void *subcommandArgs = NULL; 7288fe96085Stim szeto 7298fe96085Stim szeto (void) setlocale(LC_ALL, ""); 7308fe96085Stim szeto (void) textdomain(TEXT_DOMAIN); 7318fe96085Stim szeto /* set global command name */ 7328fe96085Stim szeto cmdName = getExecBasename(argv[0]); 7338fe96085Stim szeto 7348fe96085Stim szeto (void) snprintf(versionString, VERSION_STRING_MAX_LEN, "%s.%s", 7358fe96085Stim szeto VERSION_STRING_MAJOR, VERSION_STRING_MINOR); 7368fe96085Stim szeto synTables.versionString = versionString; 7378fe96085Stim szeto synTables.longOptionTbl = options; 7388fe96085Stim szeto synTables.subCommandPropsTbl = subCommands; 7398fe96085Stim szeto 7408fe96085Stim szeto ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet); 7418fe96085Stim szeto if (ret != 0) { 7428fe96085Stim szeto return (ret); 7438fe96085Stim szeto } 7448fe96085Stim szeto 7458fe96085Stim szeto return (funcRet); 7468fe96085Stim szeto } /* end main */ 747