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