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) 1991, 1999 by Sun Microsystems, Inc. 24 0 stevel * All rights reserved. 25 0 stevel */ 26 0 stevel 27 0 stevel #ident "%Z%%M% %I% %E% SMI" /* SunOS */ 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 <sys/tiuser.h> 33 0 stevel #include <string.h> 34 0 stevel 35 0 stevel #include <rpc/types.h> 36 0 stevel #include <rpc/xdr.h> 37 0 stevel #include <rpc/auth.h> 38 0 stevel #include <rpc/clnt.h> 39 0 stevel #include <rpc/rpc_msg.h> 40 0 stevel #include <rpc/pmap_prot.h> 41 0 stevel #include "snoop.h" 42 0 stevel 43 0 stevel /* 44 0 stevel * Number of bytes to display from a string (address, netid, etc.). 45 0 stevel */ 46 0 stevel #define MAXSTRINGLEN 64 47 0 stevel 48 0 stevel extern char *dlc_header; 49 0 stevel extern jmp_buf xdr_err; 50 0 stevel 51 0 stevel static void interpret_pmap_2(int, int, int, int, int, char *, int); 52 0 stevel static void interpret_pmap_4(int, int, int, int, int, char *, int); 53 0 stevel static void stash_callit(ulong_t, int, int, int, int); 54 0 stevel 55 0 stevel void 56 0 stevel interpret_pmap(flags, type, xid, vers, proc, data, len) 57 0 stevel int flags, type, xid, vers, proc; 58 0 stevel char *data; 59 0 stevel int len; 60 0 stevel { 61 0 stevel switch (vers) { 62 0 stevel case 2: interpret_pmap_2(flags, type, xid, vers, proc, data, len); 63 0 stevel break; 64 0 stevel 65 0 stevel /* Version 3 is a subset of version 4 */ 66 0 stevel case 3: 67 0 stevel case 4: interpret_pmap_4(flags, type, xid, vers, proc, data, len); 68 0 stevel break; 69 0 stevel } 70 0 stevel } 71 0 stevel 72 0 stevel void show_pmap(); 73 0 stevel char *sum_pmaplist(); 74 0 stevel void show_pmaplist(); 75 0 stevel 76 0 stevel static char *procnames_short_2[] = { 77 0 stevel "Null", /* 0 */ 78 0 stevel "SET", /* 1 */ 79 0 stevel "UNSET", /* 2 */ 80 0 stevel "GETPORT", /* 3 */ 81 0 stevel "DUMP", /* 4 */ 82 0 stevel "CALLIT", /* 5 */ 83 0 stevel }; 84 0 stevel 85 0 stevel static char *procnames_long_2[] = { 86 0 stevel "Null procedure", /* 0 */ 87 0 stevel "Set port", /* 1 */ 88 0 stevel "Unset port", /* 2 */ 89 0 stevel "Get port number", /* 3 */ 90 0 stevel "Dump the mappings", /* 4 */ 91 0 stevel "Indirect call", /* 5 */ 92 0 stevel }; 93 0 stevel 94 0 stevel #define MAXPROC_2 5 95 0 stevel 96 0 stevel void 97 0 stevel interpret_pmap_2(flags, type, xid, vers, proc, data, len) 98 0 stevel int flags, type, xid, vers, proc; 99 0 stevel char *data; 100 0 stevel int len; 101 0 stevel { 102 0 stevel char *line; 103 0 stevel unsigned port, proto; 104 0 stevel unsigned iprog, ivers, iproc, ilen; 105 0 stevel extern int pi_frame; 106 0 stevel struct cache_struct *x, *find_callit(); 107 0 stevel int trailer_done = 0; 108 0 stevel 109 0 stevel if (proc < 0 || proc > MAXPROC_2) 110 0 stevel return; 111 0 stevel 112 0 stevel if (proc == PMAPPROC_CALLIT) { 113 0 stevel if (type == CALL) { 114 0 stevel iprog = getxdr_u_long(); 115 0 stevel ivers = getxdr_u_long(); 116 0 stevel iproc = getxdr_u_long(); 117 0 stevel stash_callit(xid, pi_frame, 118 0 stevel iprog, ivers, iproc); 119 0 stevel } else { 120 0 stevel x = find_callit(xid); 121 0 stevel } 122 0 stevel } 123 0 stevel 124 0 stevel if (flags & F_SUM) { 125 0 stevel if (setjmp(xdr_err)) { 126 0 stevel return; 127 0 stevel } 128 0 stevel 129 0 stevel line = get_sum_line(); 130 0 stevel 131 0 stevel if (type == CALL) { 132 0 stevel (void) sprintf(line, 133 0 stevel "PORTMAP C %s", 134 0 stevel procnames_short_2[proc]); 135 0 stevel line += strlen(line); 136 0 stevel switch (proc) { 137 0 stevel case PMAPPROC_GETPORT: 138 0 stevel iprog = getxdr_u_long(); 139 0 stevel ivers = getxdr_u_long(); 140 0 stevel proto = getxdr_u_long(); 141 0 stevel (void) sprintf(line, 142 0 stevel " prog=%d (%s) vers=%d proto=%s", 143 0 stevel iprog, nameof_prog(iprog), 144 0 stevel ivers, 145 0 stevel getproto(proto)); 146 0 stevel break; 147 0 stevel case PMAPPROC_CALLIT: 148 0 stevel (void) getxdr_u_long(); /* length */ 149 0 stevel (void) sprintf(line, 150 0 stevel " prog=%s vers=%d proc=%d", 151 0 stevel nameof_prog(iprog), 152 0 stevel ivers, iproc); 153 0 stevel data += 16; /* prog+ver+proc+len */ 154 0 stevel len -= 16; 155 0 stevel protoprint(flags, type, xid, 156 0 stevel iprog, ivers, iproc, 157 0 stevel data, len); 158 0 stevel break; 159 0 stevel default: 160 0 stevel break; 161 0 stevel } 162 0 stevel check_retransmit(line, xid); 163 0 stevel } else { 164 0 stevel (void) sprintf(line, "PORTMAP R %s ", 165 0 stevel procnames_short_2[proc]); 166 0 stevel line += strlen(line); 167 0 stevel switch (proc) { 168 0 stevel case PMAPPROC_GETPORT: 169 0 stevel port = getxdr_u_long(); 170 0 stevel (void) sprintf(line, "port=%d", 171 0 stevel port); 172 0 stevel break; 173 0 stevel case PMAPPROC_DUMP: 174 0 stevel (void) sprintf(line, "%s", 175 0 stevel sum_pmaplist()); 176 0 stevel break; 177 0 stevel case PMAPPROC_CALLIT: 178 0 stevel port = getxdr_u_long(); 179 0 stevel ilen = getxdr_u_long(); 180 0 stevel (void) sprintf(line, "port=%d len=%d", 181 0 stevel port, ilen); 182 0 stevel if (x != NULL) { 183 0 stevel protoprint(flags, type, xid, 184 0 stevel x->xid_prog, 185 0 stevel x->xid_vers, 186 0 stevel x->xid_proc, 187 0 stevel data, len); 188 0 stevel } 189 0 stevel break; 190 0 stevel default: 191 0 stevel break; 192 0 stevel } 193 0 stevel } 194 0 stevel } 195 0 stevel 196 0 stevel if (flags & F_DTAIL) { 197 0 stevel show_header("PMAP: ", "Portmapper", len); 198 0 stevel show_space(); 199 0 stevel if (setjmp(xdr_err)) { 200 0 stevel return; 201 0 stevel } 202 0 stevel (void) sprintf(get_line(0, 0), 203 0 stevel "Proc = %d (%s)", 204 0 stevel proc, procnames_long_2[proc]); 205 0 stevel if (type == CALL) { 206 0 stevel switch (proc) { 207 0 stevel case PMAPPROC_NULL: 208 0 stevel case PMAPPROC_SET: 209 0 stevel case PMAPPROC_UNSET: 210 0 stevel break; 211 0 stevel case PMAPPROC_GETPORT: 212 0 stevel iprog = getxdr_u_long(); 213 0 stevel (void) sprintf(get_line(0, 0), 214 0 stevel "Program = %d (%s)", 215 0 stevel iprog, nameof_prog(iprog)); 216 0 stevel (void) showxdr_u_long("Version = %d"); 217 0 stevel proto = getxdr_u_long(); 218 0 stevel (void) sprintf(get_line(0, 0), 219 0 stevel "Protocol = %d (%s)", 220 0 stevel proto, getproto(proto)); 221 0 stevel break; 222 0 stevel case PMAPPROC_DUMP: 223 0 stevel break; 224 0 stevel case PMAPPROC_CALLIT: 225 0 stevel (void) sprintf(get_line(0, 0), 226 0 stevel "Program = %d (%s)", 227 0 stevel iprog, nameof_prog(iprog)); 228 0 stevel (void) sprintf(get_line(0, 0), 229 0 stevel "Version = %d", ivers); 230 0 stevel (void) sprintf(get_line(0, 0), 231 0 stevel "Proc = %d", iproc); 232 0 stevel (void) showxdr_u_long( 233 0 stevel "Callit data = %d bytes"); 234 0 stevel show_trailer(); 235 0 stevel trailer_done = 1; 236 0 stevel data += 16; /* prog+ver+proc+len */ 237 0 stevel len -= 16; 238 0 stevel protoprint(flags, type, xid, 239 0 stevel iprog, ivers, iproc, 240 0 stevel data, len); 241 0 stevel break; 242 0 stevel } 243 0 stevel } else { 244 0 stevel switch (proc) { 245 0 stevel case PMAPPROC_NULL: 246 0 stevel case PMAPPROC_SET: 247 0 stevel case PMAPPROC_UNSET: 248 0 stevel break; 249 0 stevel case PMAPPROC_GETPORT: 250 0 stevel (void) showxdr_u_long("Port = %d"); 251 0 stevel break; 252 0 stevel case PMAPPROC_DUMP: 253 0 stevel show_pmaplist(); 254 0 stevel break; 255 0 stevel case PMAPPROC_CALLIT: 256 0 stevel (void) showxdr_u_long("Port = %d"); 257 0 stevel (void) showxdr_u_long("Length = %d bytes"); 258 0 stevel show_trailer(); 259 0 stevel trailer_done = 1; 260 0 stevel if (x != NULL) { 261 0 stevel protoprint(flags, type, xid, 262 0 stevel x->xid_prog, 263 0 stevel x->xid_vers, 264 0 stevel x->xid_proc, 265 0 stevel data, len); 266 0 stevel } 267 0 stevel break; 268 0 stevel } 269 0 stevel } 270 0 stevel if (!trailer_done) 271 0 stevel show_trailer(); 272 0 stevel } 273 0 stevel } 274 0 stevel 275 0 stevel char * 276 0 stevel sum_pmaplist() 277 0 stevel { 278 0 stevel int maps = 0; 279 0 stevel static char buff[16]; 280 0 stevel 281 0 stevel if (setjmp(xdr_err)) { 282 0 stevel (void) sprintf(buff, "%d+ map(s) found", maps); 283 0 stevel return (buff); 284 0 stevel } 285 0 stevel 286 0 stevel while (getxdr_u_long()) { 287 0 stevel (void) getxdr_u_long(); /* program */ 288 0 stevel (void) getxdr_u_long(); /* version */ 289 0 stevel (void) getxdr_u_long(); /* protocol */ 290 0 stevel (void) getxdr_u_long(); /* port */ 291 0 stevel maps++; 292 0 stevel } 293 0 stevel 294 0 stevel (void) sprintf(buff, "%d map(s) found", maps); 295 0 stevel return (buff); 296 0 stevel } 297 0 stevel 298 0 stevel void 299 0 stevel show_pmaplist() 300 0 stevel { 301 0 stevel unsigned prog, vers, proto, port; 302 0 stevel int maps = 0; 303 0 stevel 304 0 stevel if (setjmp(xdr_err)) { 305 0 stevel (void) sprintf(get_line(0, 0), 306 0 stevel " %d+ maps. (Frame is incomplete)", 307 0 stevel maps); 308 0 stevel return; 309 0 stevel } 310 0 stevel 311 0 stevel (void) sprintf(get_line(0, 0), 312 0 stevel " Program Version Protocol Port"); 313 0 stevel 314 0 stevel while (getxdr_u_long()) { 315 0 stevel prog = getxdr_u_long(); 316 0 stevel vers = getxdr_u_long(); 317 0 stevel proto = getxdr_u_long(); 318 0 stevel port = getxdr_u_long(); 319 0 stevel (void) sprintf(get_line(0, 0), 320 0 stevel "%8d%8d%9d%7d %s", 321 0 stevel prog, vers, proto, port, nameof_prog(prog)); 322 0 stevel maps++; 323 0 stevel } 324 0 stevel 325 0 stevel (void) sprintf(get_line(0, 0), " %d maps", maps); 326 0 stevel } 327 0 stevel 328 0 stevel /* 329 0 stevel * ****************************************** 330 0 stevel */ 331 0 stevel char *sum_rpcblist(); 332 0 stevel void show_rpcblist(); 333 0 stevel char *sum_rpcb_entry_list(); 334 0 stevel void show_rpcb_entry_list(); 335 0 stevel 336 0 stevel static char *procnames_short_4[] = { 337 0 stevel /* 338 0 stevel * version 3 and 4 procs 339 0 stevel */ 340 0 stevel "Null", /* 0 */ 341 0 stevel "SET", /* 1 */ 342 0 stevel "UNSET", /* 2 */ 343 0 stevel "GETADDR", /* 3 */ 344 0 stevel "DUMP", /* 4 */ 345 0 stevel "BCAST", /* 5 */ 346 0 stevel "GETTIME", /* 6 */ 347 0 stevel "UADDR2TADDR", /* 7 */ 348 0 stevel "TADDR2UADDR", /* 8 */ 349 0 stevel /* 350 0 stevel * version 4 procs only 351 0 stevel */ 352 0 stevel "GETVERSADDR", /* 9 */ 353 0 stevel "INDIRECT", /* 10 */ 354 0 stevel "GETADDRLIST", /* 11 */ 355 0 stevel "GETSTAT", /* 12 */ 356 0 stevel }; 357 0 stevel 358 0 stevel static char *procnames_long_4[] = { 359 0 stevel /* 360 0 stevel * version 3 and 4 procs 361 0 stevel */ 362 0 stevel "Null procedure", /* 0 */ 363 0 stevel "Set address", /* 1 */ 364 0 stevel "Unset address", /* 2 */ 365 0 stevel "Get address", /* 3 */ 366 0 stevel "Dump the mappings", /* 4 */ 367 0 stevel "Broadcast call (no error)", /* 5 */ 368 0 stevel "Get the time", /* 6 */ 369 0 stevel "Universal to transport address", /* 7 */ 370 0 stevel "Transport to universal address", /* 8 */ 371 0 stevel /* 372 0 stevel * version 4 procs only 373 0 stevel */ 374 0 stevel "Get address of specific version", /* 9 */ 375 0 stevel "Indirect call (return error)", /* 10 */ 376 0 stevel "Return addresses of prog/vers", /* 11 */ 377 0 stevel "Get statistics", /* 12 */ 378 0 stevel }; 379 0 stevel 380 0 stevel #define MAXPROC_4 12 381 0 stevel #define RPCBPROC_NULL 0 382 0 stevel 383 0 stevel void 384 0 stevel interpret_pmap_4(flags, type, xid, vers, proc, data, len) 385 0 stevel int flags, type, xid, vers, proc; 386 0 stevel char *data; 387 0 stevel int len; 388 0 stevel { 389 0 stevel char *line; 390 0 stevel unsigned prog, ver; 391 0 stevel char buff1[MAXSTRINGLEN + 1]; 392 0 stevel int iprog, ivers, iproc, ilen; 393 0 stevel extern int pi_frame; 394 0 stevel struct cache_struct *x, *find_callit(); 395 0 stevel int trailer_done = 0; 396 0 stevel 397 0 stevel if (proc < 0 || proc > MAXPROC_4) 398 0 stevel return; 399 0 stevel 400 0 stevel if (proc == RPCBPROC_BCAST) { 401 0 stevel if (type == CALL) { 402 0 stevel iprog = getxdr_u_long(); 403 0 stevel ivers = getxdr_u_long(); 404 0 stevel iproc = getxdr_u_long(); 405 0 stevel stash_callit(xid, pi_frame, 406 0 stevel iprog, ivers, iproc); 407 0 stevel } else { 408 0 stevel x = find_callit(xid); 409 0 stevel } 410 0 stevel } 411 0 stevel 412 0 stevel if (flags & F_SUM) { 413 0 stevel if (setjmp(xdr_err)) { 414 0 stevel return; 415 0 stevel } 416 0 stevel 417 0 stevel line = get_sum_line(); 418 0 stevel 419 0 stevel if (type == CALL) { 420 0 stevel (void) sprintf(line, 421 0 stevel "RPCBIND C %s", 422 0 stevel procnames_short_4[proc]); 423 0 stevel line += strlen(line); 424 0 stevel switch (proc) { 425 0 stevel case RPCBPROC_SET: 426 0 stevel case RPCBPROC_UNSET: 427 0 stevel case RPCBPROC_GETADDR: 428 0 stevel case RPCBPROC_GETVERSADDR: 429 0 stevel case RPCBPROC_GETADDRLIST: 430 0 stevel prog = getxdr_u_long(); 431 0 stevel ver = getxdr_u_long(); 432 0 stevel (void) sprintf(line, 433 0 stevel " prog=%d (%s) vers=%d", 434 0 stevel prog, nameof_prog(prog), 435 0 stevel ver); 436 0 stevel break; 437 0 stevel case RPCBPROC_BCAST: 438 0 stevel case RPCBPROC_INDIRECT: 439 0 stevel (void) getxdr_u_long(); /* length */ 440 0 stevel (void) sprintf(line, 441 0 stevel " prog=%s vers=%d proc=%d", 442 0 stevel nameof_prog(iprog), 443 0 stevel ivers, iproc); 444 0 stevel data += 16; /* prog+ver+proc+len */ 445 0 stevel len -= 16; 446 0 stevel protoprint(flags, type, xid, 447 0 stevel iprog, ivers, iproc, 448 0 stevel data, len); 449 0 stevel break; 450 0 stevel default: 451 0 stevel break; 452 0 stevel } 453 0 stevel 454 0 stevel check_retransmit(line, xid); 455 0 stevel } else { 456 0 stevel (void) sprintf(line, "RPCBIND R %s ", 457 0 stevel procnames_short_4[proc]); 458 0 stevel line += strlen(line); 459 0 stevel switch (proc) { 460 0 stevel case RPCBPROC_GETADDR: 461 0 stevel case RPCBPROC_TADDR2UADDR: 462 0 stevel case RPCBPROC_GETVERSADDR: 463 0 stevel (void) getxdr_string(buff1, MAXSTRINGLEN); 464 0 stevel (void) sprintf(line, 465 0 stevel " Uaddr=%s", 466 0 stevel buff1); 467 0 stevel break; 468 0 stevel case RPCBPROC_BCAST: 469 0 stevel case RPCBPROC_INDIRECT: 470 0 stevel (void) getxdr_string(buff1, MAXSTRINGLEN); 471 0 stevel ilen = getxdr_u_long(); 472 0 stevel (void) sprintf(line, "Uaddr=%s len=%d", 473 0 stevel buff1, ilen); 474 0 stevel data += 16; /* prog+ver+proc+len */ 475 0 stevel len -= 16; 476 0 stevel if (x != NULL) { 477 0 stevel protoprint(flags, type, xid, 478 0 stevel x->xid_prog, 479 0 stevel x->xid_vers, 480 0 stevel x->xid_proc, 481 0 stevel data, len); 482 0 stevel } 483 0 stevel break; 484 0 stevel case RPCBPROC_DUMP: 485 0 stevel (void) sprintf(line, "%s", 486 0 stevel sum_rpcblist()); 487 0 stevel break; 488 0 stevel case RPCBPROC_GETTIME: 489 0 stevel (void) sprintf(line, "%s", 490 0 stevel getxdr_date()); 491 0 stevel break; 492 0 stevel case RPCBPROC_GETADDRLIST: 493 0 stevel (void) sprintf(line, "%s", 494 0 stevel sum_rpcb_entry_list()); 495 0 stevel break; 496 0 stevel default: 497 0 stevel break; 498 0 stevel } 499 0 stevel } 500 0 stevel } 501 0 stevel 502 0 stevel if (flags & F_DTAIL) { 503 0 stevel show_header("RPCB: ", "RPC Bind", len); 504 0 stevel show_space(); 505 0 stevel if (setjmp(xdr_err)) { 506 0 stevel return; 507 0 stevel } 508 0 stevel (void) sprintf(get_line(0, 0), 509 0 stevel "Proc = %d (%s)", 510 0 stevel proc, procnames_long_4[proc]); 511 0 stevel if (type == CALL) { 512 0 stevel switch (proc) { 513 0 stevel case RPCBPROC_NULL: 514 0 stevel break; 515 0 stevel case RPCBPROC_SET: 516 0 stevel case RPCBPROC_UNSET: 517 0 stevel case RPCBPROC_GETADDR: 518 0 stevel case RPCBPROC_GETVERSADDR: 519 0 stevel case RPCBPROC_GETADDRLIST: 520 0 stevel (void) showxdr_u_long("Program = %d"); 521 0 stevel (void) showxdr_u_long("Version = %d"); 522 0 stevel (void) showxdr_string(64, "Netid = %s"); 523 0 stevel break; 524 0 stevel case RPCBPROC_DUMP: 525 0 stevel break; 526 0 stevel case RPCBPROC_BCAST: 527 0 stevel case RPCBPROC_INDIRECT: 528 0 stevel (void) sprintf(get_line(0, 0), 529 0 stevel "Program = %d (%s)", 530 0 stevel iprog, nameof_prog(iprog)); 531 0 stevel (void) sprintf(get_line(0, 0), 532 0 stevel "Version = %d", ivers); 533 0 stevel (void) sprintf(get_line(0, 0), 534 0 stevel "Proc = %d", iproc); 535 0 stevel (void) showxdr_u_long( 536 0 stevel "Callit data = %d bytes"); 537 0 stevel show_trailer(); 538 0 stevel trailer_done = 1; 539 0 stevel data += 16; /* prog+ver+proc+len */ 540 0 stevel len -= 16; 541 0 stevel protoprint(flags, type, xid, 542 0 stevel iprog, ivers, iproc, 543 0 stevel data, len); 544 0 stevel break; 545 0 stevel case RPCBPROC_GETTIME: 546 0 stevel break; 547 0 stevel case RPCBPROC_UADDR2TADDR: 548 0 stevel case RPCBPROC_TADDR2UADDR: 549 0 stevel break; 550 0 stevel } 551 0 stevel } else { 552 0 stevel switch (proc) { 553 0 stevel case RPCBPROC_NULL: 554 0 stevel case RPCBPROC_SET: 555 0 stevel case RPCBPROC_UNSET: 556 0 stevel break; 557 0 stevel case RPCBPROC_GETADDR: 558 0 stevel case RPCBPROC_TADDR2UADDR: 559 0 stevel case RPCBPROC_GETVERSADDR: 560 0 stevel (void) showxdr_string(64, "Uaddr = %s"); 561 0 stevel break; 562 0 stevel case RPCBPROC_DUMP: 563 0 stevel show_rpcblist(); 564 0 stevel break; 565 0 stevel case RPCBPROC_BCAST: 566 0 stevel case RPCBPROC_INDIRECT: 567 0 stevel (void) showxdr_string(64, "Uaddr = %s"); 568 0 stevel (void) showxdr_u_long("Length = %d bytes"); 569 0 stevel show_trailer(); 570 0 stevel trailer_done = 1; 571 0 stevel if (x != NULL) { 572 0 stevel protoprint(flags, type, xid, 573 0 stevel x->xid_prog, 574 0 stevel x->xid_vers, 575 0 stevel x->xid_proc, 576 0 stevel data, len); 577 0 stevel } 578 0 stevel break; 579 0 stevel case RPCBPROC_GETTIME: 580 0 stevel (void) showxdr_date("Time = %s"); 581 0 stevel break; 582 0 stevel case RPCBPROC_UADDR2TADDR: 583 0 stevel break; 584 0 stevel case RPCBPROC_GETADDRLIST: 585 0 stevel show_rpcb_entry_list(); 586 0 stevel break; 587 0 stevel } 588 0 stevel } 589 0 stevel if (!trailer_done) 590 0 stevel show_trailer(); 591 0 stevel } 592 0 stevel } 593 0 stevel 594 0 stevel char * 595 0 stevel sum_rpcblist() 596 0 stevel { 597 0 stevel int maps = 0; 598 0 stevel static char buff[MAXSTRINGLEN + 1]; 599 0 stevel 600 0 stevel if (setjmp(xdr_err)) { 601 0 stevel (void) sprintf(buff, "%d+ map(s) found", maps); 602 0 stevel return (buff); 603 0 stevel } 604 0 stevel 605 0 stevel while (getxdr_u_long()) { 606 0 stevel (void) getxdr_u_long(); /* program */ 607 0 stevel (void) getxdr_u_long(); /* version */ 608 0 stevel (void) getxdr_string(buff, MAXSTRINGLEN); /* netid */ 609 0 stevel (void) getxdr_string(buff, MAXSTRINGLEN); /* uaddr */ 610 0 stevel (void) getxdr_string(buff, MAXSTRINGLEN); /* owner */ 611 0 stevel maps++; 612 0 stevel } 613 0 stevel 614 0 stevel (void) sprintf(buff, "%d map(s) found", maps); 615 0 stevel return (buff); 616 0 stevel } 617 0 stevel 618 0 stevel void 619 0 stevel show_rpcblist() 620 0 stevel { 621 0 stevel unsigned prog, vers; 622 0 stevel char netid[MAXSTRINGLEN + 1], uaddr[MAXSTRINGLEN + 1]; 623 0 stevel char owner[MAXSTRINGLEN + 1]; 624 0 stevel int maps = 0; 625 0 stevel 626 0 stevel if (setjmp(xdr_err)) { 627 0 stevel (void) sprintf(get_line(0, 0), 628 0 stevel " %d+ maps. (Frame is incomplete)", 629 0 stevel maps); 630 0 stevel return; 631 0 stevel } 632 0 stevel 633 0 stevel show_space(); 634 0 stevel (void) sprintf(get_line(0, 0), 635 0 stevel " Program Vers Netid Uaddr Owner"); 636 0 stevel 637 0 stevel while (getxdr_u_long()) { 638 0 stevel prog = getxdr_u_long(); 639 0 stevel vers = getxdr_u_long(); 640 0 stevel (void) getxdr_string(netid, MAXSTRINGLEN); 641 0 stevel (void) getxdr_string(uaddr, MAXSTRINGLEN); 642 0 stevel (void) getxdr_string(owner, MAXSTRINGLEN); 643 0 stevel (void) sprintf(get_line(0, 0), 644 0 stevel "%8d%5d %-12s %-18s %-10s (%s)", 645 0 stevel prog, vers, 646 0 stevel netid, uaddr, owner, 647 0 stevel nameof_prog(prog)); 648 0 stevel maps++; 649 0 stevel } 650 0 stevel 651 0 stevel (void) sprintf(get_line(0, 0), " (%d maps)", maps); 652 0 stevel } 653 0 stevel 654 0 stevel char * 655 0 stevel sum_rpcb_entry_list() 656 0 stevel { 657 0 stevel int maps = 0; 658 0 stevel static char buff[MAXSTRINGLEN + 1]; 659 0 stevel 660 0 stevel if (setjmp(xdr_err)) { 661 0 stevel (void) sprintf(buff, "%d+ map(s) found", maps); 662 0 stevel return (buff); 663 0 stevel } 664 0 stevel 665 0 stevel while (getxdr_u_long()) { 666 0 stevel (void) getxdr_string(buff, MAXSTRINGLEN); /* maddr */ 667 0 stevel (void) getxdr_string(buff, MAXSTRINGLEN); /* nc_netid */ 668 0 stevel (void) getxdr_u_long(); /* nc_semantics */ 669 0 stevel (void) getxdr_string(buff, MAXSTRINGLEN); /* nc_protofmly */ 670 0 stevel (void) getxdr_string(buff, MAXSTRINGLEN); /* nc_proto */ 671 0 stevel maps++; 672 0 stevel } 673 0 stevel 674 0 stevel (void) sprintf(buff, "%d map(s) found", maps); 675 0 stevel return (buff); 676 0 stevel } 677 0 stevel 678 0 stevel char *semantics_strs[] = {"", "CLTS", "COTS", "COTS-ORD", "RAW"}; 679 0 stevel 680 0 stevel void 681 0 stevel show_rpcb_entry_list() 682 0 stevel { 683 0 stevel char maddr[MAXSTRINGLEN + 1], netid[MAXSTRINGLEN + 1]; 684 0 stevel char protofmly[MAXSTRINGLEN + 1], proto[MAXSTRINGLEN + 1]; 685 0 stevel unsigned sem; 686 0 stevel int maps = 0; 687 0 stevel 688 0 stevel if (setjmp(xdr_err)) { 689 0 stevel (void) sprintf(get_line(0, 0), 690 0 stevel " %d+ maps. (Frame is incomplete)", 691 0 stevel maps); 692 0 stevel return; 693 0 stevel } 694 0 stevel 695 0 stevel show_space(); 696 0 stevel (void) sprintf(get_line(0, 0), 697 0 stevel " Maddr Netid Semantics Protofmly Proto"); 698 0 stevel 699 0 stevel while (getxdr_u_long()) { 700 0 stevel (void) getxdr_string(maddr, MAXSTRINGLEN); 701 0 stevel (void) getxdr_string(netid, MAXSTRINGLEN); 702 0 stevel sem = getxdr_u_long(); 703 0 stevel (void) getxdr_string(protofmly, MAXSTRINGLEN); 704 0 stevel (void) getxdr_string(proto, MAXSTRINGLEN); 705 0 stevel (void) sprintf(get_line(0, 0), 706 0 stevel "%-12s %-12s %-8s %-8s %-8s", 707 0 stevel maddr, netid, 708 0 stevel semantics_strs[sem], 709 0 stevel protofmly, proto); 710 0 stevel maps++; 711 0 stevel } 712 0 stevel 713 0 stevel (void) sprintf(get_line(0, 0), " (%d maps)", maps); 714 0 stevel } 715 0 stevel 716 0 stevel #define CXID_CACHE_SIZE 16 717 0 stevel struct cache_struct cxid_cache[CXID_CACHE_SIZE]; 718 0 stevel struct cache_struct *cxcpfirst = &cxid_cache[0]; 719 0 stevel struct cache_struct *cxcp = &cxid_cache[0]; 720 0 stevel struct cache_struct *cxcplast = &cxid_cache[CXID_CACHE_SIZE - 1]; 721 0 stevel 722 0 stevel struct cache_struct * 723 0 stevel find_callit(xid) 724 0 stevel ulong_t xid; 725 0 stevel { 726 0 stevel struct cache_struct *x; 727 0 stevel 728 0 stevel for (x = cxcp; x >= cxcpfirst; x--) 729 0 stevel if (x->xid_num == xid) 730 0 stevel return (x); 731 0 stevel for (x = cxcplast; x > cxcp; x--) 732 0 stevel if (x->xid_num == xid) 733 0 stevel return (x); 734 0 stevel return (NULL); 735 0 stevel } 736 0 stevel 737 0 stevel static void 738 0 stevel stash_callit(xid, frame, prog, vers, proc) 739 0 stevel ulong_t xid; 740 0 stevel int frame, prog, vers, proc; 741 0 stevel { 742 0 stevel struct cache_struct *x; 743 0 stevel 744 0 stevel x = find_callit(xid); 745 0 stevel if (x == NULL) { 746 0 stevel x = cxcp++; 747 0 stevel if (cxcp > cxcplast) 748 0 stevel cxcp = cxcpfirst; 749 0 stevel x->xid_num = xid; 750 0 stevel x->xid_frame = frame; 751 0 stevel } 752 0 stevel x->xid_prog = prog; 753 0 stevel x->xid_vers = vers; 754 0 stevel x->xid_proc = proc; 755 0 stevel } 756