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