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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright (c) 1991, 1999 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27#ident	"%Z%%M%	%I%	%E% SMI"	/* SunOS	*/
28
29#include <sys/types.h>
30#include <sys/errno.h>
31#include <setjmp.h>
32#include <sys/tiuser.h>
33
34#include <rpc/types.h>
35#include <rpc/xdr.h>
36#include <rpc/auth.h>
37#include <rpc/clnt.h>
38#include <rpc/rpc_msg.h>
39#include "snoop.h"
40
41extern char *dlc_header;
42extern jmp_buf xdr_err;
43
44void detail_stats();		/* Version 1 */
45void detail_statsswtch();	/* Version 2 */
46void detail_statstime();	/* Version 3 */
47void detail_statsvar();		/* Version 4 */
48
49static char *procnames_short[] = {
50	"Null",			/*  0 */
51	"Get Statistics",	/*  1 */
52	"Have Disk",		/*  2 */
53};
54
55static char *procnames_long[] = {
56	"Null procedure",		/*  0 */
57	"Get Statistics",		/*  1 */
58	"Have Disk",			/*  2 */
59};
60
61#define	MAXPROC	2
62
63void
64interpret_rstat(flags, type, xid, vers, proc, data, len)
65	int flags, type, xid, vers, proc;
66	char *data;
67	int len;
68{
69	char *line;
70
71	if (proc < 0 || proc > MAXPROC)
72		return;
73
74	if (flags & F_SUM) {
75		if (setjmp(xdr_err)) {
76			return;
77		}
78
79		line = get_sum_line();
80
81		if (type == CALL) {
82			(void) sprintf(line,
83				"RSTAT C %s",
84				procnames_short[proc]);
85
86			check_retransmit(line, xid);
87		} else {
88			(void) sprintf(line, "RSTAT R %s ",
89				procnames_short[proc]);
90		}
91	}
92
93	if (flags & F_DTAIL) {
94		show_header("RSTAT:  ", "RSTAT Get Statistics", len);
95		show_space();
96		if (setjmp(xdr_err)) {
97			return;
98		}
99		(void) sprintf(get_line(0, 0),
100			"Proc = %d (%s)",
101			proc, procnames_long[proc]);
102
103		if (type == REPLY) {
104			switch (proc) {
105			case 1:
106				switch (vers) {
107				case 1:
108					detail_stats();
109					break;
110				case 2:
111					detail_statsswtch();
112					break;
113				case 3:
114					detail_statstime();
115					break;
116				case 4:
117					detail_statsvar();
118					break;
119				}
120				break;
121			case 2:
122				(void) showxdr_u_long(
123					"Result = %lu");
124				break;
125			}
126		}
127		show_trailer();
128	}
129}
130
131void
132detail_stats()
133{
134	show_space();
135	(void) sprintf(get_line(0, 0), "CPU Times:");
136	(void) showxdr_long("  Time (1)       = %d");
137	(void) showxdr_long("  Time (2)       = %d");
138	(void) showxdr_long("  Time (3)       = %d");
139	(void) showxdr_long("  Time (4)       = %d");
140	show_space();
141	(void) sprintf(get_line(0, 0), "Disk Transfers:");
142	(void) showxdr_long("  Transfers(1)   = %d");
143	(void) showxdr_long("  Transfers(2)   = %d");
144	(void) showxdr_long("  Transfers(3)   = %d");
145	(void) showxdr_long("  Transfers(4)   = %d");
146	show_space();
147	(void) showxdr_u_long("Pages in         = %lu");
148	(void) showxdr_u_long("Pages out        = %lu");
149	(void) showxdr_u_long("Swaps in         = %lu");
150	(void) showxdr_u_long("Swaps out        = %lu");
151	(void) showxdr_u_long("Interrupts       = %lu");
152	show_space();
153	(void) showxdr_long("Receive packets  = %d");
154	(void) showxdr_long("Receive errors   = %d");
155	(void) showxdr_long("Transmit packets = %d");
156	(void) showxdr_long("Transmit errors  = %d");
157	(void) showxdr_long("Collisions       = %d");
158}
159
160void
161detail_statsswtch()
162{
163	show_space();
164	(void) sprintf(get_line(0, 0), "CPU Times:");
165	(void) showxdr_long("  Time (1)       = %d");
166	(void) showxdr_long("  Time (2)       = %d");
167	(void) showxdr_long("  Time (3)       = %d");
168	(void) showxdr_long("  Time (4)       = %d");
169	show_space();
170	(void) sprintf(get_line(0, 0), "Disk Transfers:");
171	(void) showxdr_long("  Transfers(1)   = %d");
172	(void) showxdr_long("  Transfers(2)   = %d");
173	(void) showxdr_long("  Transfers(3)   = %d");
174	(void) showxdr_long("  Transfers(4)   = %d");
175	show_space();
176	(void) showxdr_u_long("Pages in         = %lu");
177	(void) showxdr_u_long("Pages out        = %lu");
178	(void) showxdr_u_long("Swaps in         = %lu");
179	(void) showxdr_u_long("Swaps out        = %lu");
180	(void) showxdr_u_long("Interrupts       = %lu");
181	show_space();
182	(void) showxdr_long("Receive packets  = %d");
183	(void) showxdr_long("Receive errors   = %d");
184	(void) showxdr_long("Transmit packets = %d");
185	(void) showxdr_long("Transmit errors  = %d");
186	(void) showxdr_long("Collisions       = %d");
187	show_space();
188	(void) showxdr_u_long("V switch         = %lu");
189	(void) showxdr_long("Average run 0    = %d");
190	(void) showxdr_long("Average run 1    = %d");
191	(void) showxdr_long("Average run 2    = %d");
192	show_space();
193	(void) showxdr_date("Boot time:       = %s");
194}
195
196void
197detail_statstime()
198{
199	show_space();
200	(void) sprintf(get_line(0, 0), "CPU Times:");
201	(void) showxdr_long("  Time (1)     = %d");
202	(void) showxdr_long("  Time (2)     = %d");
203	(void) showxdr_long("  Time (3)     = %d");
204	(void) showxdr_long("  Time (4)     = %d");
205	show_space();
206	(void) sprintf(get_line(0, 0), "Disk Transfers:");
207	(void) showxdr_long("  Transfers(1)   = %d");
208	(void) showxdr_long("  Transfers(2)   = %d");
209	(void) showxdr_long("  Transfers(3)   = %d");
210	(void) showxdr_long("  Transfers(4)   = %d");
211	show_space();
212	(void) showxdr_u_long("Pages in         = %lu");
213	(void) showxdr_u_long("Pages out        = %lu");
214	(void) showxdr_u_long("Swaps in         = %lu");
215	(void) showxdr_u_long("Swaps out        = %lu");
216	(void) showxdr_u_long("Interrupts       = %lu");
217	show_space();
218	(void) showxdr_long("Receive packets  = %d");
219	(void) showxdr_long("Receive errors   = %d");
220	(void) showxdr_long("Transmit packets = %d");
221	(void) showxdr_long("Transmit errors  = %d");
222	(void) showxdr_long("Collisions       = %d");
223	show_space();
224	(void) showxdr_u_long("V switch         = %lu");
225	(void) showxdr_long("Average run 0    = %d");
226	(void) showxdr_long("Average run 1    = %d");
227	(void) showxdr_long("Average run 2    = %d");
228	show_space();
229	(void) showxdr_date("Boot time:       = %s");
230	(void) showxdr_date("Current time     = %s");
231}
232
233void
234detail_statsvar()
235{
236	int i, n;
237
238	show_space();
239	(void) sprintf(get_line(0, 0), "CPU Times:");
240	n = getxdr_u_long();
241	for (i = 1; i <= n; i++) {
242		(void) sprintf(get_line(0, 0),
243			"  Time (%2d)      = %d", i, getxdr_long());
244	}
245	show_space();
246	(void) sprintf(get_line(0, 0), "Disk Transfers:");
247	n = getxdr_u_long();
248	for (i = 1; i <= n; i++) {
249		(void) sprintf(get_line(0, 0),
250			"  Transfers (%2d) = %d", i, getxdr_long());
251	}
252	show_space();
253	(void) showxdr_u_long("Pages in         = %lu");
254	(void) showxdr_u_long("Pages out        = %lu");
255	(void) showxdr_u_long("Swaps in         = %lu");
256	(void) showxdr_u_long("Swaps out        = %lu");
257	(void) showxdr_u_long("Interrupts       = %lu");
258	show_space();
259	(void) showxdr_long("Receive packets  = %d");
260	(void) showxdr_long("Receive errors   = %d");
261	(void) showxdr_long("Transmit packets = %d");
262	(void) showxdr_long("Transmit errors  = %d");
263	(void) showxdr_long("Collisions       = %d");
264	show_space();
265	(void) showxdr_u_long("V switch         = %lu");
266	(void) showxdr_long("Average run 0    = %d");
267	(void) showxdr_long("Average run 1    = %d");
268	(void) showxdr_long("Average run 2    = %d");
269	show_space();
270	(void) showxdr_date("Boot time:       = %s");
271	(void) showxdr_date("Current time     = %s");
272}
273