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