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 
41 extern char *dlc_header;
42 extern jmp_buf xdr_err;
43 
44 void detail_stats();		/* Version 1 */
45 void detail_statsswtch();	/* Version 2 */
46 void detail_statstime();	/* Version 3 */
47 void detail_statsvar();		/* Version 4 */
48 
49 static char *procnames_short[] = {
50 	"Null",			/*  0 */
51 	"Get Statistics",	/*  1 */
52 	"Have Disk",		/*  2 */
53 };
54 
55 static char *procnames_long[] = {
56 	"Null procedure",		/*  0 */
57 	"Get Statistics",		/*  1 */
58 	"Have Disk",			/*  2 */
59 };
60 
61 #define	MAXPROC	2
62 
63 void
interpret_rstat(flags,type,xid,vers,proc,data,len)64 interpret_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 
131 void
detail_stats()132 detail_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 
160 void
detail_statsswtch()161 detail_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 
196 void
detail_statstime()197 detail_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 
233 void
detail_statsvar()234 detail_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