1*5c51f124SMoriah Waterland /* 2*5c51f124SMoriah Waterland * 3*5c51f124SMoriah Waterland * CDDL HEADER START 4*5c51f124SMoriah Waterland * 5*5c51f124SMoriah Waterland * The contents of this file are subject to the terms of the 6*5c51f124SMoriah Waterland * Common Development and Distribution License (the "License"). 7*5c51f124SMoriah Waterland * You may not use this file except in compliance with the License. 8*5c51f124SMoriah Waterland * 9*5c51f124SMoriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*5c51f124SMoriah Waterland * or http://www.opensolaris.org/os/licensing. 11*5c51f124SMoriah Waterland * See the License for the specific language governing permissions 12*5c51f124SMoriah Waterland * and limitations under the License. 13*5c51f124SMoriah Waterland * 14*5c51f124SMoriah Waterland * When distributing Covered Code, include this CDDL HEADER in each 15*5c51f124SMoriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*5c51f124SMoriah Waterland * If applicable, add the following below this CDDL HEADER, with the 17*5c51f124SMoriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying 18*5c51f124SMoriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner] 19*5c51f124SMoriah Waterland * 20*5c51f124SMoriah Waterland * CDDL HEADER END 21*5c51f124SMoriah Waterland * 22*5c51f124SMoriah Waterland */ 23*5c51f124SMoriah Waterland 24*5c51f124SMoriah Waterland /* 25*5c51f124SMoriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 26*5c51f124SMoriah Waterland * Use is subject to license terms. 27*5c51f124SMoriah Waterland * 28*5c51f124SMoriah Waterland */ 29*5c51f124SMoriah Waterland 30*5c51f124SMoriah Waterland 31*5c51f124SMoriah Waterland #include <stdlib.h> 32*5c51f124SMoriah Waterland #include <unistd.h> 33*5c51f124SMoriah Waterland #include <strings.h> 34*5c51f124SMoriah Waterland #include <libscf.h> 35*5c51f124SMoriah Waterland 36*5c51f124SMoriah Waterland #define MAX_TRY 15 37*5c51f124SMoriah Waterland static boolean_t fs_temporarily_enabled = B_FALSE; 38*5c51f124SMoriah Waterland char svm_core_svcs[] = "system/filesystem/local:default"; 39*5c51f124SMoriah Waterland 40*5c51f124SMoriah Waterland /* 41*5c51f124SMoriah Waterland * Name: enable_local_fs 42*5c51f124SMoriah Waterland * Description: If the SMF service system/filesystem/local:default is not 43*5c51f124SMoriah Waterland * enabled, then this function enables the service, so that, 44*5c51f124SMoriah Waterland * all the local filesystems are mounted. 45*5c51f124SMoriah Waterland * Arguments: None 46*5c51f124SMoriah Waterland * Returns: B_TRUE on success; B_FALSE on error. 47*5c51f124SMoriah Waterland */ 48*5c51f124SMoriah Waterland boolean_t 49*5c51f124SMoriah Waterland enable_local_fs(void) 50*5c51f124SMoriah Waterland { 51*5c51f124SMoriah Waterland char *cur_smf_state; 52*5c51f124SMoriah Waterland int i; 53*5c51f124SMoriah Waterland boolean_t fs_enabled_here = B_FALSE; 54*5c51f124SMoriah Waterland 55*5c51f124SMoriah Waterland if (fs_temporarily_enabled) { 56*5c51f124SMoriah Waterland return (B_TRUE); 57*5c51f124SMoriah Waterland } 58*5c51f124SMoriah Waterland 59*5c51f124SMoriah Waterland if ((cur_smf_state = smf_get_state(svm_core_svcs)) != NULL) { 60*5c51f124SMoriah Waterland if (strcmp(cur_smf_state, SCF_STATE_STRING_DISABLED) == 0) { 61*5c51f124SMoriah Waterland if (smf_enable_instance(svm_core_svcs, SMF_TEMPORARY) 62*5c51f124SMoriah Waterland != 0) { 63*5c51f124SMoriah Waterland free(cur_smf_state); 64*5c51f124SMoriah Waterland return (B_FALSE); 65*5c51f124SMoriah Waterland } 66*5c51f124SMoriah Waterland 67*5c51f124SMoriah Waterland fs_enabled_here = B_TRUE; 68*5c51f124SMoriah Waterland 69*5c51f124SMoriah Waterland } else if (strcmp(cur_smf_state, SCF_STATE_STRING_ONLINE) 70*5c51f124SMoriah Waterland == 0) { 71*5c51f124SMoriah Waterland free(cur_smf_state); 72*5c51f124SMoriah Waterland return (B_TRUE); 73*5c51f124SMoriah Waterland } else if (strcmp(cur_smf_state, SCF_STATE_STRING_OFFLINE) 74*5c51f124SMoriah Waterland != 0) { 75*5c51f124SMoriah Waterland free(cur_smf_state); 76*5c51f124SMoriah Waterland return (B_FALSE); 77*5c51f124SMoriah Waterland } 78*5c51f124SMoriah Waterland 79*5c51f124SMoriah Waterland free(cur_smf_state); 80*5c51f124SMoriah Waterland 81*5c51f124SMoriah Waterland } else { 82*5c51f124SMoriah Waterland return (B_FALSE); 83*5c51f124SMoriah Waterland } 84*5c51f124SMoriah Waterland 85*5c51f124SMoriah Waterland for (i = 0; i < MAX_TRY; i++) { 86*5c51f124SMoriah Waterland if ((cur_smf_state = smf_get_state(svm_core_svcs)) != NULL) { 87*5c51f124SMoriah Waterland if (strcmp(cur_smf_state, SCF_STATE_STRING_ONLINE) 88*5c51f124SMoriah Waterland == 0) { 89*5c51f124SMoriah Waterland free(cur_smf_state); 90*5c51f124SMoriah Waterland if (fs_enabled_here) { 91*5c51f124SMoriah Waterland fs_temporarily_enabled = B_TRUE; 92*5c51f124SMoriah Waterland } 93*5c51f124SMoriah Waterland return (B_TRUE); 94*5c51f124SMoriah Waterland } else if ((strcmp(cur_smf_state, 95*5c51f124SMoriah Waterland SCF_STATE_STRING_OFFLINE) == 0) || 96*5c51f124SMoriah Waterland (strcmp(cur_smf_state, SCF_STATE_STRING_DISABLED) == 0)) { 97*5c51f124SMoriah Waterland (void) sleep(1); 98*5c51f124SMoriah Waterland free(cur_smf_state); 99*5c51f124SMoriah Waterland } else { 100*5c51f124SMoriah Waterland free(cur_smf_state); 101*5c51f124SMoriah Waterland return (B_FALSE); 102*5c51f124SMoriah Waterland } 103*5c51f124SMoriah Waterland } else { 104*5c51f124SMoriah Waterland return (B_FALSE); 105*5c51f124SMoriah Waterland } 106*5c51f124SMoriah Waterland } 107*5c51f124SMoriah Waterland 108*5c51f124SMoriah Waterland return (B_FALSE); 109*5c51f124SMoriah Waterland } 110*5c51f124SMoriah Waterland 111*5c51f124SMoriah Waterland /* 112*5c51f124SMoriah Waterland * Name: restore_local_fs 113*5c51f124SMoriah Waterland * Description: If the SMF service system/filesystem/local:default was 114*5c51f124SMoriah Waterland * enabled using enable_local_fs(), then this function disables 115*5c51f124SMoriah Waterland * the service. 116*5c51f124SMoriah Waterland * Arguments: None 117*5c51f124SMoriah Waterland * Returns: B_TRUE on success; B_FALSE on error. 118*5c51f124SMoriah Waterland */ 119*5c51f124SMoriah Waterland boolean_t 120*5c51f124SMoriah Waterland restore_local_fs(void) 121*5c51f124SMoriah Waterland { 122*5c51f124SMoriah Waterland int i; 123*5c51f124SMoriah Waterland char *cur_smf_state; 124*5c51f124SMoriah Waterland 125*5c51f124SMoriah Waterland if (!fs_temporarily_enabled) { 126*5c51f124SMoriah Waterland return (B_TRUE); 127*5c51f124SMoriah Waterland } 128*5c51f124SMoriah Waterland 129*5c51f124SMoriah Waterland if (smf_disable_instance(svm_core_svcs, SMF_TEMPORARY) != 0) { 130*5c51f124SMoriah Waterland return (B_FALSE); 131*5c51f124SMoriah Waterland } 132*5c51f124SMoriah Waterland 133*5c51f124SMoriah Waterland for (i = 0; i < MAX_TRY; i++) { 134*5c51f124SMoriah Waterland if ((cur_smf_state = smf_get_state(svm_core_svcs)) != NULL) { 135*5c51f124SMoriah Waterland if (strcmp(cur_smf_state, SCF_STATE_STRING_DISABLED) 136*5c51f124SMoriah Waterland == 0) { 137*5c51f124SMoriah Waterland fs_temporarily_enabled = B_FALSE; 138*5c51f124SMoriah Waterland free(cur_smf_state); 139*5c51f124SMoriah Waterland break; 140*5c51f124SMoriah Waterland } 141*5c51f124SMoriah Waterland (void) sleep(1); 142*5c51f124SMoriah Waterland 143*5c51f124SMoriah Waterland free(cur_smf_state); 144*5c51f124SMoriah Waterland } else { 145*5c51f124SMoriah Waterland return (B_FALSE); 146*5c51f124SMoriah Waterland } 147*5c51f124SMoriah Waterland } 148*5c51f124SMoriah Waterland 149*5c51f124SMoriah Waterland return (!fs_temporarily_enabled); 150*5c51f124SMoriah Waterland } 151