annotate usr/src/cmd/fm/fmd/common/fmd_rpc_adm.c @ 12979:ab9ae749152f

PSARC/2009/617 Software Events Notification Parameters CLI PSARC/2009/618 snmp-notify: SNMP Notification Daemon for Software Events PSARC/2009/619 smtp-notify: Email Notification Daemon for Software Events PSARC/2010/225 fmd for non-global Solaris zones PSARC/2010/226 Solaris Instance UUID PSARC/2010/227 nvlist_nvflag(3NVPAIR) PSARC/2010/228 libfmevent additions PSARC/2010/257 sysevent_evc_setpropnvl and sysevent_evc_getpropnvl PSARC/2010/265 FMRI and FMA Event Stabilty, 'ireport' category 1 event class, and the 'sw' FMRI scheme PSARC/2010/278 FMA/SMF integration: instance state transitions PSARC/2010/279 Modelling panics within FMA PSARC/2010/290 logadm.conf upgrade 6392476 fmdump needs to pretty-print 6393375 userland ereport/ireport event generation interfaces 6445732 Add email notification agent for FMA and software events 6804168 RFE: Allow an efficient means to monitor SMF services status changes 6866661 scf_values_destroy(3SCF) will segfault if is passed NULL 6884709 Add snmp notification agent for FMA and software events 6884712 Add private interface to tap into libfmd_msg macro expansion capabilities 6897919 fmd to run in a non-global zone 6897937 fmd use of non-private doors is not safe 6900081 add a UUID to Solaris kernel image for use in crashdump identification 6914884 model panic events as a defect diagnosis in FMA 6944862 fmd_case_open_uuid, fmd_case_uuisresolved, fmd_nvl_create_defect 6944866 log legacy sysevents in fmd 6944867 enumerate svc scheme in topo 6944868 software-diagnosis and software-response fmd modules 6944870 model SMF maintenance state as a defect diagnosis in FMA 6944876 savecore runs in foreground for systems with zfs root and dedicated dump 6965796 Implement notification parameters for SMF state transitions and FMA events 6968287 SUN-FM-MIB.mib needs to be updated to reflect Oracle information 6972331 logadm.conf upgrade PSARC/2010/290
author Gavin Maltby <gavin.maltby@oracle.com>
date Fri, 30 Jul 2010 17:04:17 +1000
parents 718b14f230ae
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
1303
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
5 * Common Development and Distribution License (the "License").
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
6 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
7 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
9 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
10 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
11 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
12 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
13 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
15 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
16 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
17 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
18 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
19 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
20 */
1303
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
21
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
22 /*
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
23 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
24 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
26 #include <strings.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
27 #include <limits.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
28 #include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
29 #include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
30 #include <alloca.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
32 #include <fmd_rpc_adm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
33 #include <fmd_rpc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
34 #include <fmd_module.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
35 #include <fmd_ustat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
36 #include <fmd_error.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
37 #include <fmd_asru.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
38 #include <fmd_ckpt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
39 #include <fmd_case.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
40 #include <fmd_fmri.h>
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
41 #include <fmd_idspace.h>
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
42 #include <fmd_xprt.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
43
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
44 #include <fmd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
45
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
46 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
47 fmd_adm_modinfo_1_svc(struct fmd_rpc_modlist *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
48 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
49 struct fmd_rpc_modinfo *rmi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
50 fmd_module_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
52 rvp->rml_list = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
53 rvp->rml_err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
54 rvp->rml_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
55
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
56 if (fmd_rpc_deny(req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
57 rvp->rml_err = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
58 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
59 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
61 (void) pthread_mutex_lock(&fmd.d_mod_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
63 for (mp = fmd_list_next(&fmd.d_mod_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
64 mp != NULL; mp = fmd_list_next(mp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
66 if ((rmi = malloc(sizeof (struct fmd_rpc_modinfo))) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
67 rvp->rml_err = FMD_ADM_ERR_NOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
68 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
69 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
70
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
71 fmd_module_lock(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
72
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
73 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
74 * If mod_info is NULL, the module is in the middle of loading:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
75 * do not report its presence to observability tools yet.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
76 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
77 if (mp->mod_info == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
78 fmd_module_unlock(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
79 free(rmi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
80 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
81 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
83 rmi->rmi_name = strdup(mp->mod_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
84 rmi->rmi_desc = strdup(mp->mod_info->fmdi_desc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
85 rmi->rmi_vers = strdup(mp->mod_info->fmdi_vers);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
86 rmi->rmi_faulty = mp->mod_error != 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
87 rmi->rmi_next = rvp->rml_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
88
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
89 fmd_module_unlock(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
90 rvp->rml_list = rmi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
91 rvp->rml_len++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
92
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
93 if (rmi->rmi_desc == NULL || rmi->rmi_vers == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
94 rvp->rml_err = FMD_ADM_ERR_NOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
95 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
96 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
97 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
98
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
99 (void) pthread_mutex_unlock(&fmd.d_mod_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
100 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
101 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
103 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
104 fmd_adm_modcstat_1_svc(char *name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
105 struct fmd_rpc_modstat *rms, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
106 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
107 fmd_ustat_snap_t snap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
108 fmd_module_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
110 rms->rms_buf.rms_buf_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
111 rms->rms_buf.rms_buf_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
112 rms->rms_err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
114 if (fmd_rpc_deny(req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
115 rms->rms_err = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
116 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
117 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
119 if ((mp = fmd_modhash_lookup(fmd.d_mod_hash, name)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
120 rms->rms_err = FMD_ADM_ERR_MODSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
121 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
122 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
124 if (fmd_modstat_snapshot(mp, &snap) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
125 rms->rms_buf.rms_buf_val = snap.uss_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
126 rms->rms_buf.rms_buf_len = snap.uss_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
127 } else if (errno == EFMD_HDL_ABORT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
128 rms->rms_err = FMD_ADM_ERR_MODFAIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
129 } else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
130 rms->rms_err = FMD_ADM_ERR_NOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
132 fmd_module_rele(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
133 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
134 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
136 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
137 fmd_adm_moddstat_1_svc(char *name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
138 struct fmd_rpc_modstat *rms, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
139 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
140 fmd_module_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
142 rms->rms_buf.rms_buf_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
143 rms->rms_buf.rms_buf_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
144 rms->rms_err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
146 if (fmd_rpc_deny(req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
147 rms->rms_err = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
148 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
149 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
151 if ((mp = fmd_modhash_lookup(fmd.d_mod_hash, name)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
152 rms->rms_err = FMD_ADM_ERR_MODSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
153 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
154 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
156 rms->rms_buf.rms_buf_val = malloc(sizeof (fmd_modstat_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
157 rms->rms_buf.rms_buf_len = sizeof (fmd_modstat_t) / sizeof (fmd_stat_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
158
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
159 if (rms->rms_buf.rms_buf_val == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
160 rms->rms_err = FMD_ADM_ERR_NOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
161 rms->rms_buf.rms_buf_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
162 fmd_module_rele(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
163 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
164 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
166 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
167 * Note: the bcopy() here is valid only if no FMD_TYPE_STRING stats
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
168 * are present in mp->mod_stats. We don't use any for the daemon-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
169 * maintained stats and provide this function in order to reduce the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
170 * overhead of the fmstat(1M) default view, where these minimal stats
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
171 * must be retrieved for all of the active modules.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
172 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
173 (void) pthread_mutex_lock(&mp->mod_stats_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
175 if (mp->mod_stats != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
176 mp->mod_stats->ms_snaptime.fmds_value.ui64 = gethrtime();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
177 bcopy(mp->mod_stats, rms->rms_buf.rms_buf_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
178 sizeof (fmd_modstat_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
179 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
180 free(rms->rms_buf.rms_buf_val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
181 rms->rms_buf.rms_buf_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
182 rms->rms_buf.rms_buf_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
183 rms->rms_err = FMD_ADM_ERR_MODFAIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
184 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
186 (void) pthread_mutex_unlock(&mp->mod_stats_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
187 fmd_module_rele(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
188 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
189 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
190
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
191 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
192 fmd_adm_modgstat_1_svc(struct fmd_rpc_modstat *rms, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
193 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
194 const size_t size = sizeof (fmd_statistics_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
196 if (fmd_rpc_deny(req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
197 rms->rms_buf.rms_buf_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
198 rms->rms_buf.rms_buf_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
199 rms->rms_err = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
200 } else if ((rms->rms_buf.rms_buf_val = malloc(size)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
201 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
202 * Note: the bcopy() here is valid only if no FMD_TYPE_STRING
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
203 * stats are present in fmd.d_stats (see definition in fmd.c).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
204 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
205 (void) pthread_mutex_lock(&fmd.d_stats_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
206 bcopy(fmd.d_stats, rms->rms_buf.rms_buf_val, size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
207 (void) pthread_mutex_unlock(&fmd.d_stats_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
208 rms->rms_buf.rms_buf_len = size / sizeof (fmd_stat_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
209 rms->rms_err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
210 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
211 rms->rms_buf.rms_buf_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
212 rms->rms_err = FMD_ADM_ERR_NOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
213 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
215 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
216 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
218 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
219 fmd_adm_modload_1_svc(char *path, int *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
220 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
221 fmd_module_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
222 const char *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
223 int err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
225 if (fmd_rpc_deny(req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
226 *rvp = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
227 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
228 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
230 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
231 * Before we endure the expense of constructing a module and attempting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
232 * to load it, do a quick check to see if the pathname is valid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
233 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
234 if (access(path, F_OK) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
235 *rvp = FMD_ADM_ERR_MODNOENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
236 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
237 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
239 if ((p = strrchr(path, '.')) != NULL && strcmp(p, ".so") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
240 mp = fmd_modhash_load(fmd.d_mod_hash, path, &fmd_rtld_ops);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
241 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
242 mp = fmd_modhash_load(fmd.d_mod_hash, path, &fmd_proc_ops);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
244 if (mp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
245 switch (errno) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
246 case EFMD_MOD_LOADED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
247 err = FMD_ADM_ERR_MODEXIST;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
248 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
249 case EFMD_MOD_INIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
250 err = FMD_ADM_ERR_MODINIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
251 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
252 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
253 err = FMD_ADM_ERR_MODLOAD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
254 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
255 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
256 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
257
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
258 *rvp = err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
259 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
260 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
262 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
263 fmd_adm_modunload_1_svc(char *name, int *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
264 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
265 fmd_module_t *mp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
266 int err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
267
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
268 if (fmd_rpc_deny(req))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
269 err = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
270 else if ((mp = fmd_modhash_lookup(fmd.d_mod_hash, name)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
271 err = FMD_ADM_ERR_MODSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
272 else if (mp == fmd.d_self)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
273 err = FMD_ADM_ERR_MODBUSY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
274 else if (fmd_modhash_unload(fmd.d_mod_hash, name) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
275 err = FMD_ADM_ERR_MODSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
277 if (mp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
278 fmd_module_rele(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
280 *rvp = err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
281 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
282 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
284 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
285 fmd_adm_modreset_1_svc(char *name, int *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
286 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
287 fmd_module_t *mp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
288 int err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
290 if (fmd_rpc_deny(req))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
291 err = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
292 else if ((mp = fmd_modhash_lookup(fmd.d_mod_hash, name)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
293 err = FMD_ADM_ERR_MODSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
294 else if (mp == fmd.d_self)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
295 err = FMD_ADM_ERR_MODBUSY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
296 else if (fmd_modhash_unload(fmd.d_mod_hash, name) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
297 err = FMD_ADM_ERR_MODSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
299 if (err == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
300 fmd_ckpt_delete(mp); /* erase any saved checkpoints */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
302 if (err == 0 && fmd_modhash_load(fmd.d_mod_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
303 mp->mod_path, mp->mod_ops) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
304 if (errno == EFMD_MOD_INIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
305 err = FMD_ADM_ERR_MODINIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
306 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
307 err = FMD_ADM_ERR_MODLOAD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
308 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
310 if (mp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
311 fmd_module_rele(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
313 *rvp = err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
314 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
315 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
317 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
318 fmd_adm_modgc_1_svc(char *name, int *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
319 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
320 fmd_module_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
321 int err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
323 if (fmd_rpc_deny(req))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
324 err = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
325 else if ((mp = fmd_modhash_lookup(fmd.d_mod_hash, name)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
326 err = FMD_ADM_ERR_MODSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
327 else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
328 fmd_module_gc(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
329 fmd_module_rele(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
330 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
332 *rvp = err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
333 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
334 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
336 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
337 * Unlike our other RPC callbacks, fmd_adm_rsrclist_1 can return large amounts
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
338 * of data that may exceed the underlying RPC transport buffer size if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
339 * resource cache is heavily populated and/or all resources are requested.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
340 * To minimize the likelihood of running out of RPC buffer space and having to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
341 * fail the client request, fmd_adm_rsrclist_1 returns a snapshot of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
342 * relevant FMRI strings only: the client can use fmd_adm_rsrcinfo_1 on an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
343 * individual FMRI if more information is needed. To further reduce the XDR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
344 * overhead, the string list is represented as XDR-opaque data where the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
345 * entire list is returned as a string table (e.g. "fmriA\0fmriB\0...").
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
346 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
347 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
348 fmd_adm_rsrclist_asru(fmd_asru_t *ap, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
349 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
350 struct fmd_rpc_rsrclist *rrl = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
351 size_t name_len, buf_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
352 void *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
354 /*
5255
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
355 * Skip the ASRU if this fault is marked as invisible.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
356 * If rrl_all is false, we take a quick look at asru_flags with no lock
5255
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
357 * held to see if the ASRU is not faulty. If so,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
358 * we don't want to report it by default and can just skip this ASRU.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
359 * This helps keep overhead low in the common case, as the call to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
360 * fmd_asru_getstate() can be expensive depending on the scheme.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
361 */
5255
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
362
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
363 if (ap->asru_flags & FMD_ASRU_INVISIBLE)
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
364 return;
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
365 if (rrl->rrl_all == B_FALSE && !(ap->asru_flags & FMD_ASRU_FAULTY))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
366 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
368 if (rrl->rrl_err != 0 || fmd_asru_getstate(ap) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
369 return; /* error has occurred or resource is in 'ok' state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
371 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
372 * Lock the ASRU and reallocate rrl_buf[] to be large enough to hold
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
373 * another string, doubling it as needed. Then copy the new string
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
374 * on to the end, and increment rrl_len to indicate the used space.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
375 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
376 (void) pthread_mutex_lock(&ap->asru_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
377 name_len = strlen(ap->asru_name) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
379 while (rrl->rrl_len + name_len > rrl->rrl_buf.rrl_buf_len) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
380 if (rrl->rrl_buf.rrl_buf_len != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
381 buf_len = rrl->rrl_buf.rrl_buf_len * 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
382 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
383 buf_len = 1024; /* default buffer size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
384
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
385 if ((p = realloc(rrl->rrl_buf.rrl_buf_val, buf_len)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
386 bzero((char *)p + rrl->rrl_buf.rrl_buf_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
387 buf_len - rrl->rrl_buf.rrl_buf_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
388 rrl->rrl_buf.rrl_buf_val = p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
389 rrl->rrl_buf.rrl_buf_len = buf_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
390 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
391 rrl->rrl_err = FMD_ADM_ERR_NOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
392 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
393 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
394 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
396 if (rrl->rrl_err == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
397 bcopy(ap->asru_name, (char *)rrl->rrl_buf.rrl_buf_val +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
398 rrl->rrl_len, name_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
399 rrl->rrl_len += name_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
400 rrl->rrl_cnt++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
401 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
403 (void) pthread_mutex_unlock(&ap->asru_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
404 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
405
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
406 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
407 fmd_adm_rsrclist_1_svc(bool_t all,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
408 struct fmd_rpc_rsrclist *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
409 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
410 rvp->rrl_buf.rrl_buf_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
411 rvp->rrl_buf.rrl_buf_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
412 rvp->rrl_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
413 rvp->rrl_cnt = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
414 rvp->rrl_err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
415 rvp->rrl_all = all;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
417 if (fmd_rpc_deny(req))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
418 rvp->rrl_err = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
419 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
420 fmd_asru_hash_apply(fmd.d_asrus, fmd_adm_rsrclist_asru, rvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
422 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
423 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
425 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
426 fmd_adm_rsrcinfo_1_svc(char *fmri,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
427 struct fmd_rpc_rsrcinfo *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
428 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
429 fmd_asru_t *ap;
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
430 fmd_case_impl_t *cip;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
431 int state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
432
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
433 bzero(rvp, sizeof (struct fmd_rpc_rsrcinfo));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
434
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
435 if (fmd_rpc_deny(req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
436 rvp->rri_err = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
437 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
438 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
439
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
440 if ((ap = fmd_asru_hash_lookup_name(fmd.d_asrus, fmri)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
441 rvp->rri_err = FMD_ADM_ERR_RSRCSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
442 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
443 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
445 state = fmd_asru_getstate(ap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
446 (void) pthread_mutex_lock(&ap->asru_lock);
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
447 cip = (fmd_case_impl_t *)ap->asru_case;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
449 rvp->rri_fmri = strdup(ap->asru_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
450 rvp->rri_uuid = strdup(ap->asru_uuid);
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
451 rvp->rri_case = cip ? strdup(cip->ci_uuid) : NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
452 rvp->rri_faulty = (state & FMD_ASRU_FAULTY) != 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
453 rvp->rri_unusable = (state & FMD_ASRU_UNUSABLE) != 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
454 rvp->rri_invisible = (ap->asru_flags & FMD_ASRU_INVISIBLE) != 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
456 (void) pthread_mutex_unlock(&ap->asru_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
457 fmd_asru_hash_release(fmd.d_asrus, ap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
459 if (rvp->rri_fmri == NULL || rvp->rri_uuid == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
460 rvp->rri_err = FMD_ADM_ERR_NOMEM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
461
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
462 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
463 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
464
9120
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
465 static void
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
466 fmd_adm_do_repair(char *name, struct svc_req *req, int *errp, uint8_t reason,
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
467 char *uuid)
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
468 {
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
469 if (fmd_rpc_deny(req))
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
470 *errp = FMD_ADM_ERR_PERM;
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
471 else {
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
472 fmd_asru_rep_arg_t fara;
9874
443951628139 6778345 need better error message if "fmadm replaced" finds the original fru is still present.
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
473 int err = FARA_ERR_RSRCNOTF;
9120
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
474
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
475 fara.fara_reason = reason;
9874
443951628139 6778345 need better error message if "fmadm replaced" finds the original fru is still present.
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
476 fara.fara_rval = &err;
9120
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
477 fara.fara_uuid = uuid;
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
478 fara.fara_bywhat = FARA_BY_ASRU;
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
479 fmd_asru_hash_apply_by_asru(fmd.d_asrus, name,
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
480 fmd_asru_repaired, &fara);
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
481 fara.fara_bywhat = FARA_BY_LABEL;
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
482 fmd_asru_hash_apply_by_label(fmd.d_asrus, name,
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
483 fmd_asru_repaired, &fara);
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
484 fara.fara_bywhat = FARA_BY_FRU;
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
485 fmd_asru_hash_apply_by_fru(fmd.d_asrus, name,
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
486 fmd_asru_repaired, &fara);
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
487 fara.fara_bywhat = FARA_BY_RSRC;
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
488 fmd_asru_hash_apply_by_rsrc(fmd.d_asrus, name,
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
489 fmd_asru_repaired, &fara);
9874
443951628139 6778345 need better error message if "fmadm replaced" finds the original fru is still present.
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
490 if (err == FARA_ERR_RSRCNOTR)
443951628139 6778345 need better error message if "fmadm replaced" finds the original fru is still present.
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
491 *errp = FMD_ADM_ERR_RSRCNOTR;
443951628139 6778345 need better error message if "fmadm replaced" finds the original fru is still present.
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
492 else if (err == FARA_OK)
443951628139 6778345 need better error message if "fmadm replaced" finds the original fru is still present.
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9120
diff changeset
493 *errp = 0;
9120
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
494 }
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
495 }
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
496
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
497 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
498 fmd_adm_rsrcflush_1_svc(char *name, int *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
499 {
9120
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
500 int err = FMD_ADM_ERR_RSRCNOTF;
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
501
10656
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
502 /*
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
503 * If anyone does an fmadm flush command, discard any resolved
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
504 * cases that were being retained for historic diagnosis.
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
505 */
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
506 if (fmd_rpc_deny(req))
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
507 err = FMD_ADM_ERR_PERM;
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
508 else {
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
509 fmd_asru_hash_apply_by_asru(fmd.d_asrus, name,
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
510 fmd_asru_flush, &err);
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
511 fmd_asru_hash_apply_by_label(fmd.d_asrus, name,
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
512 fmd_asru_flush, &err);
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
513 fmd_asru_hash_apply_by_fru(fmd.d_asrus, name,
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
514 fmd_asru_flush, &err);
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
515 fmd_asru_hash_apply_by_rsrc(fmd.d_asrus, name,
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
516 fmd_asru_flush, &err);
217544b3cf73 6778240 generic historic diagnosis rules
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 9874
diff changeset
517 }
9120
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
518 *rvp = err;
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
519 return (TRUE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
520 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
522 bool_t
7275
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
523 fmd_adm_rsrcrepaired_1_svc(char *name, int *rvp, struct svc_req *req)
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
524 {
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
525 int err = FMD_ADM_ERR_RSRCNOTF;
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
526
9120
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
527 fmd_adm_do_repair(name, req, &err, FMD_ASRU_REPAIRED, NULL);
7275
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
528 *rvp = err;
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
529 return (TRUE);
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
530 }
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
531
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
532 bool_t
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
533 fmd_adm_rsrcreplaced_1_svc(char *name, int *rvp, struct svc_req *req)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
534 {
6228
b8f7c3bfc29b 6372069 fmadm repair command should accept the FRU label as an argument
stephh
parents: 5255
diff changeset
535 int err = FMD_ADM_ERR_RSRCNOTF;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
536
9120
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
537 fmd_adm_do_repair(name, req, &err, FMD_ASRU_REPLACED, NULL);
7275
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
538 *rvp = err;
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
539 return (TRUE);
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
540 }
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
541
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
542 bool_t
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
543 fmd_adm_rsrcacquit_1_svc(char *name, char *uuid, int *rvp, struct svc_req *req)
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
544 {
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
545 int err = FMD_ADM_ERR_RSRCNOTF;
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
546
9120
fe1f7d8cd967 6533823 need better way of proxying faults across event transport
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 7275
diff changeset
547 fmd_adm_do_repair(name, req, &err, FMD_ASRU_ACQUITTED, uuid);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
548 *rvp = err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
549 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
550 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
551
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
552 static void
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
553 fmd_adm_serdlist_measure(fmd_serd_eng_t *sgp, void *arg)
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
554 {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
555 struct fmd_rpc_serdlist *rsl = arg;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
556
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
557 rsl->rsl_len += strlen(sgp->sg_name) + 1;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
558 rsl->rsl_cnt++;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
559 }
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
560
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
561 static void
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
562 fmd_adm_serdlist_record(fmd_serd_eng_t *sgp, void *arg)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
563 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
564 struct fmd_rpc_serdlist *rsl = arg;
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
565
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
566 bcopy(sgp->sg_name, rsl->rsl_buf.rsl_buf_val + rsl->rsl_len,
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
567 strlen(sgp->sg_name));
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
568 rsl->rsl_len += strlen(sgp->sg_name) + 1;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
569 }
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
570
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
571 bool_t
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
572 fmd_adm_serdlist_1_svc(char *name, struct fmd_rpc_serdlist *rvp,
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
573 struct svc_req *req)
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
574 {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
575 fmd_module_t *mp;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
576 void *p;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
577
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
578 rvp->rsl_buf.rsl_buf_len = 0;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
579 rvp->rsl_buf.rsl_buf_val = NULL;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
580 rvp->rsl_len = 0;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
581 rvp->rsl_cnt = 0;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
582 rvp->rsl_err = 0;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
583
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
584 if (fmd_rpc_deny(req)) {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
585 rvp->rsl_err = FMD_ADM_ERR_PERM;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
586 return (TRUE);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
587 }
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
588
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
589 if ((mp = fmd_modhash_lookup(fmd.d_mod_hash, name)) == NULL) {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
590 rvp->rsl_err = FMD_ADM_ERR_MODSRCH;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
591 return (TRUE);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
592 }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
593
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
594 fmd_module_lock(mp);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
595 /* In the first pass, collect the overall length of the buffer. */
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
596 fmd_serd_hash_apply(&mp->mod_serds, fmd_adm_serdlist_measure, rvp);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
597 if (rvp->rsl_len == 0) {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
598 fmd_module_unlock(mp);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
599 fmd_module_rele(mp);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
600 return (TRUE);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
601 }
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
602 p = malloc(rvp->rsl_len);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
603 if (p) {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
604 rvp->rsl_buf.rsl_buf_val = p;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
605 rvp->rsl_buf.rsl_buf_len = rvp->rsl_len;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
606 bzero(rvp->rsl_buf.rsl_buf_val, rvp->rsl_buf.rsl_buf_len);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
607 rvp->rsl_len = 0;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
608 /* In the second pass, populate the buffer with data. */
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
609 fmd_serd_hash_apply(&mp->mod_serds, fmd_adm_serdlist_record,
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
610 rvp);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
611 } else {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
612 rvp->rsl_err = FMD_ADM_ERR_NOMEM;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
613 }
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
614 fmd_module_unlock(mp);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
615
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
616 fmd_module_rele(mp);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
617 return (TRUE);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
618 }
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
619
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
620 static void
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
621 fmd_adm_serdinfo_record(fmd_serd_eng_t *sgp, struct fmd_rpc_serdinfo *rsi)
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
622 {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
623 uint64_t old, now = fmd_time_gethrtime();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
624 const fmd_serd_elem_t *oep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
625
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
626 if ((rsi->rsi_name = strdup(sgp->sg_name)) == NULL) {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
627 rsi->rsi_err = FMD_ADM_ERR_NOMEM;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
628 return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
629 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
630
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
631 if ((oep = fmd_list_next(&sgp->sg_list)) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
632 old = fmd_event_hrtime(oep->se_event);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
633 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
634 old = now;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
636 rsi->rsi_delta = now >= old ? now - old : (UINT64_MAX - old) + now + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
637 rsi->rsi_count = sgp->sg_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
638 rsi->rsi_fired = fmd_serd_eng_fired(sgp) != 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
639 rsi->rsi_n = sgp->sg_n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
640 rsi->rsi_t = sgp->sg_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
641 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
643 bool_t
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
644 fmd_adm_serdinfo_1_svc(char *mname, char *sname, struct fmd_rpc_serdinfo *rvp,
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
645 struct svc_req *req)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
646 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
647 fmd_module_t *mp;
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
648 fmd_serd_eng_t *sgp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
649
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
650 bzero(rvp, sizeof (struct fmd_rpc_serdinfo));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
651
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
652 if (fmd_rpc_deny(req)) {
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
653 rvp->rsi_err = FMD_ADM_ERR_PERM;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
654 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
655 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
656
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
657 if ((mp = fmd_modhash_lookup(fmd.d_mod_hash, mname)) == NULL) {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
658 rvp->rsi_err = FMD_ADM_ERR_MODSRCH;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
659 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
660 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
662 fmd_module_lock(mp);
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
663
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
664 if ((sgp = fmd_serd_eng_lookup(&mp->mod_serds, sname)) != NULL) {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
665 fmd_adm_serdinfo_record(sgp, rvp);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
666 } else
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
667 rvp->rsi_err = FMD_ADM_ERR_SERDSRCH;
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
668
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
669 fmd_module_unlock(mp);
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
670 fmd_module_rele(mp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
671
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
672 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
673 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
674
11400
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
675 /*ARGSUSED*/
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
676 bool_t
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
677 fmd_adm_serdinfo_old_1_svc(char *name, struct fmd_rpc_serdlist *rvp,
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
678 struct svc_req *req)
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
679 {
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
680 return (FALSE);
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
681 }
718b14f230ae 6893742 "fmstat -s -m cpumem-diagnosis" can cause fmd to overflow stack
Jakub Jermar <Jakub.Jermar@Sun.COM>
parents: 10656
diff changeset
682
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
683 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
684 fmd_adm_serdreset_1_svc(char *mname, char *sname, int *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
685 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
686 fmd_module_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
687 fmd_serd_eng_t *sgp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
688 int err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
689
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
690 if (fmd_rpc_deny(req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
691 *rvp = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
692 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
693 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
694
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
695 if ((mp = fmd_modhash_lookup(fmd.d_mod_hash, mname)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
696 *rvp = FMD_ADM_ERR_MODSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
697 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
698 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
699
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
700 fmd_module_lock(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
701
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
702 if ((sgp = fmd_serd_eng_lookup(&mp->mod_serds, sname)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
703 if (fmd_serd_eng_fired(sgp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
704 err = FMD_ADM_ERR_SERDFIRED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
705 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
706 fmd_serd_eng_reset(sgp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
707 fmd_module_setdirty(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
708 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
709 } else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
710 err = FMD_ADM_ERR_SERDSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
711
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
712 fmd_module_unlock(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
713 fmd_module_rele(mp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
715 *rvp = err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
716 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
717 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
719 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
720 fmd_adm_logrotate_1_svc(char *name, int *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
721 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
722 fmd_log_t **lpp, *old, *new;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
723 int try = 1, trylimit = 1;
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
724 pthread_rwlock_t *lockp;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
725
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
726 hrtime_t nsec = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
727 timespec_t tv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
728
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
729 if (fmd_rpc_deny(req)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
730 *rvp = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
731 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
732 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
733
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
734 if (strcmp(name, "errlog") == 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
735 lpp = &fmd.d_errlog;
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
736 lockp = &fmd.d_log_lock;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
737 } else if (strcmp(name, "fltlog") == 0) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
738 lpp = &fmd.d_fltlog;
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
739 lockp = &fmd.d_log_lock;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
740 } else if (strcmp(name, "infolog") == 0) {
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
741 lpp = &fmd.d_ilog;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
742 lockp = &fmd.d_ilog_lock;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
743 } else if (strcmp(name, "infolog_hival") == 0) {
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
744 lpp = &fmd.d_hvilog;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
745 lockp = &fmd.d_hvilog_lock;
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
746 } else {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
747 *rvp = FMD_ADM_ERR_ROTSRCH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
748 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
749 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
750
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
751 (void) fmd_conf_getprop(fmd.d_conf, "log.tryrotate", &trylimit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
752 (void) fmd_conf_getprop(fmd.d_conf, "log.waitrotate", &nsec);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
753
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
754 tv.tv_sec = nsec / NANOSEC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
755 tv.tv_nsec = nsec % NANOSEC;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
756
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
757 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
758 * To rotate a log file, grab d_log_lock as writer to make sure no
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
759 * one else can discover the current log pointer. Then try to rotate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
760 * the log. If we're successful, release the old log pointer.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
761 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
762 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
763 if (try > 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
764 (void) nanosleep(&tv, NULL); /* wait for checkpoints */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
765
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
766 (void) pthread_rwlock_wrlock(lockp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
767 old = *lpp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
768
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
769 if ((new = fmd_log_rotate(old)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
770 fmd_log_rele(old);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
771 *lpp = new;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
772 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
773
12979
ab9ae749152f PSARC/2009/617 Software Events Notification Parameters CLI
Gavin Maltby <gavin.maltby@oracle.com>
parents: 11400
diff changeset
774 (void) pthread_rwlock_unlock(lockp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
775
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
776 } while (new == NULL && errno == EFMD_LOG_ROTBUSY && try++ < trylimit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
777
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
778 if (new != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
779 *rvp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
780 else if (errno == EFMD_LOG_ROTBUSY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
781 *rvp = FMD_ADM_ERR_ROTBUSY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
782 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
783 *rvp = FMD_ADM_ERR_ROTFAIL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
784
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
785 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
786 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
787
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
788 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
789 fmd_adm_caserepair_1_svc(char *uuid, int *rvp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
790 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
791 fmd_case_t *cp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
792 int err = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
793
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
794 if (fmd_rpc_deny(req))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
795 err = FMD_ADM_ERR_PERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
796 else if ((cp = fmd_case_hash_lookup(fmd.d_cases, uuid)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
797 err = FMD_ADM_ERR_CASESRCH;
1552
42b0f4458714 6377640 fmd build can try to re-install .so links as directories
mws
parents: 1303
diff changeset
798 else if (fmd_case_repair(cp) != 0) {
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
799 err = errno == EFMD_CASE_OWNER ?
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
800 FMD_ADM_ERR_CASEXPRT : FMD_ADM_ERR_CASEOPEN;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
801 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
802
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
803 if (cp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
804 fmd_case_rele(cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
805
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
806 *rvp = err;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
807 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
808 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
809
7275
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
810 bool_t
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
811 fmd_adm_caseacquit_1_svc(char *uuid, int *rvp, struct svc_req *req)
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
812 {
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
813 fmd_case_t *cp = NULL;
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
814 int err = 0;
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
815
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
816 if (fmd_rpc_deny(req))
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
817 err = FMD_ADM_ERR_PERM;
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
818 else if ((cp = fmd_case_hash_lookup(fmd.d_cases, uuid)) == NULL)
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
819 err = FMD_ADM_ERR_CASESRCH;
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
820 else if (fmd_case_acquit(cp) != 0) {
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
821 err = errno == EFMD_CASE_OWNER ?
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
822 FMD_ADM_ERR_CASEXPRT : FMD_ADM_ERR_CASEOPEN;
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
823 }
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
824
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
825 if (cp != NULL)
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
826 fmd_case_rele(cp);
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
827
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
828 *rvp = err;
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
829 return (TRUE);
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
830 }
1157db66a604 PSARC/2008/487 Repair Observability changes
stephh
parents: 6228
diff changeset
831
1303
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
832 void
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
833 fmd_adm_caselist_case(fmd_case_t *cp, void *arg)
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
834 {
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
835 fmd_case_impl_t *cip = (fmd_case_impl_t *)cp;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
836 struct fmd_rpc_caselist *rcl = arg;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
837 size_t uuid_len, buf_len;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
838 void *p;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
839
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
840 if (rcl->rcl_err != 0)
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
841 return;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
842
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
843 /*
5255
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
844 * skip invisible cases
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
845 */
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
846 if (cip->ci_flags & FMD_CF_INVISIBLE)
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
847 return;
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
848
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
849 /*
1303
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
850 * Lock the case and reallocate rcl_buf[] to be large enough to hold
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
851 * another string, doubling it as needed. Then copy the new string
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
852 * on to the end, and increment rcl_len to indicate the used space.
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
853 */
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
854 if (!(cip->ci_flags & FMD_CF_SOLVED))
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
855 return;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
856
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
857 (void) pthread_mutex_lock(&cip->ci_lock);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
858
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
859 uuid_len = cip->ci_uuidlen + 1;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
860
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
861 while (rcl->rcl_len + uuid_len > rcl->rcl_buf.rcl_buf_len) {
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
862 if (rcl->rcl_buf.rcl_buf_len != 0)
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
863 buf_len = rcl->rcl_buf.rcl_buf_len * 2;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
864 else
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
865 buf_len = 1024; /* default buffer size */
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
866
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
867 if ((p = realloc(rcl->rcl_buf.rcl_buf_val, buf_len)) != NULL) {
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
868 bzero((char *)p + rcl->rcl_buf.rcl_buf_len,
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
869 buf_len - rcl->rcl_buf.rcl_buf_len);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
870 rcl->rcl_buf.rcl_buf_val = p;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
871 rcl->rcl_buf.rcl_buf_len = buf_len;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
872 } else {
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
873 rcl->rcl_err = FMD_ADM_ERR_NOMEM;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
874 break;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
875 }
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
876 }
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
877
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
878 if (rcl->rcl_err == 0) {
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
879 bcopy(cip->ci_uuid, (char *)rcl->rcl_buf.rcl_buf_val +
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
880 rcl->rcl_len, uuid_len);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
881 rcl->rcl_len += uuid_len;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
882 rcl->rcl_cnt++;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
883 }
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
884
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
885 (void) pthread_mutex_unlock(&cip->ci_lock);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
886 }
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
887
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
888 bool_t
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
889 fmd_adm_caselist_1_svc(struct fmd_rpc_caselist *rvp, struct svc_req *req)
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
890 {
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
891 rvp->rcl_buf.rcl_buf_len = 0;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
892 rvp->rcl_buf.rcl_buf_val = NULL;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
893 rvp->rcl_len = 0;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
894 rvp->rcl_cnt = 0;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
895 rvp->rcl_err = 0;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
896
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
897 if (fmd_rpc_deny(req))
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
898 rvp->rcl_err = FMD_ADM_ERR_PERM;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
899 else
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
900 fmd_case_hash_apply(fmd.d_cases, fmd_adm_caselist_case, rvp);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
901
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
902 return (TRUE);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
903 }
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
904
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
905 bool_t
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
906 fmd_adm_caseinfo_1_svc(char *uuid, struct fmd_rpc_caseinfo *rvp,
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
907 struct svc_req *req)
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
908 {
5255
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
909 fmd_case_t *cp;
1303
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
910 nvlist_t *nvl;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
911 int err = 0;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
912
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
913 bzero(rvp, sizeof (struct fmd_rpc_caseinfo));
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
914
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
915 if (fmd_rpc_deny(req)) {
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
916 rvp->rci_err = FMD_ADM_ERR_PERM;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
917 return (TRUE);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
918 }
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
919
5255
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
920 if ((cp = fmd_case_hash_lookup(fmd.d_cases, uuid)) == NULL) {
1303
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
921 rvp->rci_err = FMD_ADM_ERR_CASESRCH;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
922 return (TRUE);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
923 }
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
924
5255
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
925 if (!(((fmd_case_impl_t *)cp)->ci_flags & FMD_CF_SOLVED)) {
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
926 fmd_case_rele(cp);
1303
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
927 rvp->rci_err = FMD_ADM_ERR_CASESRCH;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
928 return (TRUE);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
929 }
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
930
5255
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
931 nvl = fmd_case_mkevent(cp, FM_LIST_SUSPECT_CLASS);
1303
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
932
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
933 err = nvlist_pack(nvl, &rvp->rci_evbuf.rci_evbuf_val,
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
934 &rvp->rci_evbuf.rci_evbuf_len, NV_ENCODE_XDR, 0);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
935
5255
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
936 nvlist_free(nvl);
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
937
1303
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
938 if (err != 0)
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
939 rvp->rci_err = FMD_ADM_ERR_NOMEM;
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
940
5255
8dc347a9bd70 PSARC 2007/460 fmadm faulty command new output and arguments
stephh
parents: 1552
diff changeset
941 fmd_case_rele(cp);
1303
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
942
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
943 return (TRUE);
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
944 }
6e5751a0b831 PSARC 2005/754 FMA SNMP Agent
wesolows
parents: 1193
diff changeset
945
1193
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
946 /*ARGSUSED*/
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
947 static void
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
948 fmd_adm_xprtlist_one(fmd_idspace_t *ids, id_t id, void *arg)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
949 {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
950 struct fmd_rpc_xprtlist *rvp = arg;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
951
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
952 if (rvp->rxl_len < rvp->rxl_buf.rxl_buf_len)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
953 rvp->rxl_buf.rxl_buf_val[rvp->rxl_len++] = id;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
954 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
955
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
956 bool_t
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
957 fmd_adm_xprtlist_1_svc(struct fmd_rpc_xprtlist *rvp, struct svc_req *req)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
958 {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
959 if (fmd_rpc_deny(req)) {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
960 rvp->rxl_buf.rxl_buf_len = 0;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
961 rvp->rxl_buf.rxl_buf_val = NULL;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
962 rvp->rxl_len = 0;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
963 rvp->rxl_err = FMD_ADM_ERR_PERM;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
964 return (TRUE);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
965 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
966
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
967 /*
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
968 * Since we're taking a snapshot of the transports, and these could
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
969 * change after we return our result, there's no need to hold any kind
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
970 * of lock between retrieving ids_count and taking the snapshot. We'll
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
971 * just capture up to a maximum of whatever ids_count value we sampled.
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
972 */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
973 rvp->rxl_buf.rxl_buf_len = fmd.d_xprt_ids->ids_count;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
974 rvp->rxl_buf.rxl_buf_val = malloc(sizeof (int32_t) *
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
975 rvp->rxl_buf.rxl_buf_len);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
976 rvp->rxl_len = 0;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
977 rvp->rxl_err = 0;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
978
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
979 if (rvp->rxl_buf.rxl_buf_val == NULL) {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
980 rvp->rxl_err = FMD_ADM_ERR_NOMEM;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
981 return (TRUE);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
982 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
983
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
984 fmd_idspace_apply(fmd.d_xprt_ids, fmd_adm_xprtlist_one, rvp);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
985 return (TRUE);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
986 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
987
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
988 bool_t
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
989 fmd_adm_xprtstat_1_svc(int32_t id,
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
990 struct fmd_rpc_modstat *rms, struct svc_req *req)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
991 {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
992 fmd_xprt_impl_t *xip;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
993 fmd_stat_t *sp, *ep, *cp;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
994
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
995 if (fmd_rpc_deny(req)) {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
996 rms->rms_buf.rms_buf_val = NULL;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
997 rms->rms_buf.rms_buf_len = 0;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
998 rms->rms_err = FMD_ADM_ERR_PERM;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
999 return (TRUE);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1000 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1001
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1002 rms->rms_buf.rms_buf_val = malloc(sizeof (fmd_xprt_stat_t));
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1003 rms->rms_buf.rms_buf_len = sizeof (fmd_xprt_stat_t) /
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1004 sizeof (fmd_stat_t);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1005 rms->rms_err = 0;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1006
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1007 if (rms->rms_buf.rms_buf_val == NULL) {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1008 rms->rms_err = FMD_ADM_ERR_NOMEM;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1009 rms->rms_buf.rms_buf_len = 0;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1010 return (TRUE);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1011 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1012
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1013 if ((xip = fmd_idspace_hold(fmd.d_xprt_ids, id)) == NULL) {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1014 rms->rms_err = FMD_ADM_ERR_XPRTSRCH;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1015 return (TRUE);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1016 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1017
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1018 /*
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1019 * Grab the stats lock and bcopy the entire transport stats array in
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1020 * one shot. Then go back through and duplicate any string values.
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1021 */
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1022 (void) pthread_mutex_lock(&xip->xi_stats_lock);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1023
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1024 sp = (fmd_stat_t *)xip->xi_stats;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1025 ep = sp + rms->rms_buf.rms_buf_len;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1026 cp = rms->rms_buf.rms_buf_val;
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1027
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1028 bcopy(sp, cp, sizeof (fmd_xprt_stat_t));
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1029
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1030 for (; sp < ep; sp++, cp++) {
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1031 if (sp->fmds_type == FMD_TYPE_STRING &&
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1032 sp->fmds_value.str != NULL)
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1033 cp->fmds_value.str = strdup(sp->fmds_value.str);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1034 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1035
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1036 (void) pthread_mutex_unlock(&xip->xi_stats_lock);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1037 fmd_idspace_rele(fmd.d_xprt_ids, id);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1038
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1039 return (TRUE);
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1040 }
e784a8fa27da PSARC 2005/755 FMA Transport Layer
mws
parents: 0
diff changeset
1041
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1042 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1043 fmd_adm_1_freeresult(SVCXPRT *xprt, xdrproc_t proc, caddr_t data)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1044 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1045 xdr_free(proc, data);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1046 svc_done(xprt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1047 return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1048 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1049
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1050 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1051 * Custom XDR routine for our API structure fmd_stat_t. This function must
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1052 * match the definition of fmd_stat_t in <fmd_api.h> and must also match
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1053 * the corresponding routine in usr/src/lib/fm/libfmd_adm/common/fmd_adm.c.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1054 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1055 bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1056 xdr_fmd_stat(XDR *xp, fmd_stat_t *sp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1057 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1058 bool_t rv = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1059
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1060 rv &= xdr_opaque(xp, sp->fmds_name, sizeof (sp->fmds_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1061 rv &= xdr_u_int(xp, &sp->fmds_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1062 rv &= xdr_opaque(xp, sp->fmds_desc, sizeof (sp->fmds_desc));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1063
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1064 switch (sp->fmds_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1065 case FMD_TYPE_BOOL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1066 rv &= xdr_int(xp, &sp->fmds_value.bool);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1067 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1068 case FMD_TYPE_INT32:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1069 rv &= xdr_int32_t(xp, &sp->fmds_value.i32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1070 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1071 case FMD_TYPE_UINT32:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1072 rv &= xdr_uint32_t(xp, &sp->fmds_value.ui32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1073 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1074 case FMD_TYPE_INT64:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1075 rv &= xdr_int64_t(xp, &sp->fmds_value.i64);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1076 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1077 case FMD_TYPE_UINT64:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1078 case FMD_TYPE_TIME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1079 case FMD_TYPE_SIZE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1080 rv &= xdr_uint64_t(xp, &sp->fmds_value.ui64);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1081 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1082 case FMD_TYPE_STRING:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1083 rv &= xdr_string(xp, &sp->fmds_value.str, ~0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1084 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1085 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1086
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1087 return (rv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1088 }