25e8c5aa2b496d9026e958ac731a610167574f59vikram/*
25e8c5aa2b496d9026e958ac731a610167574f59vikram * CDDL HEADER START
25e8c5aa2b496d9026e958ac731a610167574f59vikram *
25e8c5aa2b496d9026e958ac731a610167574f59vikram * The contents of this file are subject to the terms of the
25e8c5aa2b496d9026e958ac731a610167574f59vikram * Common Development and Distribution License (the "License").
25e8c5aa2b496d9026e958ac731a610167574f59vikram * You may not use this file except in compliance with the License.
25e8c5aa2b496d9026e958ac731a610167574f59vikram *
25e8c5aa2b496d9026e958ac731a610167574f59vikram * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25e8c5aa2b496d9026e958ac731a610167574f59vikram * or http://www.opensolaris.org/os/licensing.
25e8c5aa2b496d9026e958ac731a610167574f59vikram * See the License for the specific language governing permissions
25e8c5aa2b496d9026e958ac731a610167574f59vikram * and limitations under the License.
25e8c5aa2b496d9026e958ac731a610167574f59vikram *
25e8c5aa2b496d9026e958ac731a610167574f59vikram * When distributing Covered Code, include this CDDL HEADER in each
25e8c5aa2b496d9026e958ac731a610167574f59vikram * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25e8c5aa2b496d9026e958ac731a610167574f59vikram * If applicable, add the following below this CDDL HEADER, with the
25e8c5aa2b496d9026e958ac731a610167574f59vikram * fields enclosed by brackets "[]" replaced with your own identifying
25e8c5aa2b496d9026e958ac731a610167574f59vikram * information: Portions Copyright [yyyy] [name of copyright owner]
25e8c5aa2b496d9026e958ac731a610167574f59vikram *
25e8c5aa2b496d9026e958ac731a610167574f59vikram * CDDL HEADER END
25e8c5aa2b496d9026e958ac731a610167574f59vikram */
25e8c5aa2b496d9026e958ac731a610167574f59vikram/*
25e8c5aa2b496d9026e958ac731a610167574f59vikram * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
25e8c5aa2b496d9026e958ac731a610167574f59vikram * Use is subject to license terms.
25e8c5aa2b496d9026e958ac731a610167574f59vikram */
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram#pragma ident "%Z%%M% %I% %E% SMI"
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <sys/contract/device.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <sys/wait.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <sys/ctfs.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <unistd.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <fcntl.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <errno.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <string.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <limits.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <stdio.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <assert.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <signal.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <libuutil.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <libintl.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <libcontract.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include <libcontract_priv.h>
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include "libcontract_impl.h"
25e8c5aa2b496d9026e958ac731a610167574f59vikram#include "libcontract_priv.h"
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram/*ARGSUSED*/
25e8c5aa2b496d9026e958ac731a610167574f59vikramvoid
25e8c5aa2b496d9026e958ac731a610167574f59vikramevent_device(FILE *file, ct_evthdl_t ev, int verbose)
25e8c5aa2b496d9026e958ac731a610167574f59vikram{
25e8c5aa2b496d9026e958ac731a610167574f59vikram uint_t type;
25e8c5aa2b496d9026e958ac731a610167574f59vikram char *device;
25e8c5aa2b496d9026e958ac731a610167574f59vikram char *s;
25e8c5aa2b496d9026e958ac731a610167574f59vikram ctid_t ctid;
25e8c5aa2b496d9026e958ac731a610167574f59vikram ct_stathdl_t stathdl;
25e8c5aa2b496d9026e958ac731a610167574f59vikram int statfd;
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram type = ct_event_get_type(ev);
25e8c5aa2b496d9026e958ac731a610167574f59vikram ctid = ct_event_get_ctid(ev);
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram statfd = contract_open(ctid, "device", "status", O_RDONLY);
25e8c5aa2b496d9026e958ac731a610167574f59vikram if (statfd == -1) {
25e8c5aa2b496d9026e958ac731a610167574f59vikram (void) fprintf(file, dgettext(TEXT_DOMAIN, "[bad contract]\n"));
25e8c5aa2b496d9026e958ac731a610167574f59vikram return;
25e8c5aa2b496d9026e958ac731a610167574f59vikram }
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram if (ct_status_read(statfd, CTD_ALL, &stathdl) != 0) {
25e8c5aa2b496d9026e958ac731a610167574f59vikram (void) fprintf(file, dgettext(TEXT_DOMAIN, "[status error]\n"));
25e8c5aa2b496d9026e958ac731a610167574f59vikram return;
25e8c5aa2b496d9026e958ac731a610167574f59vikram }
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram if (ct_dev_status_get_minor(stathdl, &device) != 0) {
25e8c5aa2b496d9026e958ac731a610167574f59vikram (void) fprintf(file, dgettext(TEXT_DOMAIN, "[bad status]\n"));
25e8c5aa2b496d9026e958ac731a610167574f59vikram return;
25e8c5aa2b496d9026e958ac731a610167574f59vikram }
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram switch (type) {
25e8c5aa2b496d9026e958ac731a610167574f59vikram case CT_DEV_EV_OFFLINE:
25e8c5aa2b496d9026e958ac731a610167574f59vikram s = dgettext(TEXT_DOMAIN, "device %s offlining\n");
25e8c5aa2b496d9026e958ac731a610167574f59vikram break;
25e8c5aa2b496d9026e958ac731a610167574f59vikram case CT_DEV_EV_DEGRADED:
25e8c5aa2b496d9026e958ac731a610167574f59vikram s = dgettext(TEXT_DOMAIN, "device %s degrading\n");
25e8c5aa2b496d9026e958ac731a610167574f59vikram break;
25e8c5aa2b496d9026e958ac731a610167574f59vikram case CT_DEV_EV_ONLINE:
25e8c5aa2b496d9026e958ac731a610167574f59vikram s = dgettext(TEXT_DOMAIN, "device %s online\n");
25e8c5aa2b496d9026e958ac731a610167574f59vikram break;
25e8c5aa2b496d9026e958ac731a610167574f59vikram case CT_EV_NEGEND:
25e8c5aa2b496d9026e958ac731a610167574f59vikram contract_negend_dump(file, ev);
25e8c5aa2b496d9026e958ac731a610167574f59vikram s = NULL;
25e8c5aa2b496d9026e958ac731a610167574f59vikram break;
25e8c5aa2b496d9026e958ac731a610167574f59vikram default:
25e8c5aa2b496d9026e958ac731a610167574f59vikram s = dgettext(TEXT_DOMAIN, "device %s sent an unknown event\n");
25e8c5aa2b496d9026e958ac731a610167574f59vikram break;
25e8c5aa2b496d9026e958ac731a610167574f59vikram }
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram if (s) {
25e8c5aa2b496d9026e958ac731a610167574f59vikram /*LINTED*/
25e8c5aa2b496d9026e958ac731a610167574f59vikram (void) fprintf(file, s, device);
25e8c5aa2b496d9026e958ac731a610167574f59vikram }
25e8c5aa2b496d9026e958ac731a610167574f59vikram
25e8c5aa2b496d9026e958ac731a610167574f59vikram ct_status_free(stathdl);
25e8c5aa2b496d9026e958ac731a610167574f59vikram (void) close(statfd);
25e8c5aa2b496d9026e958ac731a610167574f59vikram}