Home | History | Annotate | Download | only in snoop
      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