5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER START
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * The contents of this file are subject to the terms of the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Common Development and Distribution License (the "License").
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You may not use this file except in compliance with the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * or http://www.opensolaris.org/os/licensing.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * See the License for the specific language governing permissions
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * and limitations under the License.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * When distributing Covered Code, include this CDDL HEADER in each
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * If applicable, add the following below this CDDL HEADER, with the
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * fields enclosed by brackets "[]" replaced with your own identifying
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * information: Portions Copyright [yyyy] [name of copyright owner]
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * CDDL HEADER END
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Use is subject to license terms.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland *
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland*/
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <stdlib.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <unistd.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <strings.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#include <libscf.h>
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland#define MAX_TRY 15
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandstatic boolean_t fs_temporarily_enabled = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandchar svm_core_svcs[] = "system/filesystem/local:default";
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: enable_local_fs
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: If the SMF service system/filesystem/local:default is not
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * enabled, then this function enables the service, so that,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * all the local filesystems are mounted.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: None
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: B_TRUE on success; B_FALSE on error.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandenable_local_fs(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *cur_smf_state;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland boolean_t fs_enabled_here = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fs_temporarily_enabled) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((cur_smf_state = smf_get_state(svm_core_svcs)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(cur_smf_state, SCF_STATE_STRING_DISABLED) == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smf_enable_instance(svm_core_svcs, SMF_TEMPORARY)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(cur_smf_state);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fs_enabled_here = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strcmp(cur_smf_state, SCF_STATE_STRING_ONLINE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(cur_smf_state);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if (strcmp(cur_smf_state, SCF_STATE_STRING_OFFLINE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(cur_smf_state);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(cur_smf_state);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < MAX_TRY; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((cur_smf_state = smf_get_state(svm_core_svcs)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(cur_smf_state, SCF_STATE_STRING_ONLINE)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(cur_smf_state);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (fs_enabled_here) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fs_temporarily_enabled = B_TRUE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else if ((strcmp(cur_smf_state,
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland SCF_STATE_STRING_OFFLINE) == 0) ||
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (strcmp(cur_smf_state, SCF_STATE_STRING_DISABLED) == 0)) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sleep(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(cur_smf_state);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(cur_smf_state);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland/*
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Name: restore_local_fs
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Description: If the SMF service system/filesystem/local:default was
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * enabled using enable_local_fs(), then this function disables
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * the service.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Arguments: None
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland * Returns: B_TRUE on success; B_FALSE on error.
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland */
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandboolean_t
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterlandrestore_local_fs(void)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland{
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland int i;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland char *cur_smf_state;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (!fs_temporarily_enabled) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_TRUE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (smf_disable_instance(svm_core_svcs, SMF_TEMPORARY) != 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland for (i = 0; i < MAX_TRY; i++) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if ((cur_smf_state = smf_get_state(svm_core_svcs)) != NULL) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland if (strcmp(cur_smf_state, SCF_STATE_STRING_DISABLED)
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland == 0) {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland fs_temporarily_enabled = B_FALSE;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(cur_smf_state);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland break;
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland (void) sleep(1);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland free(cur_smf_state);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland } else {
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (B_FALSE);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland }
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland return (!fs_temporarily_enabled);
5c51f1241dbbdf2656d0e10011981411ed0c9673Moriah Waterland}