1*12967Sgavin.maltby@oracle.com /*
2*12967Sgavin.maltby@oracle.com * CDDL HEADER START
3*12967Sgavin.maltby@oracle.com *
4*12967Sgavin.maltby@oracle.com * The contents of this file are subject to the terms of the
5*12967Sgavin.maltby@oracle.com * Common Development and Distribution License (the "License").
6*12967Sgavin.maltby@oracle.com * You may not use this file except in compliance with the License.
7*12967Sgavin.maltby@oracle.com *
8*12967Sgavin.maltby@oracle.com * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*12967Sgavin.maltby@oracle.com * or http://www.opensolaris.org/os/licensing.
10*12967Sgavin.maltby@oracle.com * See the License for the specific language governing permissions
11*12967Sgavin.maltby@oracle.com * and limitations under the License.
12*12967Sgavin.maltby@oracle.com *
13*12967Sgavin.maltby@oracle.com * When distributing Covered Code, include this CDDL HEADER in each
14*12967Sgavin.maltby@oracle.com * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*12967Sgavin.maltby@oracle.com * If applicable, add the following below this CDDL HEADER, with the
16*12967Sgavin.maltby@oracle.com * fields enclosed by brackets "[]" replaced with your own identifying
17*12967Sgavin.maltby@oracle.com * information: Portions Copyright [yyyy] [name of copyright owner]
18*12967Sgavin.maltby@oracle.com *
19*12967Sgavin.maltby@oracle.com * CDDL HEADER END
20*12967Sgavin.maltby@oracle.com */
21*12967Sgavin.maltby@oracle.com
22*12967Sgavin.maltby@oracle.com /*
23*12967Sgavin.maltby@oracle.com * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24*12967Sgavin.maltby@oracle.com */
25*12967Sgavin.maltby@oracle.com
26*12967Sgavin.maltby@oracle.com #include <libintl.h>
27*12967Sgavin.maltby@oracle.com #include <libnvpair.h>
28*12967Sgavin.maltby@oracle.com #include <libscf.h>
29*12967Sgavin.maltby@oracle.com #include <libscf_priv.h>
30*12967Sgavin.maltby@oracle.com #include <libuutil.h>
31*12967Sgavin.maltby@oracle.com #include <stdarg.h>
32*12967Sgavin.maltby@oracle.com #include <stdio.h>
33*12967Sgavin.maltby@oracle.com #include <string.h>
34*12967Sgavin.maltby@oracle.com
35*12967Sgavin.maltby@oracle.com #include "notify_params.h"
36*12967Sgavin.maltby@oracle.com
37*12967Sgavin.maltby@oracle.com static struct events {
38*12967Sgavin.maltby@oracle.com const char *s;
39*12967Sgavin.maltby@oracle.com int32_t c;
40*12967Sgavin.maltby@oracle.com } smf_st_events[] = {
41*12967Sgavin.maltby@oracle.com { "to-uninitialized", SCF_TRANS(0, SCF_STATE_UNINIT) },
42*12967Sgavin.maltby@oracle.com { "from-uninitialized", SCF_TRANS(SCF_STATE_UNINIT, 0) },
43*12967Sgavin.maltby@oracle.com { "uninitialized", SCF_TRANS(SCF_STATE_UNINIT, SCF_STATE_UNINIT) },
44*12967Sgavin.maltby@oracle.com { "to-maintenance", SCF_TRANS(0, SCF_STATE_MAINT) },
45*12967Sgavin.maltby@oracle.com { "from-maintenance", SCF_TRANS(SCF_STATE_MAINT, 0) },
46*12967Sgavin.maltby@oracle.com { "maintenance", SCF_TRANS(SCF_STATE_MAINT, SCF_STATE_MAINT) },
47*12967Sgavin.maltby@oracle.com { "to-offline", SCF_TRANS(0, SCF_STATE_OFFLINE) },
48*12967Sgavin.maltby@oracle.com { "from-offline", SCF_TRANS(SCF_STATE_OFFLINE, 0) },
49*12967Sgavin.maltby@oracle.com { "offline", SCF_TRANS(SCF_STATE_OFFLINE, SCF_STATE_OFFLINE) },
50*12967Sgavin.maltby@oracle.com { "to-disabled", SCF_TRANS(0, SCF_STATE_DISABLED) },
51*12967Sgavin.maltby@oracle.com { "from-disabled", SCF_TRANS(SCF_STATE_DISABLED, 0) },
52*12967Sgavin.maltby@oracle.com { "disabled", SCF_TRANS(SCF_STATE_DISABLED, SCF_STATE_DISABLED) },
53*12967Sgavin.maltby@oracle.com { "to-online", SCF_TRANS(0, SCF_STATE_ONLINE) },
54*12967Sgavin.maltby@oracle.com { "from-online", SCF_TRANS(SCF_STATE_ONLINE, 0) },
55*12967Sgavin.maltby@oracle.com { "online", SCF_TRANS(SCF_STATE_ONLINE, SCF_STATE_ONLINE) },
56*12967Sgavin.maltby@oracle.com { "to-degraded", SCF_TRANS(0, SCF_STATE_DEGRADED) },
57*12967Sgavin.maltby@oracle.com { "from-degraded", SCF_TRANS(SCF_STATE_DEGRADED, 0) },
58*12967Sgavin.maltby@oracle.com { "degraded", SCF_TRANS(SCF_STATE_DEGRADED, SCF_STATE_DEGRADED) },
59*12967Sgavin.maltby@oracle.com { "to-all", SCF_TRANS(0, SCF_STATE_ALL) },
60*12967Sgavin.maltby@oracle.com { "from-all", SCF_TRANS(SCF_STATE_ALL, 0) },
61*12967Sgavin.maltby@oracle.com { "all", SCF_TRANS(SCF_STATE_ALL, SCF_STATE_ALL) },
62*12967Sgavin.maltby@oracle.com { NULL, 0 }
63*12967Sgavin.maltby@oracle.com };
64*12967Sgavin.maltby@oracle.com
65*12967Sgavin.maltby@oracle.com static struct fma_tags {
66*12967Sgavin.maltby@oracle.com const char *t;
67*12967Sgavin.maltby@oracle.com const char *s;
68*12967Sgavin.maltby@oracle.com } fma_tags[] = {
69*12967Sgavin.maltby@oracle.com { "problem-diagnosed", "list.suspect" },
70*12967Sgavin.maltby@oracle.com { "problem-updated", "list.updated" },
71*12967Sgavin.maltby@oracle.com { "problem-repaired", "list.repaired" },
72*12967Sgavin.maltby@oracle.com { "problem-resolved", "list.resolved" },
73*12967Sgavin.maltby@oracle.com { NULL, NULL }
74*12967Sgavin.maltby@oracle.com };
75*12967Sgavin.maltby@oracle.com
76*12967Sgavin.maltby@oracle.com static char *fma_classes[] = {
77*12967Sgavin.maltby@oracle.com "list.",
78*12967Sgavin.maltby@oracle.com "ireport.",
79*12967Sgavin.maltby@oracle.com NULL
80*12967Sgavin.maltby@oracle.com };
81*12967Sgavin.maltby@oracle.com
82*12967Sgavin.maltby@oracle.com /*
83*12967Sgavin.maltby@oracle.com * get_fma_tag()
84*12967Sgavin.maltby@oracle.com * return a pointer to the fma tag at the passed index. NULL if no entry exist
85*12967Sgavin.maltby@oracle.com * for index
86*12967Sgavin.maltby@oracle.com */
87*12967Sgavin.maltby@oracle.com const char *
get_fma_tag(uint32_t index)88*12967Sgavin.maltby@oracle.com get_fma_tag(uint32_t index)
89*12967Sgavin.maltby@oracle.com {
90*12967Sgavin.maltby@oracle.com if (index > (sizeof (fma_tags) / sizeof (struct fma_tags)))
91*12967Sgavin.maltby@oracle.com return (NULL);
92*12967Sgavin.maltby@oracle.com
93*12967Sgavin.maltby@oracle.com return (fma_tags[index].t);
94*12967Sgavin.maltby@oracle.com }
95*12967Sgavin.maltby@oracle.com
96*12967Sgavin.maltby@oracle.com /*
97*12967Sgavin.maltby@oracle.com * get_fma_class()
98*12967Sgavin.maltby@oracle.com * return a pointer to the fma class at the passed index. NULL if no entry exist
99*12967Sgavin.maltby@oracle.com * for index
100*12967Sgavin.maltby@oracle.com */
101*12967Sgavin.maltby@oracle.com const char *
get_fma_class(uint32_t index)102*12967Sgavin.maltby@oracle.com get_fma_class(uint32_t index)
103*12967Sgavin.maltby@oracle.com {
104*12967Sgavin.maltby@oracle.com if (index > (sizeof (fma_tags) / sizeof (struct fma_tags)))
105*12967Sgavin.maltby@oracle.com return (NULL);
106*12967Sgavin.maltby@oracle.com
107*12967Sgavin.maltby@oracle.com return (fma_tags[index].s);
108*12967Sgavin.maltby@oracle.com }
109*12967Sgavin.maltby@oracle.com
110*12967Sgavin.maltby@oracle.com /*
111*12967Sgavin.maltby@oracle.com * is_fma_token()
112*12967Sgavin.maltby@oracle.com * check if the parameter is an fma token by comparing with the
113*12967Sgavin.maltby@oracle.com * fma_classes[] and the fma_tags[] arrays.
114*12967Sgavin.maltby@oracle.com */
115*12967Sgavin.maltby@oracle.com int
is_fma_token(const char * t)116*12967Sgavin.maltby@oracle.com is_fma_token(const char *t)
117*12967Sgavin.maltby@oracle.com {
118*12967Sgavin.maltby@oracle.com int i;
119*12967Sgavin.maltby@oracle.com
120*12967Sgavin.maltby@oracle.com for (i = 0; fma_classes[i]; ++i)
121*12967Sgavin.maltby@oracle.com if (strncmp(t, fma_classes[i], strlen(fma_classes[i])) == 0)
122*12967Sgavin.maltby@oracle.com return (1);
123*12967Sgavin.maltby@oracle.com
124*12967Sgavin.maltby@oracle.com for (i = 0; fma_tags[i].t; ++i)
125*12967Sgavin.maltby@oracle.com if (strcmp(t, fma_tags[i].t) == 0)
126*12967Sgavin.maltby@oracle.com return (1);
127*12967Sgavin.maltby@oracle.com
128*12967Sgavin.maltby@oracle.com return (0);
129*12967Sgavin.maltby@oracle.com }
130*12967Sgavin.maltby@oracle.com
131*12967Sgavin.maltby@oracle.com /*
132*12967Sgavin.maltby@oracle.com * has_fma_tag()
133*12967Sgavin.maltby@oracle.com * returns 1 if there is an fma tag for the passed class, 0 otherwise
134*12967Sgavin.maltby@oracle.com */
135*12967Sgavin.maltby@oracle.com int
has_fma_tag(const char * c)136*12967Sgavin.maltby@oracle.com has_fma_tag(const char *c)
137*12967Sgavin.maltby@oracle.com {
138*12967Sgavin.maltby@oracle.com int i;
139*12967Sgavin.maltby@oracle.com
140*12967Sgavin.maltby@oracle.com for (i = 0; fma_tags[i].s; ++i)
141*12967Sgavin.maltby@oracle.com if (strcmp(c, fma_tags[i].s) == 0)
142*12967Sgavin.maltby@oracle.com return (1);
143*12967Sgavin.maltby@oracle.com
144*12967Sgavin.maltby@oracle.com return (0);
145*12967Sgavin.maltby@oracle.com }
146*12967Sgavin.maltby@oracle.com
147*12967Sgavin.maltby@oracle.com const char *
de_tag(const char * tag)148*12967Sgavin.maltby@oracle.com de_tag(const char *tag)
149*12967Sgavin.maltby@oracle.com {
150*12967Sgavin.maltby@oracle.com int i;
151*12967Sgavin.maltby@oracle.com
152*12967Sgavin.maltby@oracle.com for (i = 0; fma_tags[i].t; ++i)
153*12967Sgavin.maltby@oracle.com if (strcmp(tag, fma_tags[i].t) == 0)
154*12967Sgavin.maltby@oracle.com return (fma_tags[i].s);
155*12967Sgavin.maltby@oracle.com
156*12967Sgavin.maltby@oracle.com return (tag);
157*12967Sgavin.maltby@oracle.com }
158*12967Sgavin.maltby@oracle.com
159*12967Sgavin.maltby@oracle.com const char *
re_tag(const char * fma_event)160*12967Sgavin.maltby@oracle.com re_tag(const char *fma_event)
161*12967Sgavin.maltby@oracle.com {
162*12967Sgavin.maltby@oracle.com int i;
163*12967Sgavin.maltby@oracle.com
164*12967Sgavin.maltby@oracle.com for (i = 0; fma_tags[i].s; ++i)
165*12967Sgavin.maltby@oracle.com if (strcmp(fma_event, fma_tags[i].s) == 0)
166*12967Sgavin.maltby@oracle.com return (fma_tags[i].t);
167*12967Sgavin.maltby@oracle.com
168*12967Sgavin.maltby@oracle.com return (fma_event);
169*12967Sgavin.maltby@oracle.com }
170*12967Sgavin.maltby@oracle.com
171*12967Sgavin.maltby@oracle.com int32_t
string_to_tset(const char * str)172*12967Sgavin.maltby@oracle.com string_to_tset(const char *str)
173*12967Sgavin.maltby@oracle.com {
174*12967Sgavin.maltby@oracle.com int i;
175*12967Sgavin.maltby@oracle.com
176*12967Sgavin.maltby@oracle.com for (i = 0; smf_st_events[i].s != NULL; ++i) {
177*12967Sgavin.maltby@oracle.com if (strcmp(str, smf_st_events[i].s) == 0)
178*12967Sgavin.maltby@oracle.com return (smf_st_events[i].c);
179*12967Sgavin.maltby@oracle.com }
180*12967Sgavin.maltby@oracle.com
181*12967Sgavin.maltby@oracle.com return (0);
182*12967Sgavin.maltby@oracle.com }
183*12967Sgavin.maltby@oracle.com
184*12967Sgavin.maltby@oracle.com const char *
tset_to_string(int32_t t)185*12967Sgavin.maltby@oracle.com tset_to_string(int32_t t)
186*12967Sgavin.maltby@oracle.com {
187*12967Sgavin.maltby@oracle.com int i;
188*12967Sgavin.maltby@oracle.com
189*12967Sgavin.maltby@oracle.com for (i = 0; smf_st_events[i].s != NULL; ++i) {
190*12967Sgavin.maltby@oracle.com if (smf_st_events[i].c == t)
191*12967Sgavin.maltby@oracle.com return (smf_st_events[i].s);
192*12967Sgavin.maltby@oracle.com }
193*12967Sgavin.maltby@oracle.com
194*12967Sgavin.maltby@oracle.com return (NULL);
195*12967Sgavin.maltby@oracle.com }
196*12967Sgavin.maltby@oracle.com
197*12967Sgavin.maltby@oracle.com void
safe_printf(const char * fmt,...)198*12967Sgavin.maltby@oracle.com safe_printf(const char *fmt, ...)
199*12967Sgavin.maltby@oracle.com {
200*12967Sgavin.maltby@oracle.com va_list va;
201*12967Sgavin.maltby@oracle.com
202*12967Sgavin.maltby@oracle.com va_start(va, fmt);
203*12967Sgavin.maltby@oracle.com if (vprintf(fmt, va) < 0)
204*12967Sgavin.maltby@oracle.com uu_die(gettext("Error writing to stdout"));
205*12967Sgavin.maltby@oracle.com va_end(va);
206*12967Sgavin.maltby@oracle.com }
207*12967Sgavin.maltby@oracle.com
208*12967Sgavin.maltby@oracle.com static uint32_t
notify_params_get_version(nvlist_t * nvl)209*12967Sgavin.maltby@oracle.com notify_params_get_version(nvlist_t *nvl)
210*12967Sgavin.maltby@oracle.com {
211*12967Sgavin.maltby@oracle.com uint32_t v;
212*12967Sgavin.maltby@oracle.com
213*12967Sgavin.maltby@oracle.com if (nvl == NULL)
214*12967Sgavin.maltby@oracle.com return (0xFFFFFFFFU);
215*12967Sgavin.maltby@oracle.com
216*12967Sgavin.maltby@oracle.com if (nvlist_lookup_uint32(nvl, SCF_NOTIFY_NAME_VERSION, &v) != 0)
217*12967Sgavin.maltby@oracle.com return (0xFFFFFFFFU);
218*12967Sgavin.maltby@oracle.com else
219*12967Sgavin.maltby@oracle.com return (v);
220*12967Sgavin.maltby@oracle.com }
221*12967Sgavin.maltby@oracle.com
222*12967Sgavin.maltby@oracle.com static void
nvpair_print(nvpair_t * p)223*12967Sgavin.maltby@oracle.com nvpair_print(nvpair_t *p)
224*12967Sgavin.maltby@oracle.com {
225*12967Sgavin.maltby@oracle.com char **v;
226*12967Sgavin.maltby@oracle.com uint_t n;
227*12967Sgavin.maltby@oracle.com int i;
228*12967Sgavin.maltby@oracle.com
229*12967Sgavin.maltby@oracle.com safe_printf(" %s:", nvpair_name(p));
230*12967Sgavin.maltby@oracle.com (void) nvpair_value_string_array(p, &v, &n);
231*12967Sgavin.maltby@oracle.com for (i = 0; i < n; ++i) {
232*12967Sgavin.maltby@oracle.com safe_printf(" %s", v[i]);
233*12967Sgavin.maltby@oracle.com }
234*12967Sgavin.maltby@oracle.com safe_printf("\n");
235*12967Sgavin.maltby@oracle.com }
236*12967Sgavin.maltby@oracle.com
237*12967Sgavin.maltby@oracle.com static void
params_type_print(nvlist_t * p,const char * name,const char * fmri)238*12967Sgavin.maltby@oracle.com params_type_print(nvlist_t *p, const char *name, const char *fmri)
239*12967Sgavin.maltby@oracle.com {
240*12967Sgavin.maltby@oracle.com nvpair_t *tnvp, *nvp;
241*12967Sgavin.maltby@oracle.com nvlist_t *nvl;
242*12967Sgavin.maltby@oracle.com boolean_t *a;
243*12967Sgavin.maltby@oracle.com uint_t n;
244*12967Sgavin.maltby@oracle.com int has_output = 0;
245*12967Sgavin.maltby@oracle.com
246*12967Sgavin.maltby@oracle.com /* for each event e print all notification parameters */
247*12967Sgavin.maltby@oracle.com for (tnvp = nvlist_next_nvpair(p, NULL); tnvp != NULL;
248*12967Sgavin.maltby@oracle.com tnvp = nvlist_next_nvpair(p, tnvp)) {
249*12967Sgavin.maltby@oracle.com /* We only want the NVLIST memebers */
250*12967Sgavin.maltby@oracle.com if (nvpair_type(tnvp) != DATA_TYPE_NVLIST)
251*12967Sgavin.maltby@oracle.com continue;
252*12967Sgavin.maltby@oracle.com
253*12967Sgavin.maltby@oracle.com if (nvpair_value_nvlist(tnvp, &nvl) != 0)
254*12967Sgavin.maltby@oracle.com uu_die("nvpair_value_nvlist");
255*12967Sgavin.maltby@oracle.com
256*12967Sgavin.maltby@oracle.com if (!has_output)
257*12967Sgavin.maltby@oracle.com if (fmri == NULL)
258*12967Sgavin.maltby@oracle.com safe_printf(gettext(" Event: %s\n"), name);
259*12967Sgavin.maltby@oracle.com else
260*12967Sgavin.maltby@oracle.com safe_printf(gettext(
261*12967Sgavin.maltby@oracle.com " Event: %s (source: %s)\n"),
262*12967Sgavin.maltby@oracle.com name, fmri);
263*12967Sgavin.maltby@oracle.com
264*12967Sgavin.maltby@oracle.com has_output = 1;
265*12967Sgavin.maltby@oracle.com
266*12967Sgavin.maltby@oracle.com safe_printf(gettext(" Notification Type: %s\n"),
267*12967Sgavin.maltby@oracle.com nvpair_name(tnvp));
268*12967Sgavin.maltby@oracle.com
269*12967Sgavin.maltby@oracle.com if (nvlist_lookup_boolean_array(nvl, PARAM_ACTIVE, &a, &n) != 0)
270*12967Sgavin.maltby@oracle.com uu_warn(gettext("Missing 'active' property"));
271*12967Sgavin.maltby@oracle.com else
272*12967Sgavin.maltby@oracle.com safe_printf(gettext(" Active: %s\n"),
273*12967Sgavin.maltby@oracle.com *a ? "true" : "false");
274*12967Sgavin.maltby@oracle.com
275*12967Sgavin.maltby@oracle.com for (nvp = nvlist_next_nvpair(nvl, NULL); nvp != NULL;
276*12967Sgavin.maltby@oracle.com nvp = nvlist_next_nvpair(nvl, nvp)) {
277*12967Sgavin.maltby@oracle.com if (nvpair_type(nvp) != DATA_TYPE_STRING_ARRAY)
278*12967Sgavin.maltby@oracle.com continue;
279*12967Sgavin.maltby@oracle.com nvpair_print(nvp);
280*12967Sgavin.maltby@oracle.com }
281*12967Sgavin.maltby@oracle.com safe_printf("\n");
282*12967Sgavin.maltby@oracle.com }
283*12967Sgavin.maltby@oracle.com }
284*12967Sgavin.maltby@oracle.com
285*12967Sgavin.maltby@oracle.com void
listnotify_print(nvlist_t * nvl,const char * event)286*12967Sgavin.maltby@oracle.com listnotify_print(nvlist_t *nvl, const char *event)
287*12967Sgavin.maltby@oracle.com {
288*12967Sgavin.maltby@oracle.com char *fmri;
289*12967Sgavin.maltby@oracle.com nvlist_t **params;
290*12967Sgavin.maltby@oracle.com size_t n;
291*12967Sgavin.maltby@oracle.com int32_t tset;
292*12967Sgavin.maltby@oracle.com int i;
293*12967Sgavin.maltby@oracle.com
294*12967Sgavin.maltby@oracle.com /*
295*12967Sgavin.maltby@oracle.com * Check the nvl we got is from a version we understand
296*12967Sgavin.maltby@oracle.com */
297*12967Sgavin.maltby@oracle.com if (nvl != NULL && notify_params_get_version(nvl) !=
298*12967Sgavin.maltby@oracle.com SCF_NOTIFY_PARAMS_VERSION)
299*12967Sgavin.maltby@oracle.com uu_die(gettext("libscf(3LIB) mismatch\n"));
300*12967Sgavin.maltby@oracle.com
301*12967Sgavin.maltby@oracle.com if (nvl != NULL && nvlist_lookup_nvlist_array(nvl, SCF_NOTIFY_PARAMS,
302*12967Sgavin.maltby@oracle.com ¶ms, &n) != 0)
303*12967Sgavin.maltby@oracle.com /* Sanity check. If we get here nvl is bad! */
304*12967Sgavin.maltby@oracle.com uu_die(gettext("nvlist_lookup_nvlist_array\n"));
305*12967Sgavin.maltby@oracle.com
306*12967Sgavin.maltby@oracle.com if (event == NULL) {
307*12967Sgavin.maltby@oracle.com /* this is an SMF state transition nvlist */
308*12967Sgavin.maltby@oracle.com for (i = 0; i < n; ++i) {
309*12967Sgavin.maltby@oracle.com nvlist_t *p = *(params + i);
310*12967Sgavin.maltby@oracle.com
311*12967Sgavin.maltby@oracle.com if (nvlist_lookup_string(p,
312*12967Sgavin.maltby@oracle.com SCF_NOTIFY_PARAMS_SOURCE_NAME, &fmri) != 0)
313*12967Sgavin.maltby@oracle.com fmri = NULL;
314*12967Sgavin.maltby@oracle.com if (nvlist_lookup_int32(p, SCF_NOTIFY_NAME_TSET,
315*12967Sgavin.maltby@oracle.com &tset) != 0)
316*12967Sgavin.maltby@oracle.com uu_die("nvlist_lookup_int32");
317*12967Sgavin.maltby@oracle.com params_type_print(p, tset_to_string(tset), fmri);
318*12967Sgavin.maltby@oracle.com }
319*12967Sgavin.maltby@oracle.com } else {
320*12967Sgavin.maltby@oracle.com /* this is FMA event nvlist */
321*12967Sgavin.maltby@oracle.com if (nvl == NULL) { /* preferences not found */
322*12967Sgavin.maltby@oracle.com return;
323*12967Sgavin.maltby@oracle.com }
324*12967Sgavin.maltby@oracle.com for (i = 0; i < n; ++i) {
325*12967Sgavin.maltby@oracle.com nvlist_t *p = *(params + i);
326*12967Sgavin.maltby@oracle.com
327*12967Sgavin.maltby@oracle.com if (nvlist_lookup_string(p,
328*12967Sgavin.maltby@oracle.com SCF_NOTIFY_PARAMS_SOURCE_NAME, &fmri) != 0)
329*12967Sgavin.maltby@oracle.com fmri = NULL;
330*12967Sgavin.maltby@oracle.com params_type_print(p, event, fmri);
331*12967Sgavin.maltby@oracle.com }
332*12967Sgavin.maltby@oracle.com }
333*12967Sgavin.maltby@oracle.com }
334