Home | History | Annotate | Download | only in dsstat
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #include <stdio.h>
     27 #include <unistd.h>
     28 #include <errno.h>
     29 
     30 #include <kstat.h>
     31 
     32 #include "ii_stats.h"
     33 #include "sdbc_stats.h"
     34 #include "sndr_stats.h"
     35 
     36 #include "multi_stats.h"
     37 
     38 #include "dsstat.h"
     39 #include "common.h"
     40 #include "report.h"
     41 
     42 /*
     43  * do_stats() - called by main() to start monitoring
     44  *
     45  */
     46 int
     47 do_stats()
     48 {
     49 	int error;
     50 	int pass;
     51 
     52 	/* Collection/reporting loop */
     53 	for (pass = 0; ; pass++) { /* CSTYLED */
     54 		if (iterations != -1 && pass >= iterations)
     55 			return (0);
     56 
     57 		error = discover();
     58 
     59 		if (error == ENOMEM || error == EINVAL)
     60 			return (error);
     61 
     62 		if (error == EAGAIN && pass == 0)
     63 			return (error);
     64 
     65 		(void) sleep(interval);
     66 
     67 		if ((error = update()) != 0)
     68 			return (error);
     69 
     70 		if (report())
     71 			break;
     72 	}
     73 
     74 	/* No stats on this system */
     75 	return (EAGAIN);
     76 }
     77 
     78 int
     79 discover()
     80 {
     81 	int err = 0;
     82 
     83 	int sdbc_err = 0;
     84 	int sndr_err = 0;
     85 	int ii_err = 0;
     86 
     87 	kstat_ctl_t *kc;
     88 
     89 	if ((kc = kstat_open()) == NULL)
     90 		return (ENOMEM);
     91 
     92 	if (mode & SDBC) {
     93 	    sdbc_err = sdbc_discover(kc);
     94 	    err = sdbc_err;
     95 	    if (sdbc_err && !(mode & MULTI))
     96 		goto fail;
     97 	    if (sdbc_err && (mode & MULTI) && sdbc_err != EAGAIN)
     98 		goto fail;
     99 	}
    100 
    101 	if (mode & SNDR) {
    102 	    sndr_err = sndr_discover(kc);
    103 	    err = sndr_err;
    104 	    if (sndr_err && !(mode & MULTI))
    105 		goto fail;
    106 	    if (sndr_err && (mode & MULTI) && sndr_err != EAGAIN)
    107 		goto fail;
    108 	}
    109 
    110 	if (mode & IIMG) {
    111 	    ii_err = ii_discover(kc);
    112 	    err = ii_err;
    113 	    if (ii_err && !(mode & MULTI))
    114 		goto fail;
    115 	    if (ii_err && ii_err != EAGAIN && (mode & MULTI))
    116 		goto fail;
    117 	}
    118 
    119 	(void) kstat_close(kc);
    120 	if (sdbc_err && sndr_err && ii_err)
    121 	    return (err);
    122 	else
    123 	    return (0);
    124 
    125 fail:
    126 	(void) kstat_close(kc);
    127 	return (err);
    128 }
    129 
    130 int
    131 update()
    132 {
    133 	int err = 0;
    134 
    135 	int sdbc_err = 0;
    136 	int sndr_err = 0;
    137 	int ii_err = 0;
    138 
    139 	kstat_ctl_t *kc;
    140 
    141 	if ((kc = kstat_open()) == NULL)
    142 		goto fail;
    143 
    144 	if (mode & SDBC) {
    145 		sdbc_err = sdbc_update(kc);
    146 		err = sdbc_err;
    147 		if (sdbc_err && !(mode & MULTI))
    148 			goto fail;
    149 		if (sdbc_err && (mode & MULTI) && sdbc_err != EAGAIN)
    150 			goto fail;
    151 	}
    152 
    153 	if (mode & SNDR) {
    154 		sndr_err = sndr_update(kc);
    155 		err = sndr_err;
    156 		if (sndr_err && !(mode & MULTI))
    157 			goto fail;
    158 		if (sndr_err && (mode & MULTI) && sndr_err != EAGAIN)
    159 			goto fail;
    160 	}
    161 
    162 	if (mode & IIMG) {
    163 		ii_err = ii_update(kc);
    164 		err = ii_err;
    165 		if (ii_err && !(mode & MULTI))
    166 			goto fail;
    167 		if (ii_err && (mode & MULTI) && ii_err != EAGAIN)
    168 			goto fail;
    169 	}
    170 
    171 	(void) kstat_close(kc);
    172 	if (sdbc_err && sndr_err && ii_err)
    173 	    return (err);
    174 	else
    175 	    return (0);
    176 
    177 fail:
    178 	(void) kstat_close(kc);
    179 	return (err);
    180 }
    181 
    182 int
    183 report()
    184 {
    185 	int err = 0;
    186 
    187 	int sdbc_err = 0;
    188 	int sndr_err = 0;
    189 	int ii_err = 0;
    190 
    191 	hflags &= (HEADERS_EXL | HEADERS_ATT | HEADERS_BOR);
    192 
    193 	if (mode & SNDR)
    194 		if (sndr_err = sndr_report())
    195 		    err = sndr_err;
    196 
    197 	if (mode & IIMG)
    198 		if (ii_err = ii_report())
    199 		    err = ii_err;
    200 
    201 	if ((mode & SDBC) && !(mode & MULTI))
    202 		if (sdbc_err = sdbc_report())
    203 		    err = sdbc_err;
    204 
    205 	return (err);
    206 }
    207