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