xref: /illumos-gate/usr/src/cmd/fs.d/nfs/lib/smfcfg.c (revision f44e1126)
1dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States /*
2dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * CDDL HEADER START
3dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  *
4dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * The contents of this file are subject to the terms of the
5dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * Common Development and Distribution License (the "License").
6dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * You may not use this file except in compliance with the License.
7dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  *
8dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * or http://www.opensolaris.org/os/licensing.
10dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * See the License for the specific language governing permissions
11dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * and limitations under the License.
12dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  *
13dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * When distributing Covered Code, include this CDDL HEADER in each
14dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * If applicable, add the following below this CDDL HEADER, with the
16dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * fields enclosed by brackets "[]" replaced with your own identifying
17dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * information: Portions Copyright [yyyy] [name of copyright owner]
18dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  *
19dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * CDDL HEADER END
20dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  */
21bbaa8b60SDan Kruchinin 
22dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States /*
2354d34259SMarcel Telka  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
24dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
25327e8b4bSAndy Fiddaman  * Copyright 2023 Oxide Computer Company
26dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States  */
2754d34259SMarcel Telka 
28dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States #include <stdio.h>
29dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States #include <stdlib.h>
30dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States #include <syslog.h>
31dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States #include <stdarg.h>
32*f44e1126SVitaliy Gusev #include <nfs/nfs.h>
3386147f89SToomas Soome #include <rpcsvc/daemon_utils.h>
34*f44e1126SVitaliy Gusev #include <sys/sysmacros.h>
35dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States #include "smfcfg.h"
36dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
37*f44e1126SVitaliy Gusev /*
38*f44e1126SVitaliy Gusev  * NFS version strings translation table to numeric form.
39*f44e1126SVitaliy Gusev  */
40*f44e1126SVitaliy Gusev static struct str_val {
41*f44e1126SVitaliy Gusev 	const char *str;
42*f44e1126SVitaliy Gusev 	uint32_t val;
43*f44e1126SVitaliy Gusev } nfs_versions[] = {
44*f44e1126SVitaliy Gusev 	{ "2",		NFS_VERS_2 },
45*f44e1126SVitaliy Gusev 	{ "3",		NFS_VERS_3 },
46*f44e1126SVitaliy Gusev 	{ "4",		NFS_VERS_4 },
47*f44e1126SVitaliy Gusev 	{ "4.0",	NFS_VERS_4 },
48*f44e1126SVitaliy Gusev 	{ "4.1",	NFS_VERS_4_1 },
49*f44e1126SVitaliy Gusev 	{ "4.2",	NFS_VERS_4_2 }
50*f44e1126SVitaliy Gusev };
51*f44e1126SVitaliy Gusev 
52*f44e1126SVitaliy Gusev /*
53*f44e1126SVitaliy Gusev  * Translate NFS version string to numeric form.
54*f44e1126SVitaliy Gusev  * Returns NFS_VERS_... value or zero for invalid version string.
55*f44e1126SVitaliy Gusev  */
56*f44e1126SVitaliy Gusev uint32_t
nfs_convert_version_str(const char * version)57*f44e1126SVitaliy Gusev nfs_convert_version_str(const char *version)
58*f44e1126SVitaliy Gusev {
59*f44e1126SVitaliy Gusev 	uint32_t v = 0;
60*f44e1126SVitaliy Gusev 
61*f44e1126SVitaliy Gusev 	for (size_t i = 0; i < ARRAY_SIZE(nfs_versions); i++) {
62*f44e1126SVitaliy Gusev 		if (strcmp(version, nfs_versions[i].str) == 0) {
63*f44e1126SVitaliy Gusev 			v = nfs_versions[i].val;
64*f44e1126SVitaliy Gusev 			break;
65*f44e1126SVitaliy Gusev 		}
66*f44e1126SVitaliy Gusev 	}
67*f44e1126SVitaliy Gusev 
68*f44e1126SVitaliy Gusev 	return (v);
69*f44e1126SVitaliy Gusev }
70*f44e1126SVitaliy Gusev 
71dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States fs_smfhandle_t *
fs_smf_init(const char * fmri,const char * instance)7286147f89SToomas Soome fs_smf_init(const char *fmri, const char *instance)
73dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States {
74dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	fs_smfhandle_t *handle = NULL;
75dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	char *svcname, srv[MAXPATHLEN];
76dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
77dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	/*
78dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	 * svc name is of the form svc://network/fs/server:instance1
79dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	 * FMRI portion is /network/fs/server
80dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	 */
81544783caSToomas Soome 	(void) snprintf(srv, MAXPATHLEN, "%s", fmri + strlen("svc:/"));
82dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	svcname = strrchr(srv, ':');
83dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (svcname != NULL)
84dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		*svcname = '\0';
85dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	svcname = srv;
86dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
87dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	handle = calloc(1, sizeof (fs_smfhandle_t));
88dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (handle != NULL) {
89dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		handle->fs_handle = scf_handle_create(SCF_VERSION);
90dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (handle->fs_handle == NULL)
91dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			goto out;
92dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (scf_handle_bind(handle->fs_handle) != 0)
93dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			goto out;
94dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		handle->fs_service =
95dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		    scf_service_create(handle->fs_handle);
96dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		handle->fs_scope =
97dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		    scf_scope_create(handle->fs_handle);
98dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (scf_handle_get_local_scope(handle->fs_handle,
99dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		    handle->fs_scope) != 0)
100dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			goto out;
101dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (scf_scope_get_service(handle->fs_scope,
102dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		    svcname, handle->fs_service)  != SCF_SUCCESS) {
103dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			goto out;
104dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		}
105dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		handle->fs_pg =
106dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		    scf_pg_create(handle->fs_handle);
107dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		handle->fs_instance =
108dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		    scf_instance_create(handle->fs_handle);
109dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		handle->fs_property =
110dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		    scf_property_create(handle->fs_handle);
111dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		handle->fs_value =
112dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		    scf_value_create(handle->fs_handle);
113dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	} else {
114dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		fprintf(stderr,
115dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		    gettext("Cannot access SMF repository: %s\n"), fmri);
116dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
117dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	return (handle);
118dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
119dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States out:
120dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	fs_smf_fini(handle);
121327e8b4bSAndy Fiddaman 	if (scf_error() != SCF_ERROR_NOT_FOUND) {
122327e8b4bSAndy Fiddaman 		fprintf(stderr,
123327e8b4bSAndy Fiddaman 		    gettext("SMF Initialization problem(%s): %s\n"),
124327e8b4bSAndy Fiddaman 		    fmri, scf_strerror(scf_error()));
125327e8b4bSAndy Fiddaman 	}
126dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	return (NULL);
127dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States }
128dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
129dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States void
fs_smf_fini(fs_smfhandle_t * handle)130dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States fs_smf_fini(fs_smfhandle_t *handle)
131dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States {
132dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (handle != NULL) {
133dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		scf_scope_destroy(handle->fs_scope);
134dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		scf_instance_destroy(handle->fs_instance);
135dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		scf_service_destroy(handle->fs_service);
136dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		scf_pg_destroy(handle->fs_pg);
137dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		scf_property_destroy(handle->fs_property);
138dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		scf_value_destroy(handle->fs_value);
139dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (handle->fs_handle != NULL) {
140544783caSToomas Soome 			(void) scf_handle_unbind(handle->fs_handle);
141dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			scf_handle_destroy(handle->fs_handle);
142dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		}
143dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		free(handle);
144dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
145dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States }
146dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
147dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States int
fs_smf_set_prop(smf_fstype_t fstype,char * prop_name,char * valbuf,char * instance,scf_type_t sctype,char * fmri)148dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States fs_smf_set_prop(smf_fstype_t fstype, char *prop_name, char *valbuf,
149dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States     char *instance, scf_type_t sctype, char *fmri)
150dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States {
151cf7e209dSIgor Kozhukhov 	fs_smfhandle_t *phandle = NULL;
152dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	scf_handle_t *handle;
153dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	scf_propertygroup_t *pg;
154dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	scf_property_t *prop;
155cf7e209dSIgor Kozhukhov 	scf_transaction_t *tran = NULL;
156cf7e209dSIgor Kozhukhov 	scf_transaction_entry_t *entry = NULL;
157dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	scf_instance_t *inst;
158dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	scf_value_t *val;
159dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	int valint;
160dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	int ret = 0;
161dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	char *p = NULL;
162dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	char *svcname, srv[MAXPATHLEN];
163dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	const char *pgname;
164dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
165dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	/*
166dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	 * The SVC names we are using currently are already
167dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	 * appended by default. Fix this for instances project.
168dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	 */
169544783caSToomas Soome 	(void) snprintf(srv, MAXPATHLEN, "%s", fmri);
170dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	p = strstr(fmri, ":default");
171dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (p == NULL) {
172544783caSToomas Soome 		(void) strcat(srv, ":");
173dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (instance == NULL)
174dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			instance = "default";
175dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (strlen(srv) + strlen(instance) > MAXPATHLEN)
176dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			goto out;
177544783caSToomas Soome 		(void) strncat(srv, instance, strlen(instance));
178dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
179dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	svcname = srv;
180dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	phandle = fs_smf_init(fmri, instance);
181dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (phandle == NULL) {
182dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		return (SMF_SYSTEM_ERR);
183dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
184dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	handle = phandle->fs_handle;
185dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	pg = phandle->fs_pg;
186dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	prop = phandle->fs_property;
187dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	inst = phandle->fs_instance;
188dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	val = phandle->fs_value;
189dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	tran = scf_transaction_create(handle);
190dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	entry = scf_entry_create(handle);
191dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
192dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (handle == NULL || pg == NULL || prop == NULL ||
193dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	    val == NULL|| tran == NULL || entry == NULL || inst == NULL) {
194dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		ret = SMF_SYSTEM_ERR;
195dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		goto out;
196dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
197dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
198dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (scf_handle_decode_fmri(handle, svcname, phandle->fs_scope,
199dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	    phandle->fs_service, inst, NULL, NULL, 0) != 0) {
200dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		ret = scf_error();
201dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		goto out;
202dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
203dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (fstype == AUTOFS_SMF)
204dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		pgname = AUTOFS_PROPS_PGNAME;
205dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	else
206dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		pgname = NFS_PROPS_PGNAME;
207dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
208dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (scf_instance_get_pg(inst, pgname,
209dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	    pg) != -1) {
210dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		uint8_t	vint;
211dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (scf_transaction_start(tran, pg) == -1) {
212dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			ret = scf_error();
213dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			goto out;
214dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		}
215dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		switch (sctype) {
216dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		case SCF_TYPE_INTEGER:
217dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			errno = 0;
218dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			valint = strtoul(valbuf, NULL, 0);
219dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (errno != 0) {
220dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				ret = SMF_SYSTEM_ERR;
221dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				goto out;
222dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			}
223dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (scf_transaction_property_change(tran,
224dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			    entry, prop_name, SCF_TYPE_INTEGER) == 0) {
225dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				scf_value_set_integer(val, valint);
226dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				if (scf_entry_add_value(entry, val) < 0) {
227dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 					ret = scf_error();
228dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 					goto out;
229dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				}
230dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			}
231dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			break;
232dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		case SCF_TYPE_ASTRING:
233dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (scf_transaction_property_change(tran, entry,
234dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			    prop_name, SCF_TYPE_ASTRING) == 0) {
235dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				if (scf_value_set_astring(val,
236dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				    valbuf) == 0) {
237dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 					if (scf_entry_add_value(entry,
238dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 					    val) != 0) {
239dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 						ret = scf_error();
240dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 						goto out;
241dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 					}
242dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				} else
243dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 					ret = SMF_SYSTEM_ERR;
244dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			} else
245dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				ret = SMF_SYSTEM_ERR;
246dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			break;
247dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		case SCF_TYPE_BOOLEAN:
248dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (strcmp(valbuf, "1") == 0) {
249dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				vint = 1;
250dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			} else if (strcmp(valbuf, "0") == 0) {
251dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				vint = 0;
252dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			} else  {
253dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				ret = SMF_SYSTEM_ERR;
254dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				break;
255dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			}
256dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (scf_transaction_property_change(tran, entry,
257dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			    prop_name, SCF_TYPE_BOOLEAN) == 0) {
258dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				scf_value_set_boolean(val, (uint8_t)vint);
259dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				if (scf_entry_add_value(entry, val) != 0) {
260dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 					ret = scf_error();
261dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 					goto out;
262dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				}
263dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			} else {
264dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				ret = SMF_SYSTEM_ERR;
265dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			}
266dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			break;
267544783caSToomas Soome 		default:
268544783caSToomas Soome 			break;
269dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		}
270dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (ret != SMF_SYSTEM_ERR)
271544783caSToomas Soome 			(void) scf_transaction_commit(tran);
272dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
273dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States out:
274dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (tran != NULL)
275dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		scf_transaction_destroy(tran);
276dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (entry != NULL)
277dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		scf_entry_destroy(entry);
278dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	fs_smf_fini(phandle);
279dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	return (ret);
280dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States }
281dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
282dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States int
fs_smf_get_prop(smf_fstype_t fstype,char * prop_name,char * cbuf,char * instance,scf_type_t sctype,char * fmri,int * bufsz)283dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States fs_smf_get_prop(smf_fstype_t fstype, char *prop_name, char *cbuf,
284dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States     char *instance, scf_type_t sctype, char *fmri, int *bufsz)
285dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States {
286cf7e209dSIgor Kozhukhov 	fs_smfhandle_t *phandle = NULL;
287dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	scf_handle_t *handle;
288dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	scf_propertygroup_t *pg;
289dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	scf_property_t *prop;
290dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	scf_value_t *val;
291dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	scf_instance_t *inst;
292dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	int ret = 0, len = 0, length;
293dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	int64_t valint = 0;
294dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	char srv[MAXPATHLEN], *p, *svcname;
295dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	const char *pgname;
296dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	uint8_t bval;
297dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
298dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	/*
299dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	 * The SVC names we are using currently are already
300dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	 * appended by default. Fix this for instances project.
301dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	 */
302544783caSToomas Soome 	(void) snprintf(srv, MAXPATHLEN, "%s", fmri);
303dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	p = strstr(fmri, ":default");
304dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (p == NULL) {
305544783caSToomas Soome 		(void) strcat(srv, ":");
306dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (instance == NULL)
307dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			instance = "default";
308dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (strlen(srv) + strlen(instance) > MAXPATHLEN)
309dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			goto out;
310544783caSToomas Soome 		(void) strncat(srv, instance, strlen(instance));
311dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
312dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	svcname = srv;
313dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	phandle = fs_smf_init(fmri, instance);
314dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (phandle == NULL)
315dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		return (SMF_SYSTEM_ERR);
316dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	handle = phandle->fs_handle;
317dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	pg = phandle->fs_pg;
318dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	inst = phandle->fs_instance;
319dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	prop = phandle->fs_property;
320dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	val = phandle->fs_value;
321dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
322dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (handle == NULL || pg == NULL || prop == NULL || val == NULL ||
323dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	    inst == NULL)  {
324dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		return (SMF_SYSTEM_ERR);
325dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
326dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
327dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
328dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (scf_handle_decode_fmri(handle, svcname, phandle->fs_scope,
329dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	    phandle->fs_service, inst, NULL, NULL, 0) != 0) {
330dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		ret = scf_error();
331dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		goto out;
332dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
333dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
334dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (fstype == AUTOFS_SMF)
335dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		pgname = AUTOFS_PROPS_PGNAME;
336dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	else
337dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		pgname = NFS_PROPS_PGNAME;
338dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
339dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (scf_instance_get_pg(inst, pgname, pg) != -1) {
340dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (scf_pg_get_property(pg, prop_name,
341dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		    prop) != SCF_SUCCESS) {
342dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			ret = scf_error();
343dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			goto out;
344dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		}
345dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		if (scf_property_get_value(prop, val) != SCF_SUCCESS) {
346dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			ret = scf_error();
347dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			goto out;
348dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		}
349dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		switch (sctype) {
350dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		case SCF_TYPE_ASTRING:
351dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			len = scf_value_get_astring(val, cbuf, *bufsz);
352dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (len < 0 || len > *bufsz) {
353dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				ret = scf_error();
354dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				goto out;
355dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			}
356dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			ret = 0;
357dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			*bufsz = len;
358544783caSToomas Soome 			break;
359dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		case SCF_TYPE_INTEGER:
360dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (scf_value_get_integer(val, &valint) != 0) {
361dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				ret = scf_error();
362dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				goto out;
363dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			}
364dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			length =  snprintf(cbuf, *bufsz, "%lld", valint);
365dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (length < 0 || length > *bufsz) {
366dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				ret = SA_BAD_VALUE;
367dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				goto out;
368dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			}
369dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			ret = 0;
370544783caSToomas Soome 			break;
371dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		case SCF_TYPE_BOOLEAN:
372dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (scf_value_get_boolean(val, &bval) != 0) {
373dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				ret = scf_error();
374dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				goto out;
375dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			}
376dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (bval == 1) {
377dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				length = snprintf(cbuf, *bufsz, "%s", "true");
378dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			} else {
379dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				length = snprintf(cbuf, *bufsz, "%s", "false");
380dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			}
381dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			if (length < 0 || length > *bufsz) {
382dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				ret = SA_BAD_VALUE;
383dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 				goto out;
384dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 			}
385544783caSToomas Soome 			break;
386544783caSToomas Soome 		default:
387544783caSToomas Soome 			break;
388dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		}
389dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	} else {
390dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		ret = scf_error();
391dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	}
392dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if ((ret != 0) && scf_error() != SCF_ERROR_NONE)
393dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		fprintf(stdout, gettext("%s\n"), scf_strerror(ret));
394dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States out:
395dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	fs_smf_fini(phandle);
396dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	return (ret);
397dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States }
398dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
399dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
400dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States int
nfs_smf_get_prop(char * prop_name,char * propbuf,char * instance,scf_type_t sctype,char * svc_name,int * bufsz)401dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States nfs_smf_get_prop(char *prop_name, char *propbuf, char *instance,
402dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States     scf_type_t sctype, char *svc_name, int *bufsz)
403dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States {
404dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	return (fs_smf_get_prop(NFS_SMF, prop_name, propbuf,
405dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	    instance, sctype, svc_name, bufsz));
406dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States }
407dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
408bbaa8b60SDan Kruchinin /* Get an integer (base 10) property */
409bbaa8b60SDan Kruchinin int
nfs_smf_get_iprop(char * prop_name,int * rvp,char * instance,scf_type_t sctype,char * svc_name)410bbaa8b60SDan Kruchinin nfs_smf_get_iprop(char *prop_name, int *rvp, char *instance,
411bbaa8b60SDan Kruchinin     scf_type_t sctype, char *svc_name)
412bbaa8b60SDan Kruchinin {
413bbaa8b60SDan Kruchinin 	char propbuf[32];
414bbaa8b60SDan Kruchinin 	int bufsz, rc, val;
415bbaa8b60SDan Kruchinin 
416bbaa8b60SDan Kruchinin 	bufsz = sizeof (propbuf);
417bbaa8b60SDan Kruchinin 	rc = fs_smf_get_prop(NFS_SMF, prop_name, propbuf,
418bbaa8b60SDan Kruchinin 	    instance, sctype, svc_name, &bufsz);
419bbaa8b60SDan Kruchinin 	if (rc != SA_OK)
420bbaa8b60SDan Kruchinin 		return (rc);
421bbaa8b60SDan Kruchinin 	errno = 0;
422bbaa8b60SDan Kruchinin 	val = strtol(propbuf, NULL, 10);
423bbaa8b60SDan Kruchinin 	if (errno != 0)
424bbaa8b60SDan Kruchinin 		return (SA_BAD_VALUE);
425bbaa8b60SDan Kruchinin 	*rvp = val;
426bbaa8b60SDan Kruchinin 	return (SA_OK);
427bbaa8b60SDan Kruchinin }
428bbaa8b60SDan Kruchinin 
429dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States int
nfs_smf_set_prop(char * prop_name,char * value,char * instance,scf_type_t type,char * svc_name)430dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States nfs_smf_set_prop(char *prop_name, char *value, char *instance,
431dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States     scf_type_t type, char *svc_name)
432dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States {
433dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	return (fs_smf_set_prop(NFS_SMF, prop_name, value, instance,
434dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	    type, svc_name));
435dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States }
436dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
437dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States int
autofs_smf_set_prop(char * prop_name,char * value,char * instance,scf_type_t type,char * svc_name)438dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States autofs_smf_set_prop(char *prop_name, char *value, char *instance,
439dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States     scf_type_t type, char *svc_name)
440dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States {
441dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	return (fs_smf_set_prop(AUTOFS_SMF, prop_name, value, instance,
442dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	    type, svc_name));
443dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States }
444dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
445dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States int
autofs_smf_get_prop(char * prop_name,char * propbuf,char * instance,scf_type_t sctype,char * svc_name,int * bufsz)446dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States autofs_smf_get_prop(char *prop_name, char *propbuf, char *instance,
447dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States     scf_type_t sctype, char *svc_name, int *bufsz)
448dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States {
449dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	return (fs_smf_get_prop(AUTOFS_SMF, prop_name, propbuf,
450dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	    instance, sctype, svc_name, bufsz));
451dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States }
452dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 
453dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States boolean_t
string_to_boolean(const char * str)454dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States string_to_boolean(const char *str)
455dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States {
456dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	if (strcasecmp(str, "true") == 0 || atoi(str) == 1 ||
457dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	    strcasecmp(str, "on") == 0 || strcasecmp(str, "yes") == 0) {
458dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		return (B_TRUE);
459dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 	} else
460dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States 		return (B_FALSE);
461dd51520eSPavan Mettu - Oracle Corporation - Menlo Park United States }
46286147f89SToomas Soome 
46386147f89SToomas Soome /*
46486147f89SToomas Soome  * upgrade server_versmin and server_versmax from int to string.
46586147f89SToomas Soome  * This is needed to allow to specify version as major.minor.
46686147f89SToomas Soome  */
46786147f89SToomas Soome static void
nfs_upgrade_server_vers(const char * fmri)46886147f89SToomas Soome nfs_upgrade_server_vers(const char *fmri)
46986147f89SToomas Soome {
47086147f89SToomas Soome 	fs_smfhandle_t *phandle;
47186147f89SToomas Soome 	scf_handle_t *handle;
47286147f89SToomas Soome 	scf_propertygroup_t *pg;
47386147f89SToomas Soome 	scf_instance_t *inst;
47486147f89SToomas Soome 	scf_value_t *vmin = NULL, *vmax = NULL;
47586147f89SToomas Soome 	scf_transaction_t *tran = NULL;
47686147f89SToomas Soome 	scf_transaction_entry_t *emin = NULL, *emax = NULL;
47786147f89SToomas Soome 	char versmax[32];
47886147f89SToomas Soome 	char versmin[32];
47986147f89SToomas Soome 	int bufsz;
48086147f89SToomas Soome 
48186147f89SToomas Soome 	/*
48286147f89SToomas Soome 	 * Read old integer values, stop in case of error - apparently
48386147f89SToomas Soome 	 * the upgrade is already done.
48486147f89SToomas Soome 	 */
48586147f89SToomas Soome 	bufsz = sizeof (versmax);
48686147f89SToomas Soome 	if (nfs_smf_get_prop("server_versmax", versmax, DEFAULT_INSTANCE,
48786147f89SToomas Soome 	    SCF_TYPE_INTEGER, (char *)fmri, &bufsz) != SA_OK) {
48886147f89SToomas Soome 		return;
48986147f89SToomas Soome 	}
49086147f89SToomas Soome 	bufsz = sizeof (versmin);
49186147f89SToomas Soome 	if (nfs_smf_get_prop("server_versmin", versmin, DEFAULT_INSTANCE,
49286147f89SToomas Soome 	    SCF_TYPE_INTEGER, (char *)fmri, &bufsz) != SA_OK) {
49386147f89SToomas Soome 		return;
49486147f89SToomas Soome 	}
49586147f89SToomas Soome 
49686147f89SToomas Soome 	/* Write back as SCF_TYPE_ASTRING */
49786147f89SToomas Soome 	phandle = fs_smf_init(fmri, NULL);
49886147f89SToomas Soome 	if (phandle == NULL)
49986147f89SToomas Soome 		return;
50086147f89SToomas Soome 
50186147f89SToomas Soome 	handle = phandle->fs_handle;
50286147f89SToomas Soome 	if (handle == NULL)
50386147f89SToomas Soome 		goto done;
50486147f89SToomas Soome 	pg = phandle->fs_pg;
50586147f89SToomas Soome 	inst = phandle->fs_instance;
50686147f89SToomas Soome 	tran = scf_transaction_create(handle);
50786147f89SToomas Soome 	vmin = scf_value_create(handle);
50886147f89SToomas Soome 	vmax = scf_value_create(handle);
50986147f89SToomas Soome 	emin = scf_entry_create(handle);
51086147f89SToomas Soome 	emax = scf_entry_create(handle);
51186147f89SToomas Soome 
51286147f89SToomas Soome 	if (pg == NULL || inst == NULL || tran == NULL ||
51386147f89SToomas Soome 	    emin == NULL || emax == NULL || vmin == NULL || vmax == NULL) {
51486147f89SToomas Soome 		goto done;
51586147f89SToomas Soome 	}
51686147f89SToomas Soome 
51786147f89SToomas Soome 	if (scf_handle_decode_fmri(handle, (char *)fmri,
51886147f89SToomas Soome 	    phandle->fs_scope, phandle->fs_service, inst, NULL, NULL, 0) != 0) {
51986147f89SToomas Soome 		goto done;
52086147f89SToomas Soome 	}
52186147f89SToomas Soome 
52286147f89SToomas Soome 	if (scf_instance_get_pg(inst, NFS_PROPS_PGNAME, pg) == -1)
52386147f89SToomas Soome 		goto done;
52486147f89SToomas Soome 
52586147f89SToomas Soome 	if (scf_pg_update(pg) == -1)
52686147f89SToomas Soome 		goto done;
52786147f89SToomas Soome 
52886147f89SToomas Soome 	if (scf_transaction_start(tran, pg) == -1)
52986147f89SToomas Soome 		goto done;
53086147f89SToomas Soome 
53186147f89SToomas Soome 	if (scf_transaction_property_change_type(tran, emax,
53286147f89SToomas Soome 	    "server_versmax", SCF_TYPE_ASTRING) != 0) {
53386147f89SToomas Soome 		goto done;
53486147f89SToomas Soome 	}
53586147f89SToomas Soome 	if (scf_value_set_astring(vmax, versmax) == 0) {
53686147f89SToomas Soome 		if (scf_entry_add_value(emax, vmax) != 0)
53786147f89SToomas Soome 			goto done;
53886147f89SToomas Soome 	} else {
53986147f89SToomas Soome 		goto done;
54086147f89SToomas Soome 	}
54186147f89SToomas Soome 
54286147f89SToomas Soome 	if (scf_transaction_property_change_type(tran, emin,
54386147f89SToomas Soome 	    "server_versmin", SCF_TYPE_ASTRING) != 0) {
54486147f89SToomas Soome 		goto done;
54586147f89SToomas Soome 	}
54686147f89SToomas Soome 	if (scf_value_set_astring(vmin, versmin) == 0) {
54786147f89SToomas Soome 		if (scf_entry_add_value(emin, vmin) != 0)
54886147f89SToomas Soome 			goto done;
54986147f89SToomas Soome 	} else {
55086147f89SToomas Soome 		goto done;
55186147f89SToomas Soome 	}
55286147f89SToomas Soome 
55386147f89SToomas Soome 	(void) scf_transaction_commit(tran);
55486147f89SToomas Soome done:
55586147f89SToomas Soome 	if (tran != NULL)
55686147f89SToomas Soome 		scf_transaction_destroy(tran);
55786147f89SToomas Soome 	if (emin != NULL)
55886147f89SToomas Soome 		scf_entry_destroy(emin);
55986147f89SToomas Soome 	if (emax != NULL)
56086147f89SToomas Soome 		scf_entry_destroy(emax);
56186147f89SToomas Soome 	if (vmin != NULL)
56286147f89SToomas Soome 		scf_value_destroy(vmin);
56386147f89SToomas Soome 	if (vmax != NULL)
56486147f89SToomas Soome 		scf_value_destroy(vmax);
56586147f89SToomas Soome 	fs_smf_fini(phandle);
56686147f89SToomas Soome }
56786147f89SToomas Soome 
56886147f89SToomas Soome void
nfs_config_upgrade(const char * svc_name)56986147f89SToomas Soome nfs_config_upgrade(const char *svc_name)
57086147f89SToomas Soome {
57186147f89SToomas Soome 	if (strcmp(svc_name, NFSD) == 0) {
57286147f89SToomas Soome 		nfs_upgrade_server_vers(svc_name);
57386147f89SToomas Soome 	}
57486147f89SToomas Soome }
575