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