xref: /onnv-gate/usr/src/cmd/fs.d/nfs/lib/smfcfg.c (revision 13080:fcc1e406c13f)
1*13080SPavan.Mettu@Oracle.COM /*
2*13080SPavan.Mettu@Oracle.COM  * CDDL HEADER START
3*13080SPavan.Mettu@Oracle.COM  *
4*13080SPavan.Mettu@Oracle.COM  * The contents of this file are subject to the terms of the
5*13080SPavan.Mettu@Oracle.COM  * Common Development and Distribution License (the "License").
6*13080SPavan.Mettu@Oracle.COM  * You may not use this file except in compliance with the License.
7*13080SPavan.Mettu@Oracle.COM  *
8*13080SPavan.Mettu@Oracle.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*13080SPavan.Mettu@Oracle.COM  * or http://www.opensolaris.org/os/licensing.
10*13080SPavan.Mettu@Oracle.COM  * See the License for the specific language governing permissions
11*13080SPavan.Mettu@Oracle.COM  * and limitations under the License.
12*13080SPavan.Mettu@Oracle.COM  *
13*13080SPavan.Mettu@Oracle.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*13080SPavan.Mettu@Oracle.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*13080SPavan.Mettu@Oracle.COM  * If applicable, add the following below this CDDL HEADER, with the
16*13080SPavan.Mettu@Oracle.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*13080SPavan.Mettu@Oracle.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*13080SPavan.Mettu@Oracle.COM  *
19*13080SPavan.Mettu@Oracle.COM  * CDDL HEADER END
20*13080SPavan.Mettu@Oracle.COM  */
21*13080SPavan.Mettu@Oracle.COM /*
22*13080SPavan.Mettu@Oracle.COM  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23*13080SPavan.Mettu@Oracle.COM  */
24*13080SPavan.Mettu@Oracle.COM #include <stdio.h>
25*13080SPavan.Mettu@Oracle.COM #include <stdlib.h>
26*13080SPavan.Mettu@Oracle.COM #include <syslog.h>
27*13080SPavan.Mettu@Oracle.COM #include <stdarg.h>
28*13080SPavan.Mettu@Oracle.COM #include "smfcfg.h"
29*13080SPavan.Mettu@Oracle.COM 
30*13080SPavan.Mettu@Oracle.COM fs_smfhandle_t *
fs_smf_init(char * fmri,char * instance)31*13080SPavan.Mettu@Oracle.COM fs_smf_init(char *fmri, char *instance)
32*13080SPavan.Mettu@Oracle.COM {
33*13080SPavan.Mettu@Oracle.COM 	fs_smfhandle_t *handle = NULL;
34*13080SPavan.Mettu@Oracle.COM 	char *svcname, srv[MAXPATHLEN];
35*13080SPavan.Mettu@Oracle.COM 
36*13080SPavan.Mettu@Oracle.COM 	/*
37*13080SPavan.Mettu@Oracle.COM 	 * svc name is of the form svc://network/fs/server:instance1
38*13080SPavan.Mettu@Oracle.COM 	 * FMRI portion is /network/fs/server
39*13080SPavan.Mettu@Oracle.COM 	 */
40*13080SPavan.Mettu@Oracle.COM 	snprintf(srv, MAXPATHLEN, "%s", fmri + strlen("svc:/"));
41*13080SPavan.Mettu@Oracle.COM 	svcname = strrchr(srv, ':');
42*13080SPavan.Mettu@Oracle.COM 	if (svcname != NULL)
43*13080SPavan.Mettu@Oracle.COM 		*svcname = '\0';
44*13080SPavan.Mettu@Oracle.COM 	svcname = srv;
45*13080SPavan.Mettu@Oracle.COM 
46*13080SPavan.Mettu@Oracle.COM 	handle = calloc(1, sizeof (fs_smfhandle_t));
47*13080SPavan.Mettu@Oracle.COM 	if (handle != NULL) {
48*13080SPavan.Mettu@Oracle.COM 		handle->fs_handle = scf_handle_create(SCF_VERSION);
49*13080SPavan.Mettu@Oracle.COM 		if (handle->fs_handle == NULL)
50*13080SPavan.Mettu@Oracle.COM 			goto out;
51*13080SPavan.Mettu@Oracle.COM 		if (scf_handle_bind(handle->fs_handle) != 0)
52*13080SPavan.Mettu@Oracle.COM 			goto out;
53*13080SPavan.Mettu@Oracle.COM 		handle->fs_service =
54*13080SPavan.Mettu@Oracle.COM 		    scf_service_create(handle->fs_handle);
55*13080SPavan.Mettu@Oracle.COM 		handle->fs_scope =
56*13080SPavan.Mettu@Oracle.COM 		    scf_scope_create(handle->fs_handle);
57*13080SPavan.Mettu@Oracle.COM 		if (scf_handle_get_local_scope(handle->fs_handle,
58*13080SPavan.Mettu@Oracle.COM 		    handle->fs_scope) != 0)
59*13080SPavan.Mettu@Oracle.COM 			goto out;
60*13080SPavan.Mettu@Oracle.COM 		if (scf_scope_get_service(handle->fs_scope,
61*13080SPavan.Mettu@Oracle.COM 		    svcname, handle->fs_service)  != SCF_SUCCESS) {
62*13080SPavan.Mettu@Oracle.COM 			goto out;
63*13080SPavan.Mettu@Oracle.COM 		}
64*13080SPavan.Mettu@Oracle.COM 		handle->fs_pg =
65*13080SPavan.Mettu@Oracle.COM 		    scf_pg_create(handle->fs_handle);
66*13080SPavan.Mettu@Oracle.COM 		handle->fs_instance =
67*13080SPavan.Mettu@Oracle.COM 		    scf_instance_create(handle->fs_handle);
68*13080SPavan.Mettu@Oracle.COM 		handle->fs_property =
69*13080SPavan.Mettu@Oracle.COM 		    scf_property_create(handle->fs_handle);
70*13080SPavan.Mettu@Oracle.COM 		handle->fs_value =
71*13080SPavan.Mettu@Oracle.COM 		    scf_value_create(handle->fs_handle);
72*13080SPavan.Mettu@Oracle.COM 	} else {
73*13080SPavan.Mettu@Oracle.COM 		fprintf(stderr,
74*13080SPavan.Mettu@Oracle.COM 		    gettext("Cannot access SMF repository: %s\n"), fmri);
75*13080SPavan.Mettu@Oracle.COM 	}
76*13080SPavan.Mettu@Oracle.COM 	return (handle);
77*13080SPavan.Mettu@Oracle.COM 
78*13080SPavan.Mettu@Oracle.COM out:
79*13080SPavan.Mettu@Oracle.COM 	fs_smf_fini(handle);
80*13080SPavan.Mettu@Oracle.COM 	fprintf(stderr, gettext("SMF Initialization problems..%s\n"), fmri);
81*13080SPavan.Mettu@Oracle.COM 	return (NULL);
82*13080SPavan.Mettu@Oracle.COM }
83*13080SPavan.Mettu@Oracle.COM 
84*13080SPavan.Mettu@Oracle.COM 
85*13080SPavan.Mettu@Oracle.COM void
fs_smf_fini(fs_smfhandle_t * handle)86*13080SPavan.Mettu@Oracle.COM fs_smf_fini(fs_smfhandle_t *handle)
87*13080SPavan.Mettu@Oracle.COM {
88*13080SPavan.Mettu@Oracle.COM 	if (handle != NULL) {
89*13080SPavan.Mettu@Oracle.COM 		scf_scope_destroy(handle->fs_scope);
90*13080SPavan.Mettu@Oracle.COM 		scf_instance_destroy(handle->fs_instance);
91*13080SPavan.Mettu@Oracle.COM 		scf_service_destroy(handle->fs_service);
92*13080SPavan.Mettu@Oracle.COM 		scf_pg_destroy(handle->fs_pg);
93*13080SPavan.Mettu@Oracle.COM 		scf_property_destroy(handle->fs_property);
94*13080SPavan.Mettu@Oracle.COM 		scf_value_destroy(handle->fs_value);
95*13080SPavan.Mettu@Oracle.COM 		if (handle->fs_handle != NULL) {
96*13080SPavan.Mettu@Oracle.COM 			scf_handle_unbind(handle->fs_handle);
97*13080SPavan.Mettu@Oracle.COM 			scf_handle_destroy(handle->fs_handle);
98*13080SPavan.Mettu@Oracle.COM 		}
99*13080SPavan.Mettu@Oracle.COM 		free(handle);
100*13080SPavan.Mettu@Oracle.COM 	}
101*13080SPavan.Mettu@Oracle.COM }
102*13080SPavan.Mettu@Oracle.COM 
103*13080SPavan.Mettu@Oracle.COM int
fs_smf_set_prop(smf_fstype_t fstype,char * prop_name,char * valbuf,char * instance,scf_type_t sctype,char * fmri)104*13080SPavan.Mettu@Oracle.COM fs_smf_set_prop(smf_fstype_t fstype, char *prop_name, char *valbuf,
105*13080SPavan.Mettu@Oracle.COM     char *instance, scf_type_t sctype, char *fmri)
106*13080SPavan.Mettu@Oracle.COM {
107*13080SPavan.Mettu@Oracle.COM 	fs_smfhandle_t *phandle;
108*13080SPavan.Mettu@Oracle.COM 	scf_handle_t *handle;
109*13080SPavan.Mettu@Oracle.COM 	scf_propertygroup_t *pg;
110*13080SPavan.Mettu@Oracle.COM 	scf_property_t *prop;
111*13080SPavan.Mettu@Oracle.COM 	scf_transaction_t *tran;
112*13080SPavan.Mettu@Oracle.COM 	scf_transaction_entry_t *entry;
113*13080SPavan.Mettu@Oracle.COM 	scf_instance_t *inst;
114*13080SPavan.Mettu@Oracle.COM 	scf_value_t *val;
115*13080SPavan.Mettu@Oracle.COM 	int valint;
116*13080SPavan.Mettu@Oracle.COM 	int index = 0;
117*13080SPavan.Mettu@Oracle.COM 	int ret = 0;
118*13080SPavan.Mettu@Oracle.COM 	char *p = NULL;
119*13080SPavan.Mettu@Oracle.COM 	char *svcname, srv[MAXPATHLEN];
120*13080SPavan.Mettu@Oracle.COM 	const char *pgname;
121*13080SPavan.Mettu@Oracle.COM 
122*13080SPavan.Mettu@Oracle.COM 	/*
123*13080SPavan.Mettu@Oracle.COM 	 * The SVC names we are using currently are already
124*13080SPavan.Mettu@Oracle.COM 	 * appended by default. Fix this for instances project.
125*13080SPavan.Mettu@Oracle.COM 	 */
126*13080SPavan.Mettu@Oracle.COM 	snprintf(srv, MAXPATHLEN, "%s", fmri);
127*13080SPavan.Mettu@Oracle.COM 	p = strstr(fmri, ":default");
128*13080SPavan.Mettu@Oracle.COM 	if (p == NULL) {
129*13080SPavan.Mettu@Oracle.COM 		strcat(srv, ":");
130*13080SPavan.Mettu@Oracle.COM 		if (instance == NULL)
131*13080SPavan.Mettu@Oracle.COM 			instance = "default";
132*13080SPavan.Mettu@Oracle.COM 		if (strlen(srv) + strlen(instance) > MAXPATHLEN)
133*13080SPavan.Mettu@Oracle.COM 			goto out;
134*13080SPavan.Mettu@Oracle.COM 		strncat(srv, instance, strlen(instance));
135*13080SPavan.Mettu@Oracle.COM 	}
136*13080SPavan.Mettu@Oracle.COM 	svcname = srv;
137*13080SPavan.Mettu@Oracle.COM 	phandle = fs_smf_init(fmri, instance);
138*13080SPavan.Mettu@Oracle.COM 	if (phandle == NULL) {
139*13080SPavan.Mettu@Oracle.COM 		return (SMF_SYSTEM_ERR);
140*13080SPavan.Mettu@Oracle.COM 	}
141*13080SPavan.Mettu@Oracle.COM 	handle = phandle->fs_handle;
142*13080SPavan.Mettu@Oracle.COM 	pg = phandle->fs_pg;
143*13080SPavan.Mettu@Oracle.COM 	prop = phandle->fs_property;
144*13080SPavan.Mettu@Oracle.COM 	inst = phandle->fs_instance;
145*13080SPavan.Mettu@Oracle.COM 	val = phandle->fs_value;
146*13080SPavan.Mettu@Oracle.COM 	tran = scf_transaction_create(handle);
147*13080SPavan.Mettu@Oracle.COM 	entry = scf_entry_create(handle);
148*13080SPavan.Mettu@Oracle.COM 
149*13080SPavan.Mettu@Oracle.COM 	if (handle == NULL || pg == NULL || prop == NULL ||
150*13080SPavan.Mettu@Oracle.COM 	    val == NULL|| tran == NULL || entry == NULL || inst == NULL) {
151*13080SPavan.Mettu@Oracle.COM 		ret = SMF_SYSTEM_ERR;
152*13080SPavan.Mettu@Oracle.COM 		goto out;
153*13080SPavan.Mettu@Oracle.COM 	}
154*13080SPavan.Mettu@Oracle.COM 
155*13080SPavan.Mettu@Oracle.COM 	if (scf_handle_decode_fmri(handle, svcname, phandle->fs_scope,
156*13080SPavan.Mettu@Oracle.COM 	    phandle->fs_service, inst, NULL, NULL, 0) != 0) {
157*13080SPavan.Mettu@Oracle.COM 		ret = scf_error();
158*13080SPavan.Mettu@Oracle.COM 		goto out;
159*13080SPavan.Mettu@Oracle.COM 	}
160*13080SPavan.Mettu@Oracle.COM 	if (fstype == AUTOFS_SMF)
161*13080SPavan.Mettu@Oracle.COM 		pgname = AUTOFS_PROPS_PGNAME;
162*13080SPavan.Mettu@Oracle.COM 	else
163*13080SPavan.Mettu@Oracle.COM 		pgname = NFS_PROPS_PGNAME;
164*13080SPavan.Mettu@Oracle.COM 
165*13080SPavan.Mettu@Oracle.COM 	if (scf_instance_get_pg(inst, pgname,
166*13080SPavan.Mettu@Oracle.COM 	    pg) != -1) {
167*13080SPavan.Mettu@Oracle.COM 		uint8_t	vint;
168*13080SPavan.Mettu@Oracle.COM 		if (scf_transaction_start(tran, pg) == -1) {
169*13080SPavan.Mettu@Oracle.COM 			ret = scf_error();
170*13080SPavan.Mettu@Oracle.COM 			goto out;
171*13080SPavan.Mettu@Oracle.COM 		}
172*13080SPavan.Mettu@Oracle.COM 		switch (sctype) {
173*13080SPavan.Mettu@Oracle.COM 		case SCF_TYPE_INTEGER:
174*13080SPavan.Mettu@Oracle.COM 			errno = 0;
175*13080SPavan.Mettu@Oracle.COM 			valint = strtoul(valbuf, NULL, 0);
176*13080SPavan.Mettu@Oracle.COM 			if (errno != 0) {
177*13080SPavan.Mettu@Oracle.COM 				ret = SMF_SYSTEM_ERR;
178*13080SPavan.Mettu@Oracle.COM 				goto out;
179*13080SPavan.Mettu@Oracle.COM 			}
180*13080SPavan.Mettu@Oracle.COM 			if (scf_transaction_property_change(tran,
181*13080SPavan.Mettu@Oracle.COM 			    entry, prop_name, SCF_TYPE_INTEGER) == 0) {
182*13080SPavan.Mettu@Oracle.COM 				scf_value_set_integer(val, valint);
183*13080SPavan.Mettu@Oracle.COM 				if (scf_entry_add_value(entry, val) < 0) {
184*13080SPavan.Mettu@Oracle.COM 					ret = scf_error();
185*13080SPavan.Mettu@Oracle.COM 					goto out;
186*13080SPavan.Mettu@Oracle.COM 				}
187*13080SPavan.Mettu@Oracle.COM 			}
188*13080SPavan.Mettu@Oracle.COM 			break;
189*13080SPavan.Mettu@Oracle.COM 		case SCF_TYPE_ASTRING:
190*13080SPavan.Mettu@Oracle.COM 			if (scf_transaction_property_change(tran, entry,
191*13080SPavan.Mettu@Oracle.COM 			    prop_name, SCF_TYPE_ASTRING) == 0) {
192*13080SPavan.Mettu@Oracle.COM 				if (scf_value_set_astring(val,
193*13080SPavan.Mettu@Oracle.COM 				    valbuf) == 0) {
194*13080SPavan.Mettu@Oracle.COM 					if (scf_entry_add_value(entry,
195*13080SPavan.Mettu@Oracle.COM 					    val) != 0) {
196*13080SPavan.Mettu@Oracle.COM 						ret = scf_error();
197*13080SPavan.Mettu@Oracle.COM 						goto out;
198*13080SPavan.Mettu@Oracle.COM 					}
199*13080SPavan.Mettu@Oracle.COM 				} else
200*13080SPavan.Mettu@Oracle.COM 					ret = SMF_SYSTEM_ERR;
201*13080SPavan.Mettu@Oracle.COM 			} else
202*13080SPavan.Mettu@Oracle.COM 				ret = SMF_SYSTEM_ERR;
203*13080SPavan.Mettu@Oracle.COM 			break;
204*13080SPavan.Mettu@Oracle.COM 		case SCF_TYPE_BOOLEAN:
205*13080SPavan.Mettu@Oracle.COM 			if (strcmp(valbuf, "1") == 0) {
206*13080SPavan.Mettu@Oracle.COM 				vint = 1;
207*13080SPavan.Mettu@Oracle.COM 			} else if (strcmp(valbuf, "0") == 0) {
208*13080SPavan.Mettu@Oracle.COM 				vint = 0;
209*13080SPavan.Mettu@Oracle.COM 			} else  {
210*13080SPavan.Mettu@Oracle.COM 				ret = SMF_SYSTEM_ERR;
211*13080SPavan.Mettu@Oracle.COM 				break;
212*13080SPavan.Mettu@Oracle.COM 			}
213*13080SPavan.Mettu@Oracle.COM 			if (scf_transaction_property_change(tran, entry,
214*13080SPavan.Mettu@Oracle.COM 			    prop_name, SCF_TYPE_BOOLEAN) == 0) {
215*13080SPavan.Mettu@Oracle.COM 				scf_value_set_boolean(val, (uint8_t)vint);
216*13080SPavan.Mettu@Oracle.COM 				if (scf_entry_add_value(entry, val) != 0) {
217*13080SPavan.Mettu@Oracle.COM 					ret = scf_error();
218*13080SPavan.Mettu@Oracle.COM 					goto out;
219*13080SPavan.Mettu@Oracle.COM 				}
220*13080SPavan.Mettu@Oracle.COM 			} else {
221*13080SPavan.Mettu@Oracle.COM 				ret = SMF_SYSTEM_ERR;
222*13080SPavan.Mettu@Oracle.COM 			}
223*13080SPavan.Mettu@Oracle.COM 			break;
224*13080SPavan.Mettu@Oracle.COM 		}
225*13080SPavan.Mettu@Oracle.COM 		if (ret != SMF_SYSTEM_ERR)
226*13080SPavan.Mettu@Oracle.COM 			scf_transaction_commit(tran);
227*13080SPavan.Mettu@Oracle.COM 	}
228*13080SPavan.Mettu@Oracle.COM out:
229*13080SPavan.Mettu@Oracle.COM 	if (tran != NULL)
230*13080SPavan.Mettu@Oracle.COM 		scf_transaction_destroy(tran);
231*13080SPavan.Mettu@Oracle.COM 	if (entry != NULL)
232*13080SPavan.Mettu@Oracle.COM 		scf_entry_destroy(entry);
233*13080SPavan.Mettu@Oracle.COM 	fs_smf_fini(phandle);
234*13080SPavan.Mettu@Oracle.COM 	return (ret);
235*13080SPavan.Mettu@Oracle.COM }
236*13080SPavan.Mettu@Oracle.COM 
237*13080SPavan.Mettu@Oracle.COM int
fs_smf_get_prop(smf_fstype_t fstype,char * prop_name,char * cbuf,char * instance,scf_type_t sctype,char * fmri,int * bufsz)238*13080SPavan.Mettu@Oracle.COM fs_smf_get_prop(smf_fstype_t fstype, char *prop_name, char *cbuf,
239*13080SPavan.Mettu@Oracle.COM     char *instance, scf_type_t sctype, char *fmri, int *bufsz)
240*13080SPavan.Mettu@Oracle.COM {
241*13080SPavan.Mettu@Oracle.COM 	fs_smfhandle_t *phandle;
242*13080SPavan.Mettu@Oracle.COM 	scf_handle_t *handle;
243*13080SPavan.Mettu@Oracle.COM 	scf_propertygroup_t *pg;
244*13080SPavan.Mettu@Oracle.COM 	scf_property_t *prop;
245*13080SPavan.Mettu@Oracle.COM 	scf_value_t *val;
246*13080SPavan.Mettu@Oracle.COM 	scf_instance_t *inst;
247*13080SPavan.Mettu@Oracle.COM 	int ret = 0, len = 0, length;
248*13080SPavan.Mettu@Oracle.COM 	int64_t valint = 0;
249*13080SPavan.Mettu@Oracle.COM 	char srv[MAXPATHLEN], *p, *svcname;
250*13080SPavan.Mettu@Oracle.COM 	const char *pgname;
251*13080SPavan.Mettu@Oracle.COM 	uint8_t bval;
252*13080SPavan.Mettu@Oracle.COM 
253*13080SPavan.Mettu@Oracle.COM 	/*
254*13080SPavan.Mettu@Oracle.COM 	 * The SVC names we are using currently are already
255*13080SPavan.Mettu@Oracle.COM 	 * appended by default. Fix this for instances project.
256*13080SPavan.Mettu@Oracle.COM 	 */
257*13080SPavan.Mettu@Oracle.COM 	snprintf(srv, MAXPATHLEN, "%s", fmri);
258*13080SPavan.Mettu@Oracle.COM 	p = strstr(fmri, ":default");
259*13080SPavan.Mettu@Oracle.COM 	if (p == NULL) {
260*13080SPavan.Mettu@Oracle.COM 		strcat(srv, ":");
261*13080SPavan.Mettu@Oracle.COM 		if (instance == NULL)
262*13080SPavan.Mettu@Oracle.COM 			instance = "default";
263*13080SPavan.Mettu@Oracle.COM 		if (strlen(srv) + strlen(instance) > MAXPATHLEN)
264*13080SPavan.Mettu@Oracle.COM 			goto out;
265*13080SPavan.Mettu@Oracle.COM 		strncat(srv, instance, strlen(instance));
266*13080SPavan.Mettu@Oracle.COM 	}
267*13080SPavan.Mettu@Oracle.COM 	svcname = srv;
268*13080SPavan.Mettu@Oracle.COM 	phandle = fs_smf_init(fmri, instance);
269*13080SPavan.Mettu@Oracle.COM 	if (phandle == NULL)
270*13080SPavan.Mettu@Oracle.COM 		return (SMF_SYSTEM_ERR);
271*13080SPavan.Mettu@Oracle.COM 	handle = phandle->fs_handle;
272*13080SPavan.Mettu@Oracle.COM 	pg = phandle->fs_pg;
273*13080SPavan.Mettu@Oracle.COM 	inst = phandle->fs_instance;
274*13080SPavan.Mettu@Oracle.COM 	prop = phandle->fs_property;
275*13080SPavan.Mettu@Oracle.COM 	val = phandle->fs_value;
276*13080SPavan.Mettu@Oracle.COM 
277*13080SPavan.Mettu@Oracle.COM 	if (handle == NULL || pg == NULL || prop == NULL || val == NULL ||
278*13080SPavan.Mettu@Oracle.COM 	    inst == NULL)  {
279*13080SPavan.Mettu@Oracle.COM 		return (SMF_SYSTEM_ERR);
280*13080SPavan.Mettu@Oracle.COM 	}
281*13080SPavan.Mettu@Oracle.COM 
282*13080SPavan.Mettu@Oracle.COM 
283*13080SPavan.Mettu@Oracle.COM 	if (scf_handle_decode_fmri(handle, svcname, phandle->fs_scope,
284*13080SPavan.Mettu@Oracle.COM 	    phandle->fs_service, inst, NULL, NULL, 0) != 0) {
285*13080SPavan.Mettu@Oracle.COM 		ret = scf_error();
286*13080SPavan.Mettu@Oracle.COM 		goto out;
287*13080SPavan.Mettu@Oracle.COM 	}
288*13080SPavan.Mettu@Oracle.COM 
289*13080SPavan.Mettu@Oracle.COM 	if (fstype == AUTOFS_SMF)
290*13080SPavan.Mettu@Oracle.COM 		pgname = AUTOFS_PROPS_PGNAME;
291*13080SPavan.Mettu@Oracle.COM 	else
292*13080SPavan.Mettu@Oracle.COM 		pgname = NFS_PROPS_PGNAME;
293*13080SPavan.Mettu@Oracle.COM 
294*13080SPavan.Mettu@Oracle.COM 	if (scf_instance_get_pg(inst, pgname, pg) != -1) {
295*13080SPavan.Mettu@Oracle.COM 		if (scf_pg_get_property(pg, prop_name,
296*13080SPavan.Mettu@Oracle.COM 		    prop) != SCF_SUCCESS) {
297*13080SPavan.Mettu@Oracle.COM 			ret = scf_error();
298*13080SPavan.Mettu@Oracle.COM 			goto out;
299*13080SPavan.Mettu@Oracle.COM 		}
300*13080SPavan.Mettu@Oracle.COM 		if (scf_property_get_value(prop, val) != SCF_SUCCESS) {
301*13080SPavan.Mettu@Oracle.COM 			ret = scf_error();
302*13080SPavan.Mettu@Oracle.COM 			goto out;
303*13080SPavan.Mettu@Oracle.COM 		}
304*13080SPavan.Mettu@Oracle.COM 		switch (sctype) {
305*13080SPavan.Mettu@Oracle.COM 		case SCF_TYPE_ASTRING:
306*13080SPavan.Mettu@Oracle.COM 			len = scf_value_get_astring(val, cbuf, *bufsz);
307*13080SPavan.Mettu@Oracle.COM 			if (len < 0 || len > *bufsz) {
308*13080SPavan.Mettu@Oracle.COM 				ret = scf_error();
309*13080SPavan.Mettu@Oracle.COM 				goto out;
310*13080SPavan.Mettu@Oracle.COM 			}
311*13080SPavan.Mettu@Oracle.COM 			ret = 0;
312*13080SPavan.Mettu@Oracle.COM 			*bufsz = len;
313*13080SPavan.Mettu@Oracle.COM 		break;
314*13080SPavan.Mettu@Oracle.COM 		case SCF_TYPE_INTEGER:
315*13080SPavan.Mettu@Oracle.COM 			if (scf_value_get_integer(val, &valint) != 0) {
316*13080SPavan.Mettu@Oracle.COM 				ret = scf_error();
317*13080SPavan.Mettu@Oracle.COM 				goto out;
318*13080SPavan.Mettu@Oracle.COM 			}
319*13080SPavan.Mettu@Oracle.COM 			length =  snprintf(cbuf, *bufsz, "%lld", valint);
320*13080SPavan.Mettu@Oracle.COM 			if (length < 0 || length > *bufsz) {
321*13080SPavan.Mettu@Oracle.COM 				ret = SA_BAD_VALUE;
322*13080SPavan.Mettu@Oracle.COM 				goto out;
323*13080SPavan.Mettu@Oracle.COM 			}
324*13080SPavan.Mettu@Oracle.COM 			ret = 0;
325*13080SPavan.Mettu@Oracle.COM 		break;
326*13080SPavan.Mettu@Oracle.COM 		case SCF_TYPE_BOOLEAN:
327*13080SPavan.Mettu@Oracle.COM 			if (scf_value_get_boolean(val, &bval) != 0) {
328*13080SPavan.Mettu@Oracle.COM 				ret = scf_error();
329*13080SPavan.Mettu@Oracle.COM 				goto out;
330*13080SPavan.Mettu@Oracle.COM 			}
331*13080SPavan.Mettu@Oracle.COM 			if (bval == 1) {
332*13080SPavan.Mettu@Oracle.COM 				length = snprintf(cbuf, *bufsz, "%s", "true");
333*13080SPavan.Mettu@Oracle.COM 			} else {
334*13080SPavan.Mettu@Oracle.COM 				length = snprintf(cbuf, *bufsz, "%s", "false");
335*13080SPavan.Mettu@Oracle.COM 			}
336*13080SPavan.Mettu@Oracle.COM 			if (length < 0 || length > *bufsz) {
337*13080SPavan.Mettu@Oracle.COM 				ret = SA_BAD_VALUE;
338*13080SPavan.Mettu@Oracle.COM 				goto out;
339*13080SPavan.Mettu@Oracle.COM 			}
340*13080SPavan.Mettu@Oracle.COM 		break;
341*13080SPavan.Mettu@Oracle.COM 		}
342*13080SPavan.Mettu@Oracle.COM 	} else {
343*13080SPavan.Mettu@Oracle.COM 		ret = scf_error();
344*13080SPavan.Mettu@Oracle.COM 	}
345*13080SPavan.Mettu@Oracle.COM 	if ((ret != 0) && scf_error() != SCF_ERROR_NONE)
346*13080SPavan.Mettu@Oracle.COM 		fprintf(stdout, gettext("%s\n"), scf_strerror(ret));
347*13080SPavan.Mettu@Oracle.COM out:
348*13080SPavan.Mettu@Oracle.COM 	fs_smf_fini(phandle);
349*13080SPavan.Mettu@Oracle.COM 	return (ret);
350*13080SPavan.Mettu@Oracle.COM }
351*13080SPavan.Mettu@Oracle.COM 
352*13080SPavan.Mettu@Oracle.COM 
353*13080SPavan.Mettu@Oracle.COM int
nfs_smf_get_prop(char * prop_name,char * propbuf,char * instance,scf_type_t sctype,char * svc_name,int * bufsz)354*13080SPavan.Mettu@Oracle.COM nfs_smf_get_prop(char *prop_name, char *propbuf, char *instance,
355*13080SPavan.Mettu@Oracle.COM     scf_type_t sctype, char *svc_name, int *bufsz)
356*13080SPavan.Mettu@Oracle.COM {
357*13080SPavan.Mettu@Oracle.COM 	return (fs_smf_get_prop(NFS_SMF, prop_name, propbuf,
358*13080SPavan.Mettu@Oracle.COM 	    instance, sctype, svc_name, bufsz));
359*13080SPavan.Mettu@Oracle.COM }
360*13080SPavan.Mettu@Oracle.COM 
361*13080SPavan.Mettu@Oracle.COM int
nfs_smf_set_prop(char * prop_name,char * value,char * instance,scf_type_t type,char * svc_name)362*13080SPavan.Mettu@Oracle.COM nfs_smf_set_prop(char *prop_name, char *value, char *instance,
363*13080SPavan.Mettu@Oracle.COM     scf_type_t type, char *svc_name)
364*13080SPavan.Mettu@Oracle.COM {
365*13080SPavan.Mettu@Oracle.COM 	return (fs_smf_set_prop(NFS_SMF, prop_name, value, instance,
366*13080SPavan.Mettu@Oracle.COM 	    type, svc_name));
367*13080SPavan.Mettu@Oracle.COM }
368*13080SPavan.Mettu@Oracle.COM 
369*13080SPavan.Mettu@Oracle.COM int
autofs_smf_set_prop(char * prop_name,char * value,char * instance,scf_type_t type,char * svc_name)370*13080SPavan.Mettu@Oracle.COM autofs_smf_set_prop(char *prop_name, char *value, char *instance,
371*13080SPavan.Mettu@Oracle.COM     scf_type_t type, char *svc_name)
372*13080SPavan.Mettu@Oracle.COM {
373*13080SPavan.Mettu@Oracle.COM 	return (fs_smf_set_prop(AUTOFS_SMF, prop_name, value, instance,
374*13080SPavan.Mettu@Oracle.COM 	    type, svc_name));
375*13080SPavan.Mettu@Oracle.COM }
376*13080SPavan.Mettu@Oracle.COM 
377*13080SPavan.Mettu@Oracle.COM int
autofs_smf_get_prop(char * prop_name,char * propbuf,char * instance,scf_type_t sctype,char * svc_name,int * bufsz)378*13080SPavan.Mettu@Oracle.COM autofs_smf_get_prop(char *prop_name, char *propbuf, char *instance,
379*13080SPavan.Mettu@Oracle.COM     scf_type_t sctype, char *svc_name, int *bufsz)
380*13080SPavan.Mettu@Oracle.COM {
381*13080SPavan.Mettu@Oracle.COM 	return (fs_smf_get_prop(AUTOFS_SMF, prop_name, propbuf,
382*13080SPavan.Mettu@Oracle.COM 	    instance, sctype, svc_name, bufsz));
383*13080SPavan.Mettu@Oracle.COM }
384*13080SPavan.Mettu@Oracle.COM 
385*13080SPavan.Mettu@Oracle.COM boolean_t
string_to_boolean(const char * str)386*13080SPavan.Mettu@Oracle.COM string_to_boolean(const char *str)
387*13080SPavan.Mettu@Oracle.COM {
388*13080SPavan.Mettu@Oracle.COM 	if (strcasecmp(str, "true") == 0 || atoi(str) == 1 ||
389*13080SPavan.Mettu@Oracle.COM 	    strcasecmp(str, "on") == 0 || strcasecmp(str, "yes") == 0) {
390*13080SPavan.Mettu@Oracle.COM 		return (B_TRUE);
391*13080SPavan.Mettu@Oracle.COM 	} else
392*13080SPavan.Mettu@Oracle.COM 		return (B_FALSE);
393*13080SPavan.Mettu@Oracle.COM }
394