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) 1993, 1999 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27 #pragma ident "%W% %E% SMI"
28
29 #include <sys/types.h>
30 #include <sys/errno.h>
31 #include <setjmp.h>
32 #include <limits.h>
33 #include <netinet/in.h>
34 #include <string.h>
35
36 #include <rpc/types.h>
37 #include <rpc/rpc.h>
38 #include <rpc/xdr.h>
39 #include <rpc/auth.h>
40 #include <rpc/clnt.h>
41 #include <rpc/rpc_msg.h>
42 #include <fw.h>
43 #include <fw_rpc.h>
44 #include "snoop.h"
45
46 extern char *dlc_header;
47 extern jmp_buf xdr_err;
48
49 static char *procnames_short[] = {
50 "Null", /* 0 */
51 "INVOKE", /* 1 */
52 "MORE", /* 2 */
53 "KILL", /* 3 */
54 };
55
56 static char *procnames_long[] = {
57 "Null procedure", /* 0 */
58 "Invoke operation", /* 1 */
59 "More data", /* 2 */
60 "Kill operation", /* 3 */
61 };
62
63 #define MAXPROC 3
64
65 enum Rec_type {
66 REC_TYPE_NORM = 0,
67 REC_TYPE_EOR = 1,
68 REC_TYPE_EOF = 2
69 };
70 typedef enum Rec_type Rec_type;
71
72 void
interpret_solarnet_fw(int flags,int type,int xid,int vers,int proc,char * data,int len)73 interpret_solarnet_fw(
74 int flags,
75 int type,
76 int xid,
77 int vers,
78 int proc,
79 char *data,
80 int len)
81 {
82 char *line;
83 char buff[CTXTLEN + 1];
84 ulong_t thresh;
85 char op[CTXTLEN + 1];
86 bool_t b;
87 Fw_err e;
88 Rec_type rt;
89 int new_row = 1, row = 0;
90
91 if (proc < 0 || proc > MAXPROC)
92 return;
93
94 if (flags & F_SUM) {
95 if (setjmp(xdr_err)) {
96 return;
97 }
98
99 line = get_sum_line();
100
101 if (type == CALL) {
102 (void) sprintf(line,
103 "SOLARNET C %s",
104 procnames_short[proc]);
105 line += strlen(line);
106
107 switch (proc) {
108 case FW_INVOKE:
109 (void) sprintf(line, " %s",
110 getxdr_string(buff, CTXTLEN));
111 line += strlen(line);
112 (void) sprintf(line, "/%s",
113 getxdr_string(buff, CTXTLEN));
114 line += strlen(line);
115 getxdr_string(buff, CTXTLEN);
116 if (strlen(buff) != 0) {
117 (void) sprintf(line, ".%s", buff);
118 line += strlen(line);
119 }
120 (void) getxdr_string(buff, CTXTLEN);
121 thresh = getxdr_u_long();
122 if (thresh == ULONG_MAX)
123 (void) sprintf(line, " (all)");
124 else
125 (void) sprintf(line, " %lu", thresh);
126 line += strlen(line);
127 (void) getxdr_context(buff, CTXTLEN);
128 break;
129 case FW_MORE:
130 (void) getxdr_context(buff, CTXTLEN);
131 sscanf(buff, "%*s %*s %s.%*s", op);
132 op[strlen(op)-1] = '\0';
133 (void) sprintf(line, " %s", op);
134 line += strlen(line);
135 thresh = getxdr_u_long();
136 if (thresh == ULONG_MAX)
137 (void) sprintf(line, " (all)");
138 else
139 (void) sprintf(line, " %lu", thresh);
140 line += strlen(line);
141 break;
142 case FW_KILL:
143 (void) getxdr_context(buff, CTXTLEN);
144 sscanf(buff, "%*s %*s %s.%*s", op);
145 op[strlen(op)-1] = '\0';
146 (void) sprintf(line, " %s", op);
147 line += strlen(line);
148 break;
149 default:
150 break;
151 }
152
153 check_retransmit(line, xid);
154 } else {
155 (void) sprintf(line, "SOLARNET R %s",
156 procnames_short[proc]);
157 line += strlen(line);
158 b = getxdr_bool();
159 if (b) {
160 e = getxdr_enum();
161 if (e == FW_ERR_FW)
162 sprintf(line, " FW");
163 else if (e == FW_ERR_OP)
164 sprintf(line, " OP");
165 else
166 sprintf(line, " NOERR");
167 line += strlen(line);
168 if (e != FW_ERR_NONE) {
169 sprintf(line, " %lu", getxdr_u_long());
170 line += strlen(line);
171 (void) getxdr_bool();
172 sprintf(line, " %s",
173 getxdr_string(buff, CTXTLEN));
174 line += strlen(line);
175 }
176 } else {
177 sprintf(line, " Success");
178 line += strlen(line);
179 }
180 b = getxdr_bool();
181 if (b) {
182 sprintf(line, " %lu rows", getxdr_u_long());
183 line += strlen(line);
184 } else {
185 sprintf(line, " (No output)");
186 line += strlen(line);
187 }
188 }
189 }
190
191 if ((flags & F_DTAIL)) {
192 show_header("SOLARNET: ", "Solarnet Administration Service",
193 len);
194 show_space();
195 if (setjmp(xdr_err)) {
196 return;
197 }
198 (void) sprintf(get_line(0, 0), "Proc = %d (%s)", proc,
199 procnames_long[proc]);
200 if (type == CALL) {
201 switch (proc) {
202 case FW_INVOKE:
203 (void) showxdr_string(CTXTLEN, "Category: %s");
204 (void) showxdr_string(CTXTLEN, "Operation: %s");
205 (void) showxdr_string(CTXTLEN, "Version: %s");
206 (void) showxdr_string(CTXTLEN, "Locale: %s");
207 (void) showxdr_u_long("Threshold: %lu rows");
208 (void) showxdr_context("Context: %s");
209 b = getxdr_bool();
210 if (!b) {
211 sprintf(get_line(0, 0),
212 "No input arguments");
213 break;
214 }
215 thresh = showxdr_u_long("Input rows = %lu");
216 (void) getxdr_bool();
217 do {
218 rt = getxdr_enum();
219 if (rt == REC_TYPE_NORM) {
220 if (new_row) {
221 sprintf(get_line(0, 0),
222 "Row %d", ++row);
223 new_row = 0;
224 }
225 (void) getxdr_string(buff,
226 CTXTLEN);
227 (void) getxdr_string(op,
228 CTXTLEN);
229 sprintf(get_line(0, 0),
230 "\t%s = %s", buff, op);
231 } else if (rt == REC_TYPE_EOR) {
232 new_row = 1;
233 }
234 } while (rt != REC_TYPE_EOF);
235 break;
236 case FW_MORE:
237 (void) showxdr_context("Context: %s");
238 (void) showxdr_u_long("Threshold: %lu rows");
239 break;
240 case FW_KILL:
241 (void) showxdr_context("Context: %s");
242 break;
243 default:
244 break;
245 }
246 } else {
247 b = getxdr_bool();
248 if (b) {
249 e = getxdr_enum();
250 if (e == FW_ERR_FW) {
251 showxdr_u_long(
252 "Framework error code %lu");
253 } else if (e == FW_ERR_OP) {
254 showxdr_u_long(
255 "Operation error code %lu");
256 } else {
257 showxdr_u_long("No error %*lu");
258 }
259 (void) getxdr_bool();
260 (void) getxdr_string(buff, CTXTLEN);
261 if (e != FW_ERR_NONE) {
262 sprintf(get_line(0, 0),
263 "Error message: %s", buff);
264 } else {
265 }
266 } else {
267 sprintf(get_line(0, 0),
268 "Operation was successful");
269 }
270 b = getxdr_bool();
271 if (b) {
272 showxdr_u_long("Output rows: %lu");
273 (void) getxdr_bool();
274 do {
275 rt = getxdr_enum();
276 if (rt == REC_TYPE_NORM) {
277 if (new_row) {
278 sprintf(get_line(0, 0),
279 "Row %d", ++row);
280 new_row = 0;
281 }
282 (void) getxdr_string(buff,
283 CTXTLEN);
284 (void) getxdr_string(op,
285 CTXTLEN);
286 sprintf(get_line(0, 0),
287 "\t%s = %s", buff, op);
288 } else if (rt == REC_TYPE_EOR) {
289 new_row = 1;
290 }
291 } while (rt != REC_TYPE_EOF);
292 } else {
293 sprintf(get_line(0, 0), "No output");
294 }
295 }
296 show_trailer();
297 }
298
299 }
300