1*8346SScott.Davenport@Sun.COM /*
2*8346SScott.Davenport@Sun.COM * CDDL HEADER START
3*8346SScott.Davenport@Sun.COM *
4*8346SScott.Davenport@Sun.COM * The contents of this file are subject to the terms of the
5*8346SScott.Davenport@Sun.COM * Common Development and Distribution License (the "License").
6*8346SScott.Davenport@Sun.COM * You may not use this file except in compliance with the License.
7*8346SScott.Davenport@Sun.COM *
8*8346SScott.Davenport@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*8346SScott.Davenport@Sun.COM * or http://www.opensolaris.org/os/licensing.
10*8346SScott.Davenport@Sun.COM * See the License for the specific language governing permissions
11*8346SScott.Davenport@Sun.COM * and limitations under the License.
12*8346SScott.Davenport@Sun.COM *
13*8346SScott.Davenport@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each
14*8346SScott.Davenport@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*8346SScott.Davenport@Sun.COM * If applicable, add the following below this CDDL HEADER, with the
16*8346SScott.Davenport@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying
17*8346SScott.Davenport@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner]
18*8346SScott.Davenport@Sun.COM *
19*8346SScott.Davenport@Sun.COM * CDDL HEADER END
20*8346SScott.Davenport@Sun.COM */
21*8346SScott.Davenport@Sun.COM /*
22*8346SScott.Davenport@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23*8346SScott.Davenport@Sun.COM * Use is subject to license terms.
24*8346SScott.Davenport@Sun.COM */
25*8346SScott.Davenport@Sun.COM
26*8346SScott.Davenport@Sun.COM
27*8346SScott.Davenport@Sun.COM #include <errno.h>
28*8346SScott.Davenport@Sun.COM #include <strings.h>
29*8346SScott.Davenport@Sun.COM
30*8346SScott.Davenport@Sun.COM #include <gmem_fmri.h>
31*8346SScott.Davenport@Sun.COM #include <gmem.h>
32*8346SScott.Davenport@Sun.COM
33*8346SScott.Davenport@Sun.COM void
gmem_fmri_init(fmd_hdl_t * hdl,gmem_fmri_t * fmri,nvlist_t * nvl,const char * fmt,...)34*8346SScott.Davenport@Sun.COM gmem_fmri_init(fmd_hdl_t *hdl, gmem_fmri_t *fmri, nvlist_t *nvl,
35*8346SScott.Davenport@Sun.COM const char *fmt, ...)
36*8346SScott.Davenport@Sun.COM {
37*8346SScott.Davenport@Sun.COM va_list ap;
38*8346SScott.Davenport@Sun.COM
39*8346SScott.Davenport@Sun.COM va_start(ap, fmt);
40*8346SScott.Davenport@Sun.COM gmem_vbufname(fmri->fmri_packnm, sizeof (fmri->fmri_packnm), fmt, ap);
41*8346SScott.Davenport@Sun.COM va_end(ap);
42*8346SScott.Davenport@Sun.COM
43*8346SScott.Davenport@Sun.COM if ((errno = nvlist_dup(nvl, &fmri->fmri_nvl, 0)) != 0 ||
44*8346SScott.Davenport@Sun.COM (errno = nvlist_size(nvl, &fmri->fmri_packsz,
45*8346SScott.Davenport@Sun.COM NV_ENCODE_NATIVE)) != 0)
46*8346SScott.Davenport@Sun.COM fmd_hdl_abort(hdl, "failed to copy fmri for fmri create");
47*8346SScott.Davenport@Sun.COM
48*8346SScott.Davenport@Sun.COM fmri->fmri_packbuf = fmd_hdl_alloc(hdl, fmri->fmri_packsz, FMD_SLEEP);
49*8346SScott.Davenport@Sun.COM
50*8346SScott.Davenport@Sun.COM if ((errno = nvlist_pack(nvl, &fmri->fmri_packbuf, &fmri->fmri_packsz,
51*8346SScott.Davenport@Sun.COM NV_ENCODE_NATIVE, 0)) != 0)
52*8346SScott.Davenport@Sun.COM fmd_hdl_abort(hdl, "failed to pack fmri for fmri create");
53*8346SScott.Davenport@Sun.COM
54*8346SScott.Davenport@Sun.COM gmem_fmri_write(hdl, fmri);
55*8346SScott.Davenport@Sun.COM }
56*8346SScott.Davenport@Sun.COM
57*8346SScott.Davenport@Sun.COM void
gmem_fmri_fini(fmd_hdl_t * hdl,gmem_fmri_t * fmri,int destroy)58*8346SScott.Davenport@Sun.COM gmem_fmri_fini(fmd_hdl_t *hdl, gmem_fmri_t *fmri, int destroy)
59*8346SScott.Davenport@Sun.COM {
60*8346SScott.Davenport@Sun.COM if (destroy)
61*8346SScott.Davenport@Sun.COM fmd_buf_destroy(hdl, NULL, fmri->fmri_packnm);
62*8346SScott.Davenport@Sun.COM
63*8346SScott.Davenport@Sun.COM fmd_hdl_free(hdl, fmri->fmri_packbuf, fmri->fmri_packsz);
64*8346SScott.Davenport@Sun.COM nvlist_free(fmri->fmri_nvl);
65*8346SScott.Davenport@Sun.COM }
66*8346SScott.Davenport@Sun.COM
67*8346SScott.Davenport@Sun.COM void
gmem_fmri_restore(fmd_hdl_t * hdl,gmem_fmri_t * fmri)68*8346SScott.Davenport@Sun.COM gmem_fmri_restore(fmd_hdl_t *hdl, gmem_fmri_t *fmri)
69*8346SScott.Davenport@Sun.COM {
70*8346SScott.Davenport@Sun.COM if (fmd_buf_size(hdl, NULL, fmri->fmri_packnm) == 0) {
71*8346SScott.Davenport@Sun.COM bzero(fmri, sizeof (gmem_fmri_t));
72*8346SScott.Davenport@Sun.COM return;
73*8346SScott.Davenport@Sun.COM }
74*8346SScott.Davenport@Sun.COM
75*8346SScott.Davenport@Sun.COM if ((fmri->fmri_packbuf = gmem_buf_read(hdl, NULL, fmri->fmri_packnm,
76*8346SScott.Davenport@Sun.COM fmri->fmri_packsz)) == NULL) {
77*8346SScott.Davenport@Sun.COM fmd_hdl_abort(hdl, "failed to read fmri buffer %s",
78*8346SScott.Davenport@Sun.COM fmri->fmri_packnm);
79*8346SScott.Davenport@Sun.COM }
80*8346SScott.Davenport@Sun.COM
81*8346SScott.Davenport@Sun.COM if (nvlist_unpack(fmri->fmri_packbuf, fmri->fmri_packsz,
82*8346SScott.Davenport@Sun.COM &fmri->fmri_nvl, 0) != 0) {
83*8346SScott.Davenport@Sun.COM fmd_hdl_abort(hdl, "failed to unpack fmri buffer %s\n",
84*8346SScott.Davenport@Sun.COM fmri->fmri_packnm);
85*8346SScott.Davenport@Sun.COM }
86*8346SScott.Davenport@Sun.COM }
87*8346SScott.Davenport@Sun.COM
88*8346SScott.Davenport@Sun.COM void
gmem_fmri_write(fmd_hdl_t * hdl,gmem_fmri_t * fmri)89*8346SScott.Davenport@Sun.COM gmem_fmri_write(fmd_hdl_t *hdl, gmem_fmri_t *fmri)
90*8346SScott.Davenport@Sun.COM {
91*8346SScott.Davenport@Sun.COM size_t sz;
92*8346SScott.Davenport@Sun.COM
93*8346SScott.Davenport@Sun.COM if ((sz = fmd_buf_size(hdl, NULL, fmri->fmri_packnm)) !=
94*8346SScott.Davenport@Sun.COM fmri->fmri_packsz && sz != 0)
95*8346SScott.Davenport@Sun.COM fmd_buf_destroy(hdl, NULL, fmri->fmri_packnm);
96*8346SScott.Davenport@Sun.COM
97*8346SScott.Davenport@Sun.COM fmd_buf_write(hdl, NULL, fmri->fmri_packnm, fmri->fmri_packbuf,
98*8346SScott.Davenport@Sun.COM fmri->fmri_packsz);
99*8346SScott.Davenport@Sun.COM }
100