xref: /onnv-gate/usr/src/cmd/fm/modules/sun4/cpumem-diagnosis/cmd_fmri.c (revision 600:1e3cb665dd0a)
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