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 /* 22*8fe96085Stim 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> 39*8fe96085Stim 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 48*8fe96085Stim szeto #define GUID_INPUT 32 49fcf3ce44SJohn Forte 50*8fe96085Stim szeto #define VERSION_STRING_MAJOR "1" 51*8fe96085Stim szeto #define VERSION_STRING_MINOR "0" 52*8fe96085Stim szeto #define VERSION_STRING_MAX_LEN 10 53fcf3ce44SJohn Forte 54*8fe96085Stim szeto 55*8fe96085Stim szeto char *cmdName; 56*8fe96085Stim szeto 57*8fe96085Stim 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); 63*8fe96085Stim szeto int import_lu(int argc, char *argv[], cmdOptions_t *options, void *callData); 64*8fe96085Stim szeto static int callModify(char *, stmfGuid *, uint32_t, const char *, const char *); 65*8fe96085Stim 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 93*8fe96085Stim szeto /*ARGSUSED*/ 94fcf3ce44SJohn Forte int 95*8fe96085Stim szeto create_lu(int argc, char *operands[], cmdOptions_t *options, void *callData) 96fcf3ce44SJohn Forte { 97*8fe96085Stim szeto luResource hdl = NULL; 98fcf3ce44SJohn Forte int ret = 0; 99*8fe96085Stim szeto stmfGuid createdGuid; 100fcf3ce44SJohn Forte 101*8fe96085Stim szeto ret = stmfCreateLuResource(STMF_DISK, &hdl); 102*8fe96085Stim szeto 103fcf3ce44SJohn Forte if (ret != STMF_STATUS_SUCCESS) { 104*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", 105*8fe96085Stim 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) { 111*8fe96085Stim szeto case 's': 112*8fe96085Stim szeto ret = stmfSetLuProp(hdl, STMF_LU_PROP_SIZE, 113*8fe96085Stim szeto options->optarg); 114*8fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 115*8fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 116*8fe96085Stim szeto cmdName, options->optval, 117*8fe96085Stim szeto gettext("size param invalid")); 118*8fe96085Stim szeto (void) stmfFreeLuResource(hdl); 119*8fe96085Stim szeto return (1); 120*8fe96085Stim szeto } 121*8fe96085Stim szeto break; 122*8fe96085Stim szeto default: 123*8fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 124*8fe96085Stim szeto cmdName, options->optval, 125*8fe96085Stim szeto gettext("unknown option")); 126*8fe96085Stim szeto return (1); 127*8fe96085Stim szeto } 128*8fe96085Stim szeto } 129*8fe96085Stim szeto 130*8fe96085Stim szeto ret = stmfSetLuProp(hdl, STMF_LU_PROP_FILENAME, operands[0]); 131*8fe96085Stim szeto 132*8fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 133*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", 134*8fe96085Stim szeto cmdName, gettext("could not set filename")); 135*8fe96085Stim szeto return (1); 136*8fe96085Stim szeto } 137*8fe96085Stim szeto 138*8fe96085Stim szeto ret = stmfCreateLu(hdl, &createdGuid); 139*8fe96085Stim szeto switch (ret) { 140*8fe96085Stim szeto case STMF_STATUS_SUCCESS: 141*8fe96085Stim szeto break; 142*8fe96085Stim szeto case STMF_ERROR_BUSY: 143*8fe96085Stim szeto case STMF_ERROR_LU_BUSY: 144*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 145*8fe96085Stim szeto gettext("resource busy")); 146*8fe96085Stim szeto ret++; 147*8fe96085Stim szeto break; 148*8fe96085Stim szeto case STMF_ERROR_PERM: 149*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 150*8fe96085Stim szeto gettext("permission denied")); 151*8fe96085Stim szeto ret++; 152*8fe96085Stim szeto break; 153*8fe96085Stim szeto case STMF_ERROR_FILE_IN_USE: 154*8fe96085Stim szeto (void) fprintf(stderr, "%s: filename %s: %s\n", cmdName, 155*8fe96085Stim szeto operands[0], gettext("in use")); 156*8fe96085Stim szeto ret++; 157*8fe96085Stim szeto break; 158*8fe96085Stim szeto case STMF_ERROR_INVALID_BLKSIZE: 159*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 160*8fe96085Stim szeto gettext("invalid block size")); 161*8fe96085Stim szeto ret++; 162*8fe96085Stim szeto break; 163*8fe96085Stim szeto case STMF_ERROR_GUID_IN_USE: 164*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 165*8fe96085Stim szeto gettext("guid in use")); 166*8fe96085Stim szeto ret++; 167*8fe96085Stim szeto break; 168*8fe96085Stim szeto case STMF_ERROR_META_FILE_NAME: 169*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 170*8fe96085Stim szeto gettext("meta file error")); 171*8fe96085Stim szeto ret++; 172*8fe96085Stim szeto break; 173*8fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME: 174*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 175*8fe96085Stim szeto gettext("data file error")); 176*8fe96085Stim szeto ret++; 177*8fe96085Stim szeto break; 178*8fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE: 179*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 180*8fe96085Stim szeto gettext("invalid size")); 181*8fe96085Stim szeto ret++; 182*8fe96085Stim szeto break; 183*8fe96085Stim szeto case STMF_ERROR_META_CREATION: 184*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 185*8fe96085Stim szeto gettext("could not create meta file")); 186*8fe96085Stim szeto ret++; 187*8fe96085Stim szeto break; 188*8fe96085Stim szeto default: 189*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 190*8fe96085Stim szeto gettext("unknown error")); 191*8fe96085Stim szeto ret++; 192fcf3ce44SJohn Forte break; 193fcf3ce44SJohn Forte } 194*8fe96085Stim szeto 195*8fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 196*8fe96085Stim szeto goto done; 197fcf3ce44SJohn Forte } 198fcf3ce44SJohn Forte 199*8fe96085Stim szeto (void) printf("Created the following LU:\n"); 200*8fe96085Stim szeto print_attr_header(); 201*8fe96085Stim szeto ret = print_lu_attr(&createdGuid); 202fcf3ce44SJohn Forte 203*8fe96085Stim szeto done: 204*8fe96085Stim szeto (void) stmfFreeLuResource(hdl); 205fcf3ce44SJohn Forte return (ret); 206fcf3ce44SJohn Forte } 207fcf3ce44SJohn Forte 208fcf3ce44SJohn Forte /*ARGSUSED*/ 209fcf3ce44SJohn Forte int 210*8fe96085Stim szeto import_lu(int argc, char *operands[], cmdOptions_t *options, void *callData) 211fcf3ce44SJohn Forte { 212*8fe96085Stim szeto int ret = 0; 213*8fe96085Stim szeto stmfGuid createdGuid; 214fcf3ce44SJohn Forte 215*8fe96085Stim szeto ret = stmfImportLu(STMF_DISK, operands[0], &createdGuid); 216*8fe96085Stim szeto switch (ret) { 217*8fe96085Stim szeto case STMF_STATUS_SUCCESS: 218*8fe96085Stim szeto break; 219*8fe96085Stim szeto case STMF_ERROR_BUSY: 220*8fe96085Stim szeto case STMF_ERROR_LU_BUSY: 221*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 222*8fe96085Stim szeto gettext("resource busy")); 223*8fe96085Stim szeto ret++; 224*8fe96085Stim szeto break; 225*8fe96085Stim szeto case STMF_ERROR_PERM: 226*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 227*8fe96085Stim szeto gettext("permission denied")); 228*8fe96085Stim szeto ret++; 229*8fe96085Stim szeto break; 230*8fe96085Stim szeto case STMF_ERROR_FILE_IN_USE: 231*8fe96085Stim szeto (void) fprintf(stderr, "%s: filename %s: %s\n", cmdName, 232*8fe96085Stim szeto operands[0], gettext("in use")); 233*8fe96085Stim szeto ret++; 234*8fe96085Stim szeto break; 235*8fe96085Stim szeto case STMF_ERROR_GUID_IN_USE: 236*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 237*8fe96085Stim szeto gettext("guid in use")); 238*8fe96085Stim szeto ret++; 239*8fe96085Stim szeto break; 240*8fe96085Stim szeto case STMF_ERROR_META_FILE_NAME: 241*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 242*8fe96085Stim szeto gettext("meta file error")); 243*8fe96085Stim szeto ret++; 244*8fe96085Stim szeto break; 245*8fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME: 246*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 247*8fe96085Stim szeto gettext("data file error")); 248*8fe96085Stim szeto ret++; 249*8fe96085Stim szeto break; 250*8fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE: 251*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 252*8fe96085Stim szeto gettext("invalid size")); 253*8fe96085Stim szeto ret++; 254*8fe96085Stim szeto break; 255*8fe96085Stim szeto case STMF_ERROR_META_CREATION: 256*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 257*8fe96085Stim szeto gettext("could not create meta file")); 258*8fe96085Stim szeto ret++; 259*8fe96085Stim szeto break; 260*8fe96085Stim szeto default: 261*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 262*8fe96085Stim szeto gettext("unknown error")); 263*8fe96085Stim szeto ret++; 264*8fe96085Stim szeto break; 265fcf3ce44SJohn Forte } 266*8fe96085Stim szeto 267*8fe96085Stim szeto if (ret != STMF_STATUS_SUCCESS) { 268*8fe96085Stim szeto goto done; 269*8fe96085Stim szeto } 270*8fe96085Stim szeto 271*8fe96085Stim szeto (void) printf("Imported the following LU:\n"); 272*8fe96085Stim szeto print_attr_header(); 273*8fe96085Stim szeto ret = print_lu_attr(&createdGuid); 274*8fe96085Stim szeto 275*8fe96085Stim szeto done: 276*8fe96085Stim szeto return (ret); 277*8fe96085Stim szeto } 278*8fe96085Stim szeto 279*8fe96085Stim szeto /*ARGSUSED*/ 280*8fe96085Stim szeto int 281*8fe96085Stim szeto delete_lu(int operandLen, char *operands[], cmdOptions_t *options, 282*8fe96085Stim szeto void *callData) 283*8fe96085Stim szeto { 284*8fe96085Stim szeto int i, j; 285*8fe96085Stim szeto int ret = 0; 286*8fe96085Stim szeto int stmfRet; 287*8fe96085Stim szeto unsigned int inGuid[sizeof (stmfGuid)]; 288*8fe96085Stim szeto stmfGuid delGuid; 289*8fe96085Stim szeto boolean_t keepViews = B_FALSE; 290*8fe96085Stim szeto boolean_t viewEntriesRemoved = B_FALSE; 291*8fe96085Stim szeto boolean_t noLunFound = B_FALSE; 292*8fe96085Stim szeto boolean_t views = B_FALSE; 293*8fe96085Stim szeto char sGuid[GUID_INPUT + 1]; 294*8fe96085Stim szeto stmfViewEntryList *viewEntryList = NULL; 295*8fe96085Stim szeto 296*8fe96085Stim szeto for (; options->optval; options++) { 297*8fe96085Stim szeto switch (options->optval) { 298*8fe96085Stim szeto /* Keep views for logical unit */ 299*8fe96085Stim szeto case 'k': 300*8fe96085Stim szeto keepViews = B_TRUE; 301*8fe96085Stim szeto break; 302*8fe96085Stim szeto default: 303*8fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 304*8fe96085Stim szeto cmdName, options->optval, 305*8fe96085Stim szeto gettext("unknown option")); 306fcf3ce44SJohn Forte return (1); 307fcf3ce44SJohn Forte } 308*8fe96085Stim szeto } 309fcf3ce44SJohn Forte 310*8fe96085Stim szeto 311*8fe96085Stim szeto for (i = 0; i < operandLen; i++) { 312*8fe96085Stim szeto for (j = 0; j < GUID_INPUT; j++) { 313*8fe96085Stim szeto if (!isxdigit(operands[i][j])) { 314*8fe96085Stim szeto break; 315*8fe96085Stim szeto } 316*8fe96085Stim szeto sGuid[j] = tolower(operands[i][j]); 317*8fe96085Stim szeto } 318*8fe96085Stim szeto if (j != GUID_INPUT) { 319*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s%d%s\n", 320*8fe96085Stim szeto cmdName, operands[i], gettext("must be "), 321*8fe96085Stim szeto GUID_INPUT, 322*8fe96085Stim szeto gettext(" hexadecimal digits long")); 323*8fe96085Stim szeto ret++; 324*8fe96085Stim szeto continue; 325*8fe96085Stim szeto } 326*8fe96085Stim szeto 327*8fe96085Stim szeto sGuid[j] = 0; 328*8fe96085Stim szeto 329*8fe96085Stim szeto (void) sscanf(sGuid, 330*8fe96085Stim szeto "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", 331*8fe96085Stim szeto &inGuid[0], &inGuid[1], &inGuid[2], &inGuid[3], 332*8fe96085Stim szeto &inGuid[4], &inGuid[5], &inGuid[6], &inGuid[7], 333*8fe96085Stim szeto &inGuid[8], &inGuid[9], &inGuid[10], &inGuid[11], 334*8fe96085Stim szeto &inGuid[12], &inGuid[13], &inGuid[14], &inGuid[15]); 335*8fe96085Stim szeto 336*8fe96085Stim szeto for (j = 0; j < sizeof (stmfGuid); j++) { 337*8fe96085Stim szeto delGuid.guid[j] = inGuid[j]; 338*8fe96085Stim szeto } 339*8fe96085Stim szeto 340*8fe96085Stim szeto stmfRet = stmfDeleteLu(&delGuid); 341*8fe96085Stim szeto switch (stmfRet) { 342*8fe96085Stim szeto case STMF_STATUS_SUCCESS: 343*8fe96085Stim szeto break; 344*8fe96085Stim szeto case STMF_ERROR_NOT_FOUND: 345*8fe96085Stim szeto noLunFound = B_TRUE; 346*8fe96085Stim szeto break; 347*8fe96085Stim szeto case STMF_ERROR_BUSY: 348*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 349*8fe96085Stim szeto gettext("resource busy")); 350*8fe96085Stim szeto ret++; 351*8fe96085Stim szeto break; 352*8fe96085Stim szeto case STMF_ERROR_PERM: 353*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 354*8fe96085Stim szeto gettext("permission denied")); 355*8fe96085Stim szeto ret++; 356*8fe96085Stim szeto break; 357*8fe96085Stim szeto default: 358*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 359*8fe96085Stim szeto gettext("unknown error")); 360*8fe96085Stim szeto ret++; 361*8fe96085Stim szeto break; 362*8fe96085Stim szeto } 363*8fe96085Stim szeto 364*8fe96085Stim szeto if (!keepViews) { 365*8fe96085Stim szeto stmfRet = stmfGetViewEntryList(&delGuid, 366*8fe96085Stim szeto &viewEntryList); 367*8fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 368*8fe96085Stim szeto for (j = 0; j < viewEntryList->cnt; j++) { 369*8fe96085Stim szeto (void) stmfRemoveViewEntry(&delGuid, 370*8fe96085Stim szeto viewEntryList->ve[j].veIndex); 371*8fe96085Stim szeto } 372*8fe96085Stim szeto viewEntriesRemoved = B_TRUE; 373*8fe96085Stim szeto stmfFreeMemory(viewEntryList); 374*8fe96085Stim szeto } else if (stmfRet != STMF_ERROR_NOT_FOUND) { 375*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 376*8fe96085Stim szeto gettext("unable to remove view entries\n")); 377*8fe96085Stim szeto ret++; 378*8fe96085Stim szeto } /* No view entries to remove */ 379*8fe96085Stim szeto } 380*8fe96085Stim szeto if (keepViews) { 381*8fe96085Stim szeto stmfRet = stmfGetViewEntryList(&delGuid, 382*8fe96085Stim szeto &viewEntryList); 383*8fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 384*8fe96085Stim szeto views = B_TRUE; 385*8fe96085Stim szeto stmfFreeMemory(viewEntryList); 386*8fe96085Stim szeto } 387*8fe96085Stim szeto } 388*8fe96085Stim szeto 389*8fe96085Stim szeto if ((!viewEntriesRemoved && noLunFound && !views) || 390*8fe96085Stim szeto (!views && keepViews && noLunFound)) { 391*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s\n", 392*8fe96085Stim szeto cmdName, sGuid, 393*8fe96085Stim szeto gettext("not found")); 394*8fe96085Stim szeto ret++; 395*8fe96085Stim szeto } 396*8fe96085Stim szeto noLunFound = viewEntriesRemoved = views = B_FALSE; 397*8fe96085Stim szeto } 398*8fe96085Stim szeto return (ret); 399*8fe96085Stim szeto } 400*8fe96085Stim szeto 401*8fe96085Stim szeto /*ARGSUSED*/ 402*8fe96085Stim szeto int 403*8fe96085Stim szeto modify_lu(int operandLen, char *operands[], cmdOptions_t *options, 404*8fe96085Stim szeto void *callData) 405*8fe96085Stim szeto { 406*8fe96085Stim szeto stmfGuid inGuid; 407*8fe96085Stim szeto unsigned int guid[sizeof (stmfGuid)]; 408*8fe96085Stim szeto int ret = 0; 409*8fe96085Stim szeto int i; 410*8fe96085Stim szeto char *fname = NULL; 411*8fe96085Stim szeto char sGuid[GUID_INPUT + 1]; 412*8fe96085Stim szeto boolean_t fnameUsed = B_FALSE; 413*8fe96085Stim szeto 414*8fe96085Stim szeto if (operands[0][0] == '/') { 415*8fe96085Stim szeto fnameUsed = B_TRUE; 416*8fe96085Stim szeto fname = operands[0]; 417*8fe96085Stim szeto } 418*8fe96085Stim szeto 419*8fe96085Stim szeto /* check input length */ 420*8fe96085Stim szeto if (!fnameUsed && strlen(operands[0]) != GUID_INPUT) { 421*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s%d%s\n", cmdName, operands[0], 422*8fe96085Stim szeto gettext("must be "), GUID_INPUT, 423*8fe96085Stim szeto gettext(" hexadecimal digits")); 424*8fe96085Stim szeto return (1); 425*8fe96085Stim szeto } 426*8fe96085Stim szeto 427*8fe96085Stim szeto if (!fnameUsed) { 428*8fe96085Stim szeto /* convert to lower case for scan */ 429*8fe96085Stim szeto for (i = 0; i < 32; i++) 430*8fe96085Stim szeto sGuid[i] = tolower(operands[0][i]); 431*8fe96085Stim szeto sGuid[i] = 0; 432*8fe96085Stim szeto (void) sscanf(sGuid, 433*8fe96085Stim szeto "%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x%2x", 434*8fe96085Stim szeto &guid[0], &guid[1], &guid[2], &guid[3], &guid[4], &guid[5], 435*8fe96085Stim szeto &guid[6], &guid[7], &guid[8], &guid[9], &guid[10], 436*8fe96085Stim szeto &guid[11], &guid[12], &guid[13], &guid[14], &guid[15]); 437*8fe96085Stim szeto 438*8fe96085Stim szeto for (i = 0; i < sizeof (stmfGuid); i++) { 439*8fe96085Stim szeto inGuid.guid[i] = guid[i]; 440*8fe96085Stim szeto } 441*8fe96085Stim szeto } 442*8fe96085Stim szeto 443fcf3ce44SJohn Forte for (; options->optval; options++) { 444*8fe96085Stim szeto switch (options->optval) { 445*8fe96085Stim szeto case 's': 446*8fe96085Stim szeto if (callModify(fname, &inGuid, 447*8fe96085Stim szeto STMF_LU_PROP_SIZE, options->optarg, 448*8fe96085Stim szeto "size") != 0) { 449*8fe96085Stim szeto return (1); 450fcf3ce44SJohn Forte } 451*8fe96085Stim szeto break; 452*8fe96085Stim szeto default: 453*8fe96085Stim szeto (void) fprintf(stderr, "%s: %c: %s\n", 454*8fe96085Stim szeto cmdName, options->optval, 455*8fe96085Stim szeto gettext("unknown option")); 456*8fe96085Stim szeto return (1); 457fcf3ce44SJohn Forte } 458fcf3ce44SJohn Forte } 459*8fe96085Stim szeto return (ret); 460fcf3ce44SJohn Forte } 461fcf3ce44SJohn Forte 462*8fe96085Stim szeto static int 463*8fe96085Stim szeto callModify(char *fname, stmfGuid *luGuid, uint32_t prop, const char *propVal, 464*8fe96085Stim szeto const char *propString) 465*8fe96085Stim szeto { 466*8fe96085Stim szeto int ret = 0; 467*8fe96085Stim szeto int stmfRet = 0; 468*8fe96085Stim szeto 469*8fe96085Stim szeto if (!fname) { 470*8fe96085Stim szeto stmfRet = stmfModifyLu(luGuid, prop, propVal); 471*8fe96085Stim szeto } else { 472*8fe96085Stim szeto stmfRet = stmfModifyLuByFname(STMF_DISK, fname, prop, 473*8fe96085Stim szeto propVal); 474*8fe96085Stim szeto } 475*8fe96085Stim szeto switch (stmfRet) { 476*8fe96085Stim szeto case STMF_STATUS_SUCCESS: 477*8fe96085Stim szeto break; 478*8fe96085Stim szeto case STMF_ERROR_BUSY: 479*8fe96085Stim szeto case STMF_ERROR_LU_BUSY: 480*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 481*8fe96085Stim szeto gettext("resource busy")); 482*8fe96085Stim szeto ret++; 483*8fe96085Stim szeto break; 484*8fe96085Stim szeto case STMF_ERROR_PERM: 485*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 486*8fe96085Stim szeto gettext("permission denied")); 487*8fe96085Stim szeto ret++; 488*8fe96085Stim szeto break; 489*8fe96085Stim szeto case STMF_ERROR_INVALID_BLKSIZE: 490*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 491*8fe96085Stim szeto gettext("invalid block size")); 492*8fe96085Stim szeto ret++; 493*8fe96085Stim szeto break; 494*8fe96085Stim szeto case STMF_ERROR_GUID_IN_USE: 495*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 496*8fe96085Stim szeto gettext("guid in use")); 497*8fe96085Stim szeto ret++; 498*8fe96085Stim szeto break; 499*8fe96085Stim szeto case STMF_ERROR_META_FILE_NAME: 500*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 501*8fe96085Stim szeto gettext("meta file error")); 502*8fe96085Stim szeto ret++; 503*8fe96085Stim szeto break; 504*8fe96085Stim szeto case STMF_ERROR_DATA_FILE_NAME: 505*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 506*8fe96085Stim szeto gettext("data file error")); 507*8fe96085Stim szeto ret++; 508*8fe96085Stim szeto break; 509*8fe96085Stim szeto case STMF_ERROR_FILE_SIZE_INVALID: 510*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 511*8fe96085Stim szeto gettext("file size invalid")); 512*8fe96085Stim szeto ret++; 513*8fe96085Stim szeto break; 514*8fe96085Stim szeto case STMF_ERROR_SIZE_OUT_OF_RANGE: 515*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 516*8fe96085Stim szeto gettext("invalid size")); 517*8fe96085Stim szeto ret++; 518*8fe96085Stim szeto break; 519*8fe96085Stim szeto case STMF_ERROR_META_CREATION: 520*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 521*8fe96085Stim szeto gettext("could not create meta file")); 522*8fe96085Stim szeto ret++; 523*8fe96085Stim szeto break; 524*8fe96085Stim szeto default: 525*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s: %s: %d\n", cmdName, 526*8fe96085Stim szeto gettext("could not set property"), propString, 527*8fe96085Stim szeto stmfRet); 528*8fe96085Stim szeto ret++; 529*8fe96085Stim szeto break; 530*8fe96085Stim szeto } 531*8fe96085Stim 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 { 540*8fe96085Stim szeto int stmfRet; 541*8fe96085Stim szeto stmfGuidList *luList; 542*8fe96085Stim szeto stmfLogicalUnitProperties luProps; 543*8fe96085Stim szeto int sbdLuCnt = 0; 544*8fe96085Stim szeto int i; 545fcf3ce44SJohn Forte 546*8fe96085Stim szeto if ((stmfRet = stmfGetLogicalUnitList(&luList)) 547*8fe96085Stim szeto != STMF_STATUS_SUCCESS) { 548*8fe96085Stim szeto switch (stmfRet) { 549*8fe96085Stim szeto case STMF_ERROR_SERVICE_NOT_FOUND: 550*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 551*8fe96085Stim szeto gettext("STMF service not found")); 552*8fe96085Stim szeto break; 553*8fe96085Stim szeto case STMF_ERROR_BUSY: 554*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 555*8fe96085Stim szeto gettext("resource busy")); 556*8fe96085Stim szeto break; 557*8fe96085Stim szeto case STMF_ERROR_PERM: 558*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 559*8fe96085Stim szeto gettext("permission denied")); 560*8fe96085Stim szeto break; 561*8fe96085Stim szeto case STMF_ERROR_SERVICE_DATA_VERSION: 562*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 563*8fe96085Stim szeto gettext("STMF service version incorrect")); 564*8fe96085Stim szeto break; 565*8fe96085Stim szeto default: 566*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 567*8fe96085Stim szeto gettext("list failed")); 568*8fe96085Stim szeto break; 569fcf3ce44SJohn Forte } 570fcf3ce44SJohn Forte return (1); 571fcf3ce44SJohn Forte } 572fcf3ce44SJohn Forte 573*8fe96085Stim szeto for (i = 0; i < luList->cnt; i++) { 574*8fe96085Stim szeto stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i], 575*8fe96085Stim szeto &luProps); 576*8fe96085Stim szeto if (stmfRet != STMF_STATUS_SUCCESS) { 577*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 578*8fe96085Stim szeto gettext("list failed")); 579fcf3ce44SJohn Forte return (1); 580fcf3ce44SJohn Forte } 581*8fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) { 582*8fe96085Stim szeto sbdLuCnt++; 583fcf3ce44SJohn Forte } 584fcf3ce44SJohn Forte } 585fcf3ce44SJohn Forte 586fcf3ce44SJohn Forte 587*8fe96085Stim szeto if (sbdLuCnt == 0) 588*8fe96085Stim szeto return (0); 589*8fe96085Stim szeto 590*8fe96085Stim szeto (void) printf("\nFound %d LU(s)\n", sbdLuCnt); 591fcf3ce44SJohn Forte print_attr_header(); 592fcf3ce44SJohn Forte 593*8fe96085Stim szeto for (i = 0; i < luList->cnt; i++) { 594*8fe96085Stim szeto stmfRet = stmfGetLogicalUnitProperties(&luList->guid[i], 595*8fe96085Stim szeto &luProps); 596*8fe96085Stim szeto if (stmfRet != STMF_STATUS_SUCCESS) { 597*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 598*8fe96085Stim szeto gettext("list failed")); 599*8fe96085Stim szeto return (1); 600fcf3ce44SJohn Forte } 601*8fe96085Stim szeto if (strcmp(luProps.providerName, "sbd") == 0) { 602*8fe96085Stim szeto (void) print_lu_attr(&luList->guid[i]); 603*8fe96085Stim szeto } 604*8fe96085Stim 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 629*8fe96085Stim szeto print_lu_attr(stmfGuid *guid) 630fcf3ce44SJohn Forte { 631*8fe96085Stim szeto luResource hdl = NULL; 632*8fe96085Stim szeto int stmfRet = 0; 633*8fe96085Stim szeto int ret = 0; 634*8fe96085Stim szeto char propVal[MAXPATHLEN]; 635*8fe96085Stim szeto size_t propValSize = sizeof (propVal); 636fcf3ce44SJohn Forte 637*8fe96085Stim szeto if ((stmfRet = stmfGetLuResource(guid, &hdl)) != STMF_STATUS_SUCCESS) { 638*8fe96085Stim szeto switch (stmfRet) { 639*8fe96085Stim szeto case STMF_ERROR_BUSY: 640*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 641*8fe96085Stim szeto gettext("resource busy")); 642*8fe96085Stim szeto break; 643*8fe96085Stim szeto case STMF_ERROR_PERM: 644*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 645*8fe96085Stim szeto gettext("permission denied")); 646*8fe96085Stim szeto break; 647*8fe96085Stim szeto case STMF_ERROR_NOT_FOUND: 648*8fe96085Stim szeto /* No error here */ 649fcf3ce44SJohn Forte return (0); 650*8fe96085Stim szeto break; 651*8fe96085Stim szeto default: 652*8fe96085Stim szeto (void) fprintf(stderr, "%s: %s\n", cmdName, 653*8fe96085Stim szeto gettext("get extended properties failed")); 654*8fe96085Stim szeto break; 655fcf3ce44SJohn Forte } 656fcf3ce44SJohn Forte return (1); 657fcf3ce44SJohn Forte } 658*8fe96085Stim szeto 659*8fe96085Stim szeto print_guid((uint8_t *)guid, stdout); 660*8fe96085Stim szeto 661*8fe96085Stim szeto stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_SIZE, propVal, 662*8fe96085Stim szeto &propValSize); 663*8fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 664*8fe96085Stim szeto (void) printf(" %-19s ", propVal); 665*8fe96085Stim szeto } else if (stmfRet == STMF_ERROR_NO_PROP) { 666*8fe96085Stim szeto (void) printf("not set\n"); 667*8fe96085Stim szeto } else { 668*8fe96085Stim szeto (void) printf("<error retrieving property>"); 669*8fe96085Stim szeto ret++; 670*8fe96085Stim szeto } 671*8fe96085Stim szeto 672*8fe96085Stim szeto stmfRet = stmfGetLuProp(hdl, STMF_LU_PROP_FILENAME, propVal, 673*8fe96085Stim szeto &propValSize); 674*8fe96085Stim szeto if (stmfRet == STMF_STATUS_SUCCESS) { 675*8fe96085Stim szeto (void) printf("%s\n", propVal); 676*8fe96085Stim szeto } else if (stmfRet == STMF_ERROR_NO_PROP) { 677*8fe96085Stim szeto (void) printf("not set\n"); 678*8fe96085Stim szeto } else { 679*8fe96085Stim szeto (void) printf("<error retrieving property>"); 680*8fe96085Stim szeto ret++; 681*8fe96085Stim szeto } 682*8fe96085Stim szeto 683*8fe96085Stim szeto 684*8fe96085Stim szeto (void) stmfFreeLuResource(hdl); 685*8fe96085Stim szeto return (ret); 686*8fe96085Stim szeto } 687*8fe96085Stim szeto 688*8fe96085Stim szeto /* 689*8fe96085Stim szeto * input: 690*8fe96085Stim szeto * execFullName - exec name of program (argv[0]) 691*8fe96085Stim szeto * 692*8fe96085Stim szeto * copied from usr/src/cmd/zoneadm/zoneadm.c in OS/Net 693*8fe96085Stim szeto * (changed name to lowerCamelCase to keep consistent with this file) 694*8fe96085Stim szeto * 695*8fe96085Stim szeto * Returns: 696*8fe96085Stim szeto * command name portion of execFullName 697*8fe96085Stim szeto */ 698*8fe96085Stim szeto static char * 699*8fe96085Stim szeto getExecBasename(char *execFullname) 700*8fe96085Stim szeto { 701*8fe96085Stim szeto char *lastSlash, *execBasename; 702*8fe96085Stim szeto 703*8fe96085Stim szeto /* guard against '/' at end of command invocation */ 704*8fe96085Stim szeto for (;;) { 705*8fe96085Stim szeto lastSlash = strrchr(execFullname, '/'); 706*8fe96085Stim szeto if (lastSlash == NULL) { 707*8fe96085Stim szeto execBasename = execFullname; 708*8fe96085Stim szeto break; 709*8fe96085Stim szeto } else { 710*8fe96085Stim szeto execBasename = lastSlash + 1; 711*8fe96085Stim szeto if (*execBasename == '\0') { 712*8fe96085Stim szeto *lastSlash = '\0'; 713*8fe96085Stim szeto continue; 714*8fe96085Stim szeto } 715*8fe96085Stim szeto break; 716*8fe96085Stim szeto } 717*8fe96085Stim szeto } 718*8fe96085Stim szeto return (execBasename); 719*8fe96085Stim szeto } 720*8fe96085Stim szeto int 721*8fe96085Stim szeto main(int argc, char *argv[]) 722*8fe96085Stim szeto { 723*8fe96085Stim szeto synTables_t synTables; 724*8fe96085Stim szeto char versionString[VERSION_STRING_MAX_LEN]; 725*8fe96085Stim szeto int ret; 726*8fe96085Stim szeto int funcRet; 727*8fe96085Stim szeto void *subcommandArgs = NULL; 728*8fe96085Stim szeto 729*8fe96085Stim szeto (void) setlocale(LC_ALL, ""); 730*8fe96085Stim szeto (void) textdomain(TEXT_DOMAIN); 731*8fe96085Stim szeto /* set global command name */ 732*8fe96085Stim szeto cmdName = getExecBasename(argv[0]); 733*8fe96085Stim szeto 734*8fe96085Stim szeto (void) snprintf(versionString, VERSION_STRING_MAX_LEN, "%s.%s", 735*8fe96085Stim szeto VERSION_STRING_MAJOR, VERSION_STRING_MINOR); 736*8fe96085Stim szeto synTables.versionString = versionString; 737*8fe96085Stim szeto synTables.longOptionTbl = options; 738*8fe96085Stim szeto synTables.subCommandPropsTbl = subCommands; 739*8fe96085Stim szeto 740*8fe96085Stim szeto ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet); 741*8fe96085Stim szeto if (ret != 0) { 742*8fe96085Stim szeto return (ret); 743*8fe96085Stim szeto } 744*8fe96085Stim szeto 745*8fe96085Stim szeto return (funcRet); 746*8fe96085Stim szeto } /* end main */ 747