xref: /onnv-gate/usr/src/lib/libcontract/common/device_dump.c (revision 4845:357e8e7542af)
1*4845Svikram /*
2*4845Svikram  * CDDL HEADER START
3*4845Svikram  *
4*4845Svikram  * The contents of this file are subject to the terms of the
5*4845Svikram  * Common Development and Distribution License (the "License").
6*4845Svikram  * You may not use this file except in compliance with the License.
7*4845Svikram  *
8*4845Svikram  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*4845Svikram  * or http://www.opensolaris.org/os/licensing.
10*4845Svikram  * See the License for the specific language governing permissions
11*4845Svikram  * and limitations under the License.
12*4845Svikram  *
13*4845Svikram  * When distributing Covered Code, include this CDDL HEADER in each
14*4845Svikram  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*4845Svikram  * If applicable, add the following below this CDDL HEADER, with the
16*4845Svikram  * fields enclosed by brackets "[]" replaced with your own identifying
17*4845Svikram  * information: Portions Copyright [yyyy] [name of copyright owner]
18*4845Svikram  *
19*4845Svikram  * CDDL HEADER END
20*4845Svikram  */
21*4845Svikram /*
22*4845Svikram  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23*4845Svikram  * Use is subject to license terms.
24*4845Svikram  */
25*4845Svikram 
26*4845Svikram #pragma ident	"%Z%%M%	%I%	%E% SMI"
27*4845Svikram 
28*4845Svikram #include <sys/contract/device.h>
29*4845Svikram #include <sys/wait.h>
30*4845Svikram #include <sys/ctfs.h>
31*4845Svikram #include <unistd.h>
32*4845Svikram #include <fcntl.h>
33*4845Svikram #include <errno.h>
34*4845Svikram #include <string.h>
35*4845Svikram #include <limits.h>
36*4845Svikram #include <stdio.h>
37*4845Svikram #include <assert.h>
38*4845Svikram #include <signal.h>
39*4845Svikram #include <libuutil.h>
40*4845Svikram #include <libintl.h>
41*4845Svikram #include <libcontract.h>
42*4845Svikram #include <libcontract_priv.h>
43*4845Svikram #include "libcontract_impl.h"
44*4845Svikram #include "libcontract_priv.h"
45*4845Svikram 
46*4845Svikram /*ARGSUSED*/
47*4845Svikram void
event_device(FILE * file,ct_evthdl_t ev,int verbose)48*4845Svikram event_device(FILE *file, ct_evthdl_t ev, int verbose)
49*4845Svikram {
50*4845Svikram 	uint_t type;
51*4845Svikram 	char *device;
52*4845Svikram 	char *s;
53*4845Svikram 	ctid_t ctid;
54*4845Svikram 	ct_stathdl_t stathdl;
55*4845Svikram 	int statfd;
56*4845Svikram 
57*4845Svikram 	type = ct_event_get_type(ev);
58*4845Svikram 	ctid = ct_event_get_ctid(ev);
59*4845Svikram 
60*4845Svikram 	statfd = contract_open(ctid, "device", "status", O_RDONLY);
61*4845Svikram 	if (statfd == -1) {
62*4845Svikram 		(void) fprintf(file, dgettext(TEXT_DOMAIN, "[bad contract]\n"));
63*4845Svikram 		return;
64*4845Svikram 	}
65*4845Svikram 
66*4845Svikram 	if (ct_status_read(statfd, CTD_ALL, &stathdl) != 0) {
67*4845Svikram 		(void) fprintf(file, dgettext(TEXT_DOMAIN, "[status error]\n"));
68*4845Svikram 		return;
69*4845Svikram 	}
70*4845Svikram 
71*4845Svikram 	if (ct_dev_status_get_minor(stathdl, &device) != 0) {
72*4845Svikram 		(void) fprintf(file, dgettext(TEXT_DOMAIN, "[bad status]\n"));
73*4845Svikram 		return;
74*4845Svikram 	}
75*4845Svikram 
76*4845Svikram 
77*4845Svikram 	switch (type) {
78*4845Svikram 	case CT_DEV_EV_OFFLINE:
79*4845Svikram 		s = dgettext(TEXT_DOMAIN, "device %s offlining\n");
80*4845Svikram 		break;
81*4845Svikram 	case CT_DEV_EV_DEGRADED:
82*4845Svikram 		s = dgettext(TEXT_DOMAIN, "device %s degrading\n");
83*4845Svikram 		break;
84*4845Svikram 	case CT_DEV_EV_ONLINE:
85*4845Svikram 		s = dgettext(TEXT_DOMAIN, "device %s online\n");
86*4845Svikram 		break;
87*4845Svikram 	case CT_EV_NEGEND:
88*4845Svikram 		contract_negend_dump(file, ev);
89*4845Svikram 		s = NULL;
90*4845Svikram 		break;
91*4845Svikram 	default:
92*4845Svikram 		s = dgettext(TEXT_DOMAIN, "device %s sent an unknown event\n");
93*4845Svikram 		break;
94*4845Svikram 	}
95*4845Svikram 
96*4845Svikram 	if (s) {
97*4845Svikram 		/*LINTED*/
98*4845Svikram 		(void) fprintf(file, s, device);
99*4845Svikram 	}
100*4845Svikram 
101*4845Svikram 	ct_status_free(stathdl);
102*4845Svikram 	(void) close(statfd);
103*4845Svikram }
104