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*4b31676fSsrivijitha dugganapalli * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. 23fcf3ce44SJohn Forte */ 24fcf3ce44SJohn Forte 25fcf3ce44SJohn Forte #include <stdlib.h> 26fcf3ce44SJohn Forte #include <stdio.h> 27fcf3ce44SJohn Forte #include <strings.h> 28fcf3ce44SJohn Forte #include <sys/types.h> 29fcf3ce44SJohn Forte #include <unistd.h> 30fcf3ce44SJohn Forte #include <libintl.h> 31fcf3ce44SJohn Forte #include <errno.h> 32fcf3ce44SJohn Forte #include <time.h> 33fcf3ce44SJohn Forte #include <string.h> 34fcf3ce44SJohn Forte #include <assert.h> 35fcf3ce44SJohn Forte #include <getopt.h> 36fcf3ce44SJohn Forte #include <cmdparse.h> 37fcf3ce44SJohn Forte #include <libstmf.h> 38fcf3ce44SJohn Forte #include <signal.h> 39fcf3ce44SJohn Forte #include <pthread.h> 40fcf3ce44SJohn Forte #include <locale.h> 41fcf3ce44SJohn Forte 42fcf3ce44SJohn Forte static int svcStart(int, char **, cmdOptions_t *, void *); 43fcf3ce44SJohn Forte static int svcStop(int, char **, cmdOptions_t *, void *); 44fcf3ce44SJohn Forte static int online(); 45fcf3ce44SJohn Forte 46fcf3ce44SJohn Forte /* 47fcf3ce44SJohn Forte * MAJOR - This should only change when there is an incompatible change made 48fcf3ce44SJohn Forte * to the interfaces or the output. 49fcf3ce44SJohn Forte * 50fcf3ce44SJohn Forte * MINOR - This should change whenever there is a new command or new feature 51fcf3ce44SJohn Forte * with no incompatible change. 52fcf3ce44SJohn Forte */ 53fcf3ce44SJohn Forte #define VERSION_STRING_MAJOR "1" 54fcf3ce44SJohn Forte #define VERSION_STRING_MINOR "0" 55fcf3ce44SJohn Forte #define VERSION_STRING_MAX_LEN 10 56fcf3ce44SJohn Forte 57fcf3ce44SJohn Forte /* 10 ms sleep in nanoseconds */ 58fcf3ce44SJohn Forte #define TEN_MS_NANOSLEEP 10000000 59fcf3ce44SJohn Forte 60fcf3ce44SJohn Forte /* tables set up based on cmdparse instructions */ 61fcf3ce44SJohn Forte 62fcf3ce44SJohn Forte /* add new options here */ 63fcf3ce44SJohn Forte optionTbl_t longOptions[] = { 64fcf3ce44SJohn Forte {NULL, 0, 0, 0} 65fcf3ce44SJohn Forte }; 66fcf3ce44SJohn Forte 67fcf3ce44SJohn Forte /* 68fcf3ce44SJohn Forte * Add new subcommands here 69fcf3ce44SJohn Forte */ 70fcf3ce44SJohn Forte subCommandProps_t subcommands[] = { 71fcf3ce44SJohn Forte {"start", svcStart, NULL, NULL, NULL, OPERAND_NONE, NULL}, 72fcf3ce44SJohn Forte {"stop", svcStop, NULL, NULL, NULL, OPERAND_NONE, NULL}, 73fcf3ce44SJohn Forte {NULL, 0, NULL, NULL, 0, NULL, 0, NULL} 74fcf3ce44SJohn Forte }; 75fcf3ce44SJohn Forte 76fcf3ce44SJohn Forte /* globals */ 77fcf3ce44SJohn Forte char *cmdName; 78fcf3ce44SJohn Forte 79fcf3ce44SJohn Forte /* 80fcf3ce44SJohn Forte * svcStop 81fcf3ce44SJohn Forte * 82fcf3ce44SJohn Forte * Offlines the stmf service 83fcf3ce44SJohn Forte * 84fcf3ce44SJohn Forte */ 85fcf3ce44SJohn Forte /*ARGSUSED*/ 86fcf3ce44SJohn Forte static int 87fcf3ce44SJohn Forte svcStop(int operandLen, char *operands[], cmdOptions_t *options, 88fcf3ce44SJohn Forte void *args) 89fcf3ce44SJohn Forte { 90fcf3ce44SJohn Forte int stmfRet; 91fcf3ce44SJohn Forte int ret = 0; 92fcf3ce44SJohn Forte stmfState state; 93fcf3ce44SJohn Forte boolean_t serviceOffline = B_FALSE; 94fcf3ce44SJohn Forte struct timespec rqtp; 95fcf3ce44SJohn Forte 96fcf3ce44SJohn Forte bzero(&rqtp, sizeof (rqtp)); 97fcf3ce44SJohn Forte 98fcf3ce44SJohn Forte rqtp.tv_nsec = TEN_MS_NANOSLEEP; 99fcf3ce44SJohn Forte 100fcf3ce44SJohn Forte if ((stmfRet = stmfOffline()) != STMF_STATUS_SUCCESS) { 101fcf3ce44SJohn Forte switch (stmfRet) { 102fcf3ce44SJohn Forte case STMF_ERROR_PERM: 103fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 104fcf3ce44SJohn Forte gettext("permission denied")); 105fcf3ce44SJohn Forte break; 106fcf3ce44SJohn Forte case STMF_ERROR_SERVICE_NOT_FOUND: 107fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 108fcf3ce44SJohn Forte gettext("STMF service not found")); 109fcf3ce44SJohn Forte break; 110fcf3ce44SJohn Forte case STMF_ERROR_SERVICE_OFFLINE: 111fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 112fcf3ce44SJohn Forte gettext("STMF service already offline")); 113fcf3ce44SJohn Forte break; 114fcf3ce44SJohn Forte default: 115fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 116fcf3ce44SJohn Forte gettext("unable to offline service")); 117fcf3ce44SJohn Forte break; 118fcf3ce44SJohn Forte } 119fcf3ce44SJohn Forte return (1); 120fcf3ce44SJohn Forte } 121fcf3ce44SJohn Forte 122fcf3ce44SJohn Forte /* wait for service offline */ 123fcf3ce44SJohn Forte while (!serviceOffline) { 124fcf3ce44SJohn Forte stmfRet = stmfGetState(&state); 125fcf3ce44SJohn Forte if (stmfRet != STMF_STATUS_SUCCESS) { 126fcf3ce44SJohn Forte ret = 1; 127fcf3ce44SJohn Forte break; 128fcf3ce44SJohn Forte } 129fcf3ce44SJohn Forte if (state.operationalState == STMF_SERVICE_STATE_OFFLINE) { 130fcf3ce44SJohn Forte serviceOffline = B_TRUE; 131fcf3ce44SJohn Forte } else { 132fcf3ce44SJohn Forte (void) nanosleep(&rqtp, NULL); 133fcf3ce44SJohn Forte } 134fcf3ce44SJohn Forte } 135fcf3ce44SJohn Forte 136fcf3ce44SJohn Forte return (ret); 137fcf3ce44SJohn Forte } 138fcf3ce44SJohn Forte 139fcf3ce44SJohn Forte /* 140fcf3ce44SJohn Forte * loadConfig 141fcf3ce44SJohn Forte * 142fcf3ce44SJohn Forte * Loads the stmf config from the SMF repository 143fcf3ce44SJohn Forte * 144fcf3ce44SJohn Forte */ 145fcf3ce44SJohn Forte /*ARGSUSED*/ 146fcf3ce44SJohn Forte static int 147fcf3ce44SJohn Forte svcStart(int operandLen, char *operands[], cmdOptions_t *options, 148fcf3ce44SJohn Forte void *args) 149fcf3ce44SJohn Forte { 150fcf3ce44SJohn Forte int stmfRet; 151fcf3ce44SJohn Forte int ret = 0; 152*4b31676fSsrivijitha dugganapalli (void) stmfLoadStmfProps(); 153fcf3ce44SJohn Forte if ((stmfRet = stmfLoadConfig()) != STMF_STATUS_SUCCESS) { 154fcf3ce44SJohn Forte switch (stmfRet) { 155fcf3ce44SJohn Forte case STMF_ERROR_PERM: 156fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 157fcf3ce44SJohn Forte gettext("permission denied")); 158fcf3ce44SJohn Forte break; 159fcf3ce44SJohn Forte case STMF_ERROR_SERVICE_NOT_FOUND: 160fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 161fcf3ce44SJohn Forte gettext("STMF service not found")); 162fcf3ce44SJohn Forte break; 163fcf3ce44SJohn Forte case STMF_ERROR_SERVICE_ONLINE: 164fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 165fcf3ce44SJohn Forte gettext("STMF service must be offline")); 166fcf3ce44SJohn Forte break; 167fcf3ce44SJohn Forte default: 168fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 16986b7dbefSPeter Gill gettext("Unable to load the configuration. " 17086b7dbefSPeter Gill "See /var/adm/messages for details")); 17186b7dbefSPeter Gill (void) fprintf(stderr, "%s: %s\n", cmdName, 17286b7dbefSPeter Gill gettext("For information on reverting the " 17386b7dbefSPeter Gill "stmf:default instance to a previously " 17486b7dbefSPeter Gill "running configuration see the man page " 17586b7dbefSPeter Gill "for svccfg(1M)")); 17686b7dbefSPeter Gill (void) fprintf(stderr, "%s: %s\n", cmdName, 17786b7dbefSPeter Gill gettext("After reverting the instance " 17886b7dbefSPeter Gill "you must clear the service maintenance " 17986b7dbefSPeter Gill "state. See the man page for svcadm(1M)")); 180fcf3ce44SJohn Forte break; 181fcf3ce44SJohn Forte } 182fcf3ce44SJohn Forte return (1); 183fcf3ce44SJohn Forte } 184fcf3ce44SJohn Forte ret = online(); 185fcf3ce44SJohn Forte return (ret); 186fcf3ce44SJohn Forte 187fcf3ce44SJohn Forte } 188fcf3ce44SJohn Forte 189fcf3ce44SJohn Forte /* 190fcf3ce44SJohn Forte * online 191fcf3ce44SJohn Forte * 192fcf3ce44SJohn Forte * Onlines the stmf service 193fcf3ce44SJohn Forte * 194fcf3ce44SJohn Forte */ 195fcf3ce44SJohn Forte /*ARGSUSED*/ 196fcf3ce44SJohn Forte static int 197fcf3ce44SJohn Forte online() 198fcf3ce44SJohn Forte { 199fcf3ce44SJohn Forte int stmfRet; 200fcf3ce44SJohn Forte int ret = 0; 201fcf3ce44SJohn Forte stmfState state; 202fcf3ce44SJohn Forte boolean_t serviceOnline = B_FALSE; 203fcf3ce44SJohn Forte struct timespec rqtp; 204fcf3ce44SJohn Forte 205fcf3ce44SJohn Forte bzero(&rqtp, sizeof (rqtp)); 206fcf3ce44SJohn Forte 207fcf3ce44SJohn Forte rqtp.tv_nsec = TEN_MS_NANOSLEEP; 208fcf3ce44SJohn Forte 209fcf3ce44SJohn Forte if ((stmfRet = stmfOnline()) != STMF_STATUS_SUCCESS) { 210fcf3ce44SJohn Forte switch (stmfRet) { 211fcf3ce44SJohn Forte case STMF_ERROR_PERM: 212fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 213fcf3ce44SJohn Forte gettext("permission denied")); 214fcf3ce44SJohn Forte break; 215fcf3ce44SJohn Forte case STMF_ERROR_SERVICE_NOT_FOUND: 216fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 217fcf3ce44SJohn Forte gettext("STMF service not found")); 218fcf3ce44SJohn Forte break; 219fcf3ce44SJohn Forte case STMF_ERROR_SERVICE_ONLINE: 220fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 221fcf3ce44SJohn Forte gettext("STMF service already online")); 222fcf3ce44SJohn Forte break; 223fcf3ce44SJohn Forte default: 224fcf3ce44SJohn Forte (void) fprintf(stderr, "%s: %s\n", cmdName, 225fcf3ce44SJohn Forte gettext("unable to online service")); 226fcf3ce44SJohn Forte break; 227fcf3ce44SJohn Forte } 228fcf3ce44SJohn Forte return (1); 229fcf3ce44SJohn Forte } 230fcf3ce44SJohn Forte 231fcf3ce44SJohn Forte /* wait for service online */ 232fcf3ce44SJohn Forte while (!serviceOnline) { 233fcf3ce44SJohn Forte stmfRet = stmfGetState(&state); 234fcf3ce44SJohn Forte if (stmfRet != STMF_STATUS_SUCCESS) { 235fcf3ce44SJohn Forte ret = 1; 236fcf3ce44SJohn Forte break; 237fcf3ce44SJohn Forte } 238fcf3ce44SJohn Forte if (state.operationalState == STMF_SERVICE_STATE_ONLINE) { 239fcf3ce44SJohn Forte serviceOnline = B_TRUE; 240fcf3ce44SJohn Forte } else { 241fcf3ce44SJohn Forte (void) nanosleep(&rqtp, NULL); 242fcf3ce44SJohn Forte } 243fcf3ce44SJohn Forte } 244fcf3ce44SJohn Forte 245fcf3ce44SJohn Forte return (ret); 246fcf3ce44SJohn Forte } 247fcf3ce44SJohn Forte 248fcf3ce44SJohn Forte 249fcf3ce44SJohn Forte /* 250fcf3ce44SJohn Forte * input: 251fcf3ce44SJohn Forte * execFullName - exec name of program (argv[0]) 252fcf3ce44SJohn Forte * 253fcf3ce44SJohn Forte * copied from usr/src/cmd/zoneadm/zoneadm.c in OS/Net 254fcf3ce44SJohn Forte * (changed name to lowerCamelCase to keep consistent with this file) 255fcf3ce44SJohn Forte * 256fcf3ce44SJohn Forte * Returns: 257fcf3ce44SJohn Forte * command name portion of execFullName 258fcf3ce44SJohn Forte */ 259fcf3ce44SJohn Forte static char * 260fcf3ce44SJohn Forte getExecBasename(char *execFullname) 261fcf3ce44SJohn Forte { 262fcf3ce44SJohn Forte char *lastSlash, *execBasename; 263fcf3ce44SJohn Forte 264fcf3ce44SJohn Forte /* guard against '/' at end of command invocation */ 265fcf3ce44SJohn Forte for (;;) { 266fcf3ce44SJohn Forte lastSlash = strrchr(execFullname, '/'); 267fcf3ce44SJohn Forte if (lastSlash == NULL) { 268fcf3ce44SJohn Forte execBasename = execFullname; 269fcf3ce44SJohn Forte break; 270fcf3ce44SJohn Forte } else { 271fcf3ce44SJohn Forte execBasename = lastSlash + 1; 272fcf3ce44SJohn Forte if (*execBasename == '\0') { 273fcf3ce44SJohn Forte *lastSlash = '\0'; 274fcf3ce44SJohn Forte continue; 275fcf3ce44SJohn Forte } 276fcf3ce44SJohn Forte break; 277fcf3ce44SJohn Forte } 278fcf3ce44SJohn Forte } 279fcf3ce44SJohn Forte return (execBasename); 280fcf3ce44SJohn Forte } 281fcf3ce44SJohn Forte 282fcf3ce44SJohn Forte int 283fcf3ce44SJohn Forte main(int argc, char *argv[]) 284fcf3ce44SJohn Forte { 285fcf3ce44SJohn Forte synTables_t synTables; 286fcf3ce44SJohn Forte char versionString[VERSION_STRING_MAX_LEN]; 287fcf3ce44SJohn Forte int ret; 288fcf3ce44SJohn Forte int funcRet; 289fcf3ce44SJohn Forte void *subcommandArgs = NULL; 290fcf3ce44SJohn Forte 291fcf3ce44SJohn Forte (void) setlocale(LC_ALL, ""); 292fcf3ce44SJohn Forte /* set global command name */ 293fcf3ce44SJohn Forte cmdName = getExecBasename(argv[0]); 294fcf3ce44SJohn Forte 295fcf3ce44SJohn Forte (void) snprintf(versionString, VERSION_STRING_MAX_LEN, "%s.%s", 296fcf3ce44SJohn Forte VERSION_STRING_MAJOR, VERSION_STRING_MINOR); 297fcf3ce44SJohn Forte synTables.versionString = versionString; 298fcf3ce44SJohn Forte synTables.longOptionTbl = &longOptions[0]; 299fcf3ce44SJohn Forte synTables.subCommandPropsTbl = &subcommands[0]; 300fcf3ce44SJohn Forte 301fcf3ce44SJohn Forte ret = cmdParse(argc, argv, synTables, subcommandArgs, &funcRet); 302fcf3ce44SJohn Forte if (ret != 0) { 303fcf3ce44SJohn Forte return (ret); 304fcf3ce44SJohn Forte } 305fcf3ce44SJohn Forte 306fcf3ce44SJohn Forte return (funcRet); 307fcf3ce44SJohn Forte } /* end main */ 308