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, 1998, 2001 by Sun Microsystems, Inc.
     24  0  stevel  * All rights reserved.
     25  0  stevel  */
     26  0  stevel 
     27  0  stevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
     28  0  stevel 
     29  0  stevel #include <sys/types.h>
     30  0  stevel #include <setjmp.h>
     31  0  stevel #include <string.h>
     32  0  stevel 
     33  0  stevel #ifdef notdef
     34  0  stevel #include <rpc/xdr.h>
     35  0  stevel #include <rpc/auth.h>
     36  0  stevel #include <rpc/rpc_msg.h>
     37  0  stevel #endif /* notdef */
     38  0  stevel #include <rpcsvc/nlm_prot.h>
     39  0  stevel #include "snoop.h"
     40  0  stevel 
     41  0  stevel extern char *dlc_header;
     42  0  stevel extern jmp_buf xdr_err;
     43  0  stevel 
     44  0  stevel extern void check_retransmit();
     45  0  stevel static void interpret_nlm_1();
     46  0  stevel static void interpret_nlm_3();
     47  0  stevel static void interpret_nlm_4();
     48  0  stevel static char *nameof_access();
     49  0  stevel static char *nameof_mode();
     50  0  stevel static char *nameof_stat();
     51  0  stevel static char *nameof_stat4();
     52  0  stevel static void show_cancargs();
     53  0  stevel static void show_cancargs4();
     54  0  stevel static void show_lock();
     55  0  stevel static void show_lock4();
     56  0  stevel static void show_lockargs();
     57  0  stevel static void show_lockargs4();
     58  0  stevel static void show_netobj();
     59  0  stevel static void show_nlm_access();
     60  0  stevel static void show_nlm_mode();
     61  0  stevel static void show_notify();
     62  0  stevel static void show_res();
     63  0  stevel static void show_res4();
     64  0  stevel static void show_share();
     65  0  stevel static void show_shareargs();
     66  0  stevel static void show_shareres();
     67  0  stevel static void show_shareres4();
     68  0  stevel static enum nlm_stats show_stat();
     69  0  stevel static enum nlm4_stats show_stat4();
     70  0  stevel static void show_testargs();
     71  0  stevel static void show_testargs4();
     72  0  stevel static void show_testres();
     73  0  stevel static void show_testres4();
     74  0  stevel static void show_unlockargs();
     75  0  stevel static void show_unlockargs4();
     76  0  stevel static void skip_netobj();
     77  0  stevel static char *sum_lock();
     78  0  stevel static char *sum_lock4();
     79  0  stevel static char *sum_netobj();
     80  0  stevel static char *sum_notify();
     81  0  stevel static char *sum_share();
     82  0  stevel 
     83  0  stevel void
     84  0  stevel interpret_nlm(flags, type, xid, vers, proc, data, len)
     85  0  stevel 	int flags, type, xid, vers, proc;
     86  0  stevel 	char *data;
     87  0  stevel 	int len;
     88  0  stevel {
     89  0  stevel 	switch (vers) {
     90  0  stevel 	case 1:	interpret_nlm_1(flags, type, xid, vers, proc, data, len);
     91  0  stevel 		break;
     92  0  stevel 	case 3:	interpret_nlm_3(flags, type, xid, vers, proc, data, len);
     93  0  stevel 		break;
     94  0  stevel 	case 4:	interpret_nlm_4(flags, type, xid, vers, proc, data, len);
     95  0  stevel 		break;
     96  0  stevel 	}
     97  0  stevel }
     98  0  stevel 
     99  0  stevel 
    100  0  stevel /* ------------  V E R S I O N   1  ---------------------------------- */
    101  0  stevel 
    102  0  stevel static char *procnames_short_1[] = {
    103  0  stevel 	"Null1",	/* 0 */
    104  0  stevel 	"TEST1",	/* 1 */
    105  0  stevel 	"LOCK1",	/* 2 */
    106  0  stevel 	"CANCEL1",	/* 3 */
    107  0  stevel 	"UNLOCK1",	/* 4 */
    108  0  stevel 	"GRANTED1",	/* 5 */
    109  0  stevel 	"TEST MSG1",	/* 6 */
    110  0  stevel 	"LOCK MSG1",	/* 7 */
    111  0  stevel 	"CANCEL MSG1",	/* 8 */
    112  0  stevel 	"UNLOCK MSG1",	/* 9 */
    113  0  stevel 	"GRANTED MSG1",	/* 10 */
    114  0  stevel 	"TEST RES1",	/* 11 */
    115  0  stevel 	"LOCK RES1",	/* 12 */
    116  0  stevel 	"CANCEL RES1",	/* 13 */
    117  0  stevel 	"UNLOCK RES1",	/* 14 */
    118  0  stevel 	"GRANTED RES1",	/* 15 */
    119  0  stevel };
    120  0  stevel 
    121  0  stevel static char *procnames_long_1[] = {
    122  0  stevel 	"Null procedure",	/* 0 */
    123  0  stevel 	"Test",			/* 1 */
    124  0  stevel 	"Lock",			/* 2 */
    125  0  stevel 	"Cancel",		/* 3 */
    126  0  stevel 	"Unlock",		/* 4 */
    127  0  stevel 	"Granted",		/* 5 */
    128  0  stevel 	"Test message",		/* 6 */
    129  0  stevel 	"Lock message",		/* 7 */
    130  0  stevel 	"Cancel message",	/* 8 */
    131  0  stevel 	"Unlock message",	/* 9 */
    132  0  stevel 	"Granted message",	/* 10 */
    133  0  stevel 	"Test result",		/* 11 */
    134  0  stevel 	"Lock result",		/* 12 */
    135  0  stevel 	"Cancel result",	/* 13 */
    136  0  stevel 	"Unlock result",	/* 14 */
    137  0  stevel 	"Granted result",	/* 15 */
    138  0  stevel };
    139  0  stevel 
    140  0  stevel /* Highest procedure number that officially belongs to version 1. */
    141  0  stevel #define	MAXPROC_1	15
    142  0  stevel 
    143  0  stevel /* ARGSUSED */
    144  0  stevel static void
    145  0  stevel interpret_nlm_1(flags, type, xid, vers, proc, data, len)
    146  0  stevel 	int flags, type, xid, vers, proc;
    147  0  stevel 	char *data;
    148  0  stevel 	int len;
    149  0  stevel {
    150  0  stevel 	char *line;
    151  0  stevel 
    152  0  stevel 	if (proc < 0 || proc > MAXPROC_1)
    153  0  stevel 		return;
    154  0  stevel 
    155  0  stevel 	if (flags & F_SUM) {
    156  0  stevel 		if (setjmp(xdr_err)) {
    157  0  stevel 			return;
    158  0  stevel 		}
    159  0  stevel 
    160  0  stevel 		line = get_sum_line();
    161  0  stevel 
    162  0  stevel 		if (type == CALL) {
    163  0  stevel 			(void) sprintf(line,
    164  0  stevel 				"NLM C %s",
    165  0  stevel 				procnames_short_1[proc]);
    166  0  stevel 			line += strlen(line);
    167  0  stevel 			switch (proc) {
    168  0  stevel 			case NLM_TEST:
    169  0  stevel 			case NLM_GRANTED:
    170  0  stevel 			case NLM_TEST_MSG:
    171  0  stevel 			case NLM_GRANTED_MSG:
    172  0  stevel 				/* testargs */
    173  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    174  0  stevel 				(void) getxdr_bool();	/* Excl */
    175  0  stevel 				(void) strcat(line, sum_lock());
    176  0  stevel 				break;
    177  0  stevel 			case NLM_LOCK:
    178  0  stevel 			case NLM_LOCK_MSG:
    179  0  stevel 				/* lockargs */
    180  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    181  0  stevel 				(void) getxdr_bool();	/* Block */
    182  0  stevel 				(void) getxdr_bool();	/* Excl */
    183  0  stevel 				(void) strcat(line, sum_lock());
    184  0  stevel 				break;
    185  0  stevel 			case NLM_CANCEL:
    186  0  stevel 			case NLM_CANCEL_MSG:
    187  0  stevel 				/* cancargs */
    188  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    189  0  stevel 				(void) getxdr_bool();	/* Block */
    190  0  stevel 				(void) getxdr_bool();	/* Excl */
    191  0  stevel 				(void) strcat(line, sum_lock());
    192  0  stevel 				break;
    193  0  stevel 			case NLM_UNLOCK:
    194  0  stevel 			case NLM_UNLOCK_MSG:
    195  0  stevel 				/* unlockargs */
    196  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    197  0  stevel 				(void) strcat(line, sum_lock());
    198  0  stevel 				break;
    199  0  stevel 			case NLM_TEST_RES:
    200  0  stevel 				/* testres */
    201  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    202  0  stevel 				(void) strcat(line, " ");
    203  0  stevel 				(void) strcat(line,
    204  0  stevel 				    nameof_stat(getxdr_u_long()));
    205  0  stevel 				break;
    206  0  stevel 			case NLM_LOCK_RES:
    207  0  stevel 			case NLM_CANCEL_RES:
    208  0  stevel 			case NLM_UNLOCK_RES:
    209  0  stevel 			case NLM_GRANTED_RES:
    210  0  stevel 				/* res */
    211  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    212  0  stevel 				(void) strcat(line, " ");
    213  0  stevel 				(void) strcat(line,
    214  0  stevel 					nameof_stat(getxdr_u_long()));
    215  0  stevel 				break;
    216  0  stevel 			}
    217  0  stevel 			check_retransmit(line, (ulong_t)xid);
    218  0  stevel 		} else {
    219  0  stevel 			(void) sprintf(line, "NLM R %s",
    220  0  stevel 				procnames_short_1[proc]);
    221  0  stevel 			line += strlen(line);
    222  0  stevel 			switch (proc) {
    223  0  stevel 			case NLM_TEST:
    224  0  stevel 				/* testres */
    225  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    226  0  stevel 				(void) strcat(line, " ");
    227  0  stevel 				(void) strcat(line,
    228  0  stevel 				    nameof_stat(getxdr_u_long()));
    229  0  stevel 				break;
    230  0  stevel 			case NLM_LOCK:
    231  0  stevel 			case NLM_CANCEL:
    232  0  stevel 			case NLM_UNLOCK:
    233  0  stevel 			case NLM_GRANTED:
    234  0  stevel 				/* res */
    235  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    236  0  stevel 				(void) strcat(line, " ");
    237  0  stevel 				(void) strcat(line,
    238  0  stevel 					nameof_stat(getxdr_u_long()));
    239  0  stevel 				break;
    240  0  stevel 			}
    241  0  stevel 		}
    242  0  stevel 	}
    243  0  stevel 
    244  0  stevel 	if (flags & F_DTAIL) {
    245  0  stevel 		show_header("NLM:  ", "Network Lock Manager", len);
    246  0  stevel 		show_space();
    247  0  stevel 		if (setjmp(xdr_err)) {
    248  0  stevel 			return;
    249  0  stevel 		}
    250  0  stevel 		(void) sprintf(get_line(0, 0),
    251  0  stevel 			"Proc = %d (%s)",
    252  0  stevel 			proc, procnames_long_1[proc]);
    253  0  stevel 		if (type == CALL) {
    254  0  stevel 			switch (proc) {
    255  0  stevel 			case NLM_TEST:
    256  0  stevel 			case NLM_GRANTED:
    257  0  stevel 			case NLM_TEST_MSG:
    258  0  stevel 			case NLM_GRANTED_MSG:
    259  0  stevel 				show_testargs();
    260  0  stevel 				break;
    261  0  stevel 			case NLM_LOCK:
    262  0  stevel 			case NLM_LOCK_MSG:
    263  0  stevel 				show_lockargs();
    264  0  stevel 				break;
    265  0  stevel 			case NLM_CANCEL:
    266  0  stevel 			case NLM_CANCEL_MSG:
    267  0  stevel 				show_cancargs();
    268  0  stevel 				break;
    269  0  stevel 			case NLM_UNLOCK:
    270  0  stevel 			case NLM_UNLOCK_MSG:
    271  0  stevel 				show_unlockargs();
    272  0  stevel 				break;
    273  0  stevel 			case NLM_TEST_RES:
    274  0  stevel 				show_testres();
    275  0  stevel 				break;
    276  0  stevel 			case NLM_LOCK_RES:
    277  0  stevel 			case NLM_CANCEL_RES:
    278  0  stevel 			case NLM_UNLOCK_RES:
    279  0  stevel 			case NLM_GRANTED_RES:
    280  0  stevel 				show_res();
    281  0  stevel 				break;
    282  0  stevel 			}
    283  0  stevel 		} else {
    284  0  stevel 			switch (proc) {
    285  0  stevel 			case NLM_TEST:
    286  0  stevel 				show_testres();
    287  0  stevel 				break;
    288  0  stevel 			case NLM_LOCK:
    289  0  stevel 			case NLM_CANCEL:
    290  0  stevel 			case NLM_UNLOCK:
    291  0  stevel 			case NLM_GRANTED:
    292  0  stevel 				show_res();
    293  0  stevel 				break;
    294  0  stevel 			case NLM_TEST_MSG:
    295  0  stevel 			case NLM_LOCK_MSG:
    296  0  stevel 			case NLM_CANCEL_MSG:
    297  0  stevel 			case NLM_UNLOCK_MSG:
    298  0  stevel 			case NLM_GRANTED_MSG:
    299  0  stevel 			case NLM_TEST_RES:
    300  0  stevel 			case NLM_LOCK_RES:
    301  0  stevel 			case NLM_CANCEL_RES:
    302  0  stevel 			case NLM_UNLOCK_RES:
    303  0  stevel 			case NLM_GRANTED_RES:
    304  0  stevel 				break;
    305  0  stevel 			}
    306  0  stevel 		}
    307  0  stevel 		show_trailer();
    308  0  stevel 	}
    309  0  stevel }
    310  0  stevel 
    311  0  stevel #define	roundup(sz) ((sz / 4 + (sz % 4 > 0)) * 4)
    312  0  stevel 
    313  0  stevel /*
    314  0  stevel  * Skip a netobj.
    315  0  stevel  * Make sure an integral number of words
    316  0  stevel  * are skipped.
    317  0  stevel  */
    318  0  stevel static void
    319  0  stevel skip_netobj()
    320  0  stevel {
    321  0  stevel 	int sz = getxdr_u_long();
    322  0  stevel 
    323  0  stevel 	xdr_skip(roundup(sz));
    324  0  stevel }
    325  0  stevel 
    326  0  stevel static char *
    327  0  stevel sum_netobj(handle)
    328  0  stevel 	char *handle;
    329  0  stevel {
    330  0  stevel 	int i, l, sz;
    331  0  stevel 	int sum = 0;
    332  0  stevel 	static char buff[32];
    333  0  stevel 
    334  0  stevel 	sz = getxdr_u_long();
    335  0  stevel 	for (i = 0; i < sz; i += 4) {
    336  0  stevel 		l =  getxdr_long();
    337  0  stevel 		sum ^= (l >> 16) ^ l;
    338  0  stevel 	}
    339  0  stevel 	(void) sprintf(buff, " %s=%04X", handle, sum & 0xFFFF);
    340  0  stevel 	return (buff);
    341  0  stevel }
    342  0  stevel 
    343  0  stevel static void
    344  0  stevel show_netobj(fmt)
    345  0  stevel 	char *fmt;
    346  0  stevel {
    347  0  stevel 	int sz, chunk;
    348  0  stevel 	char *p;
    349  0  stevel 	char buff[64];
    350  0  stevel 	int needspace;
    351  0  stevel 
    352  0  stevel 	sz = getxdr_u_long();		/* size of the netobj */
    353  0  stevel 
    354  0  stevel 	if (sz == 0) {
    355  0  stevel 		(void) sprintf(get_line(0, 0), fmt, "<null>");
    356  0  stevel 	} else {
    357  0  stevel 		needspace = sz > 16;
    358  0  stevel 		(void) strcpy(buff, fmt);
    359  0  stevel 		while (sz > 0) {
    360  0  stevel 			chunk = sz > 16 ? 16 : sz;
    361  0  stevel 			sz -= 16;
    362  0  stevel 			(void) showxdr_hex(chunk, buff);
    363  0  stevel 			/*
    364  0  stevel 			 * For every line after the first, blank out
    365  0  stevel 			 * everything in the format string before the "%s".
    366  0  stevel 			 */
    367  0  stevel 			for (p = buff; *p != '%'; p++)
    368  0  stevel 				*p = ' ';
    369  0  stevel 		}
    370  0  stevel 		if (needspace)
    371  0  stevel 			show_space();
    372  0  stevel 	}
    373  0  stevel }
    374  0  stevel 
    375  0  stevel static char *
    376  0  stevel sum_lock()
    377  0  stevel {
    378  0  stevel 	static char buff[LM_MAXSTRLEN + 1];
    379  0  stevel 	char *cp = buff;
    380  0  stevel 	long id;
    381  0  stevel 	ulong_t off, len;
    382  0  stevel 
    383  0  stevel 	(void) getxdr_string(buff, LM_MAXSTRLEN);	/* Caller */
    384  0  stevel 	(void) strcpy(buff, sum_netobj("FH"));		/* Fh */
    385  0  stevel 	cp += strlen(buff);
    386  0  stevel 	skip_netobj();					/* Owner */
    387  0  stevel 	id  = getxdr_long();
    388  0  stevel 	off = getxdr_u_long();
    389  0  stevel 	len = getxdr_u_long();
    390  0  stevel 	(void) sprintf(cp, " PID=%ld Region=%lu:%lu", id, off, len);
    391  0  stevel 	return (buff);
    392  0  stevel }
    393  0  stevel 
    394  0  stevel static void
    395  0  stevel show_lock()
    396  0  stevel {
    397  0  stevel 	showxdr_string(LM_MAXSTRLEN, "Caller = %s");
    398  0  stevel 	show_netobj("Filehandle = %s");
    399  0  stevel 	show_netobj("Lock owner = %s");
    400  0  stevel 	showxdr_long("Svid = %ld (process id)");
    401  0  stevel 	showxdr_u_long("Offset = %lu bytes");
    402  0  stevel 	showxdr_u_long("Length = %lu bytes");
    403  0  stevel }
    404  0  stevel 
    405  0  stevel static void
    406  0  stevel show_cancargs()
    407  0  stevel {
    408  0  stevel 	show_netobj("Cookie = %s");
    409  0  stevel 	showxdr_bool("Block = %s");
    410  0  stevel 	showxdr_bool("Exclusive = %s");
    411  0  stevel 	show_lock();
    412  0  stevel }
    413  0  stevel 
    414  0  stevel static void
    415  0  stevel show_lockargs()
    416  0  stevel {
    417  0  stevel 	show_netobj("Cookie = %s");
    418  0  stevel 	showxdr_bool("Block = %s");
    419  0  stevel 	showxdr_bool("Exclusive = %s");
    420  0  stevel 	show_lock();
    421  0  stevel 	showxdr_bool("Reclaim = %s");
    422  0  stevel 	showxdr_long("State = %ld");
    423  0  stevel }
    424  0  stevel 
    425  0  stevel static void
    426  0  stevel show_unlockargs()
    427  0  stevel {
    428  0  stevel 	show_netobj("Cookie = %s");
    429  0  stevel 	show_lock();
    430  0  stevel }
    431  0  stevel 
    432  0  stevel static void
    433  0  stevel show_testargs()
    434  0  stevel {
    435  0  stevel 	show_netobj("Cookie = %s");
    436  0  stevel 	showxdr_bool("Exclusive = %s");
    437  0  stevel 	show_lock();
    438  0  stevel }
    439  0  stevel 
    440  0  stevel static void
    441  0  stevel show_res()
    442  0  stevel {
    443  0  stevel 	show_netobj("Cookie = %s");
    444  0  stevel 	(void) show_stat();
    445  0  stevel }
    446  0  stevel 
    447  0  stevel static char *
    448  0  stevel nameof_stat(s)
    449  0  stevel 	ulong_t s;
    450  0  stevel {
    451  0  stevel 	switch ((enum nlm_stats) s) {
    452  0  stevel 	case nlm_granted:	return ("granted");
    453  0  stevel 	case nlm_denied:	return ("denied");
    454  0  stevel 	case nlm_denied_nolocks:return ("denied (no locks)");
    455  0  stevel 	case nlm_blocked:	return ("blocked");
    456  0  stevel 	case nlm_denied_grace_period: return ("denied (grace period)");
    457  0  stevel 	case nlm_deadlck:	return ("deadlock");
    458  0  stevel 	default:		return ("?");
    459  0  stevel 	}
    460  0  stevel }
    461  0  stevel 
    462  0  stevel static enum nlm_stats
    463  0  stevel show_stat()
    464  0  stevel {
    465  0  stevel 	enum nlm_stats s;
    466  0  stevel 
    467  0  stevel 	s = (enum nlm_stats) getxdr_u_long();
    468  0  stevel 	(void) sprintf(get_line(0, 0),
    469  0  stevel 		"Status = %d (%s)",
    470  0  stevel 		s, nameof_stat((ulong_t)s));
    471  0  stevel 
    472  0  stevel 	return (s);
    473  0  stevel }
    474  0  stevel 
    475  0  stevel static void
    476  0  stevel show_testres()
    477  0  stevel {
    478  0  stevel 	show_netobj("Cookie = %s");
    479  0  stevel 	if (show_stat() == nlm_denied) {
    480  0  stevel 		showxdr_bool("Exclusive = %s");
    481  0  stevel 		showxdr_long("Svid = %ld (process id)");
    482  0  stevel 		show_netobj("Owner handle = %s");
    483  0  stevel 		showxdr_u_long("Offset = %lu bytes");
    484  0  stevel 		showxdr_u_long("Length = %lu bytes");
    485  0  stevel 	}
    486  0  stevel }
    487  0  stevel 
    488  0  stevel 
    489  0  stevel /* ------------  V E R S I O N   3  ---------------------------------- */
    490  0  stevel 
    491  0  stevel static char *procnames_short_3[] = {
    492  0  stevel 	"SHARE3",	/* 20 */
    493  0  stevel 	"UNSHARE3",	/* 21 */
    494  0  stevel 	"NM_LOCK3",	/* 22 */
    495  0  stevel 	"FREEALL3",	/* 23 */
    496  0  stevel };
    497  0  stevel 
    498  0  stevel static char *procnames_long_3[] = {
    499  0  stevel 	"Share",		/* 20 */
    500  0  stevel 	"Unshare",		/* 21 */
    501  0  stevel 	"Unmonitored lock",	/* 22 */
    502  0  stevel 	"Free all",		/* 23 */
    503  0  stevel };
    504  0  stevel 
    505  0  stevel /* Maximum procedure number for version 3. */
    506  0  stevel #define	MAXPROC_3	23
    507  0  stevel 
    508  0  stevel static void
    509  0  stevel interpret_nlm_3(flags, type, xid, vers, proc, data, len)
    510  0  stevel 	int flags, type, xid, vers, proc;
    511  0  stevel 	char *data;
    512  0  stevel 	int len;
    513  0  stevel {
    514  0  stevel 	char *line, *pl;
    515  0  stevel 	ulong_t i;
    516  0  stevel 
    517  0  stevel 	if (proc < 0 || proc > MAXPROC_3)
    518  0  stevel 		return;
    519  0  stevel 
    520  0  stevel 	/*
    521  0  stevel 	 * Version 3 is a superset of version 1
    522  0  stevel 	 */
    523  0  stevel 	if (proc >= 0 && proc <= MAXPROC_1) {
    524  0  stevel 		interpret_nlm_1(flags, type, xid, vers, proc, data, len);
    525  0  stevel 		return;
    526  0  stevel 	}
    527  0  stevel 
    528  0  stevel 	if (flags & F_SUM) {
    529  0  stevel 		if (setjmp(xdr_err)) {
    530  0  stevel 			return;
    531  0  stevel 		}
    532  0  stevel 
    533  0  stevel 		line = get_sum_line();
    534  0  stevel 
    535  0  stevel 		if (type == CALL) {
    536  0  stevel 			(void) sprintf(line,
    537  0  stevel 				"NLM C %s",
    538  0  stevel 				procnames_short_3[proc-20]);
    539  0  stevel 			line += strlen(line);
    540  0  stevel 			switch (proc) {
    541  0  stevel 			case NLM_SHARE:
    542  0  stevel 			case NLM_UNSHARE:
    543  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    544  0  stevel 				(void) strcat(line, sum_share());
    545  0  stevel 				break;
    546  0  stevel 			case NLM_NM_LOCK:
    547  0  stevel 				/* lockargs */
    548  0  stevel 				skip_netobj();
    549  0  stevel 				(void) getxdr_u_long(); /* Block */
    550  0  stevel 				(void) getxdr_u_long(); /* Excl */
    551  0  stevel 				(void) strcat(line, sum_lock());
    552  0  stevel 				break;
    553  0  stevel 			case NLM_FREE_ALL:
    554  0  stevel 				(void) sprintf(line,
    555  0  stevel 					" %s", sum_notify());
    556  0  stevel 				break;
    557  0  stevel 			}
    558  0  stevel 			check_retransmit(line, (ulong_t)xid);
    559  0  stevel 		} else {
    560  0  stevel 			(void) sprintf(line, "NLM R %s",
    561  0  stevel 				procnames_short_3[proc-20]);
    562  0  stevel 			line += strlen(line);
    563  0  stevel 			switch (proc) {
    564  0  stevel 			case NLM_SHARE:
    565  0  stevel 			case NLM_UNSHARE:
    566  0  stevel 				pl = sum_netobj("OH");
    567  0  stevel 				i = getxdr_u_long();
    568  0  stevel 				sprintf(line, "%s %s %ld",
    569  0  stevel 					pl, nameof_stat(i), getxdr_long());
    570  0  stevel 				break;
    571  0  stevel 			case NLM_NM_LOCK:
    572  0  stevel 				/* res */
    573  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    574  0  stevel 				(void) strcat(line, " ");
    575  0  stevel 				(void) strcat(line,
    576  0  stevel 					nameof_stat(getxdr_u_long()));
    577  0  stevel 				break;
    578  0  stevel 			case NLM_FREE_ALL:
    579  0  stevel 				break;
    580  0  stevel 			}
    581  0  stevel 		}
    582  0  stevel 	}
    583  0  stevel 
    584  0  stevel 	if (flags & F_DTAIL) {
    585  0  stevel 		show_header("NLM:  ", "Network Lock Manager", len);
    586  0  stevel 		show_space();
    587  0  stevel 		if (setjmp(xdr_err)) {
    588  0  stevel 			return;
    589  0  stevel 		}
    590  0  stevel 		(void) sprintf(get_line(0, 0),
    591  0  stevel 			"Proc = %d (%s)",
    592  0  stevel 			proc, procnames_long_3[proc-20]);
    593  0  stevel 		if (type == CALL) {
    594  0  stevel 			switch (proc) {
    595  0  stevel 			case NLM_SHARE:
    596  0  stevel 			case NLM_UNSHARE:
    597  0  stevel 				show_shareargs();
    598  0  stevel 				break;
    599  0  stevel 			case NLM_NM_LOCK:
    600  0  stevel 				show_lockargs();
    601  0  stevel 				break;
    602  0  stevel 			case NLM_FREE_ALL:
    603  0  stevel 				show_notify();
    604  0  stevel 				break;
    605  0  stevel 			}
    606  0  stevel 		} else {
    607  0  stevel 			switch (proc) {
    608  0  stevel 			case NLM_SHARE:
    609  0  stevel 			case NLM_UNSHARE:
    610  0  stevel 				show_shareres();
    611  0  stevel 				break;
    612  0  stevel 			case NLM_NM_LOCK:
    613  0  stevel 				show_res();
    614  0  stevel 				break;
    615  0  stevel 			case NLM_FREE_ALL:
    616  0  stevel 				break;
    617  0  stevel 			}
    618  0  stevel 		}
    619  0  stevel 		show_trailer();
    620  0  stevel 	}
    621  0  stevel }
    622  0  stevel 
    623  0  stevel static char *
    624  0  stevel nameof_mode(m)
    625  0  stevel 	uint_t m;
    626  0  stevel {
    627  0  stevel 	switch ((enum fsh_mode) m) {
    628  0  stevel 	case fsm_DN:	return ("deny none");
    629  0  stevel 	case fsm_DR:	return ("deny read");
    630  0  stevel 	case fsm_DW:	return ("deny write");
    631  0  stevel 	case fsm_DRW:	return ("deny read/write");
    632  0  stevel 	default:	return ("?");
    633  0  stevel 	}
    634  0  stevel }
    635  0  stevel 
    636  0  stevel static char *
    637  0  stevel nameof_access(a)
    638  0  stevel 	uint_t a;
    639  0  stevel {
    640  0  stevel 	switch ((enum fsh_access) a) {
    641  0  stevel 	case fsa_NONE:	return ("?");
    642  0  stevel 	case fsa_R:	return ("read only");
    643  0  stevel 	case fsa_W:	return ("write only");
    644  0  stevel 	case fsa_RW:	return ("read/write");
    645  0  stevel 	default:	return ("?");
    646  0  stevel 	}
    647  0  stevel }
    648  0  stevel 
    649  0  stevel static void
    650  0  stevel show_nlm_mode()
    651  0  stevel {
    652  0  stevel 	enum fsh_mode m;
    653  0  stevel 
    654  0  stevel 	m = (enum fsh_mode) getxdr_u_long();
    655  0  stevel 	(void) sprintf(get_line(0, 0),
    656  0  stevel 		"Mode = %d (%s)",
    657  0  stevel 		m, nameof_mode((uint_t)m));
    658  0  stevel }
    659  0  stevel 
    660  0  stevel static void
    661  0  stevel show_nlm_access()
    662  0  stevel {
    663  0  stevel 	enum fsh_access a;
    664  0  stevel 
    665  0  stevel 	a = (enum fsh_access) getxdr_u_long();
    666  0  stevel 	(void) sprintf(get_line(0, 0),
    667  0  stevel 		"Access = %d (%s)",
    668  0  stevel 		a, nameof_access((uint_t)a));
    669  0  stevel }
    670  0  stevel 
    671  0  stevel static char *
    672  0  stevel sum_share()
    673  0  stevel {
    674  0  stevel 	static char buff[LM_MAXSTRLEN + 1];
    675  0  stevel 	char *cp = buff;
    676  0  stevel 	ulong_t mode, access;
    677  0  stevel 
    678  0  stevel 	(void) getxdr_string(buff, LM_MAXSTRLEN);	/* Caller */
    679  0  stevel 	(void) strcpy(buff, sum_netobj("FH"));		/* Fh */
    680  0  stevel 	cp += strlen(buff);
    681  0  stevel 	skip_netobj();					/* Owner */
    682  0  stevel 	mode = getxdr_u_long();
    683  0  stevel 	access = getxdr_u_long();
    684  0  stevel 	(void) sprintf(cp, " Mode=%lu Access=%lu", mode, access);
    685  0  stevel 	return (buff);
    686  0  stevel }
    687  0  stevel 
    688  0  stevel static void
    689  0  stevel show_share()
    690  0  stevel {
    691  0  stevel 	showxdr_string(LM_MAXSTRLEN, "Caller = %s");
    692  0  stevel 	show_netobj("Filehandle = %s");
    693  0  stevel 	show_netobj("Lock owner = %s");
    694  0  stevel 	show_nlm_mode();
    695  0  stevel 	show_nlm_access();
    696  0  stevel }
    697  0  stevel 
    698  0  stevel static void
    699  0  stevel show_shareargs()
    700  0  stevel {
    701  0  stevel 	show_netobj("Cookie = %s");
    702  0  stevel 	show_share();
    703  0  stevel 	showxdr_bool("Reclaim = %s");
    704  0  stevel }
    705  0  stevel 
    706  0  stevel static void
    707  0  stevel show_shareres()
    708  0  stevel {
    709  0  stevel 	show_netobj("Cookie = %s");
    710  0  stevel 	(void) show_stat();
    711  0  stevel 	showxdr_long("Sequence = %d");
    712  0  stevel }
    713  0  stevel 
    714  0  stevel static void
    715  0  stevel show_notify()
    716  0  stevel {
    717  0  stevel 	showxdr_string(LM_MAXNAMELEN, "Name = %s");
    718  0  stevel 	showxdr_long("State = %d");
    719  0  stevel }
    720  0  stevel 
    721  0  stevel #define	NOTIFY_PAD	(sizeof (" State=-2147483648") + 1)
    722  0  stevel 
    723  0  stevel static char *
    724  0  stevel sum_notify()
    725  0  stevel {
    726  0  stevel 	static char buff[LM_MAXNAMELEN + NOTIFY_PAD];
    727  0  stevel 	char *cp = buff;
    728  0  stevel 	long state;
    729  0  stevel 
    730  0  stevel 	(void) getxdr_string(buff, LM_MAXNAMELEN);
    731  0  stevel 	cp += strlen(buff);
    732  0  stevel 	state  = getxdr_long();
    733  0  stevel 	(void) sprintf(cp, " State=%ld", state);
    734  0  stevel 	return (buff);
    735  0  stevel }
    736  0  stevel 
    737  0  stevel /* ------------  V E R S I O N   4  ---------------------------------- */
    738  0  stevel 
    739  0  stevel static char *procnames_short_4[] = {
    740  0  stevel 	"Null4",	/* 0 */
    741  0  stevel 	"TEST4",	/* 1 */
    742  0  stevel 	"LOCK4",	/* 2 */
    743  0  stevel 	"CANCEL4",	/* 3 */
    744  0  stevel 	"UNLOCK4",	/* 4 */
    745  0  stevel 	"GRANTED4",	/* 5 */
    746  0  stevel 	"TEST MSG4",	/* 6 */
    747  0  stevel 	"LOCK MSG4",	/* 7 */
    748  0  stevel 	"CANCEL MSG4",	/* 8 */
    749  0  stevel 	"UNLOCK MSG4",	/* 9 */
    750  0  stevel 	"GRANTED MSG4",	/* 10 */
    751  0  stevel 	"TEST RES4",	/* 11 */
    752  0  stevel 	"LOCK RES4",	/* 12 */
    753  0  stevel 	"CANCEL RES4",	/* 13 */
    754  0  stevel 	"UNLOCK RES4",	/* 14 */
    755  0  stevel 	"GRANTED RES4",	/* 15 */
    756  0  stevel 	"PROC 16 v4",	/* 16 */
    757  0  stevel 	"PROC 17 v4",	/* 17 */
    758  0  stevel 	"PROC 18 v4",	/* 18 */
    759  0  stevel 	"PROC 19 v4",	/* 19 */
    760  0  stevel 	"SHARE4",	/* 20 */
    761  0  stevel 	"UNSHARE4",	/* 21 */
    762  0  stevel 	"NM_LOCK4",	/* 22 */
    763  0  stevel 	"FREEALL4",	/* 23 */
    764  0  stevel };
    765  0  stevel 
    766  0  stevel static char *procnames_long_4[] = {
    767  0  stevel 	"Null procedure",	/* 0 */
    768  0  stevel 	"Test",			/* 1 */
    769  0  stevel 	"Lock",			/* 2 */
    770  0  stevel 	"Cancel",		/* 3 */
    771  0  stevel 	"Unlock",		/* 4 */
    772  0  stevel 	"Granted",		/* 5 */
    773  0  stevel 	"Test message",		/* 6 */
    774  0  stevel 	"Lock message",		/* 7 */
    775  0  stevel 	"Cancel message",	/* 8 */
    776  0  stevel 	"Unlock message",	/* 9 */
    777  0  stevel 	"Granted message",	/* 10 */
    778  0  stevel 	"Test result",		/* 11 */
    779  0  stevel 	"Lock result",		/* 12 */
    780  0  stevel 	"Cancel result",	/* 13 */
    781  0  stevel 	"Unlock result",	/* 14 */
    782  0  stevel 	"Granted result",	/* 15 */
    783  0  stevel 	"Procedure 16",		/* 16 */
    784  0  stevel 	"Procedure 17",		/* 17 */
    785  0  stevel 	"Procedure 18",		/* 18 */
    786  0  stevel 	"Procedure 19",		/* 19 */
    787  0  stevel 	"Share",		/* 20 */
    788  0  stevel 	"Unshare",		/* 21 */
    789  0  stevel 	"Unmonitored lock",	/* 22 */
    790  0  stevel 	"Free all",		/* 23 */
    791  0  stevel };
    792  0  stevel 
    793  0  stevel /* Maximum procedure number for version 4. */
    794  0  stevel #define	MAXPROC_4	23
    795  0  stevel 
    796  0  stevel /* ARGSUSED */
    797  0  stevel static void
    798  0  stevel interpret_nlm_4(flags, type, xid, vers, proc, data, len)
    799  0  stevel 	int flags, type, xid, vers, proc;
    800  0  stevel 	char *data;
    801  0  stevel 	int len;
    802  0  stevel {
    803  0  stevel 	char *line;
    804  0  stevel 	char *pl;
    805  0  stevel 	ulong_t i;
    806  0  stevel 
    807  0  stevel 	if (proc < 0 || proc > MAXPROC_4)
    808  0  stevel 		return;
    809  0  stevel 
    810  0  stevel 	if (flags & F_SUM) {
    811  0  stevel 		if (setjmp(xdr_err)) {
    812  0  stevel 			return;
    813  0  stevel 		}
    814  0  stevel 
    815  0  stevel 		line = get_sum_line();
    816  0  stevel 
    817  0  stevel 		if (type == CALL) {
    818  0  stevel 			(void) sprintf(line,
    819  0  stevel 				"NLM C %s",
    820  0  stevel 				procnames_short_4[proc]);
    821  0  stevel 			line += strlen(line);
    822  0  stevel 			switch (proc) {
    823  0  stevel 			case NLMPROC4_TEST:
    824  0  stevel 			case NLMPROC4_GRANTED:
    825  0  stevel 			case NLMPROC4_TEST_MSG:
    826  0  stevel 			case NLMPROC4_GRANTED_MSG:
    827  0  stevel 				/* testargs */
    828  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    829  0  stevel 				(void) getxdr_bool();	/* Excl */
    830  0  stevel 				(void) strcat(line, sum_lock4());
    831  0  stevel 				break;
    832  0  stevel 			case NLMPROC4_LOCK:
    833  0  stevel 			case NLMPROC4_LOCK_MSG:
    834  0  stevel 				/* lockargs */
    835  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    836  0  stevel 				(void) getxdr_bool();	/* Block */
    837  0  stevel 				(void) getxdr_bool();	/* Excl */
    838  0  stevel 				(void) strcat(line, sum_lock4());
    839  0  stevel 				/* ignore reclaim, state fields */
    840  0  stevel 				break;
    841  0  stevel 			case NLMPROC4_CANCEL:
    842  0  stevel 			case NLMPROC4_CANCEL_MSG:
    843  0  stevel 				/* cancargs */
    844  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    845  0  stevel 				(void) getxdr_bool();	/* Block */
    846  0  stevel 				(void) getxdr_bool();	/* Excl */
    847  0  stevel 				(void) strcat(line, sum_lock4());
    848  0  stevel 				break;
    849  0  stevel 			case NLMPROC4_UNLOCK:
    850  0  stevel 			case NLMPROC4_UNLOCK_MSG:
    851  0  stevel 				/* unlockargs */
    852  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    853  0  stevel 				(void) strcat(line, sum_lock4());
    854  0  stevel 				break;
    855  0  stevel 			case NLMPROC4_TEST_RES:
    856  0  stevel 				/* testres */
    857  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    858  0  stevel 				(void) strcat(line, " ");
    859  0  stevel 				(void) strcat(line,
    860  0  stevel 				    nameof_stat4(getxdr_u_long()));
    861  0  stevel 				break;
    862  0  stevel 			case NLMPROC4_LOCK_RES:
    863  0  stevel 			case NLMPROC4_CANCEL_RES:
    864  0  stevel 			case NLMPROC4_UNLOCK_RES:
    865  0  stevel 			case NLMPROC4_GRANTED_RES:
    866  0  stevel 				/* res */
    867  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    868  0  stevel 				(void) strcat(line, " ");
    869  0  stevel 				(void) strcat(line,
    870  0  stevel 					nameof_stat4(getxdr_u_long()));
    871  0  stevel 				break;
    872  0  stevel 			case NLMPROC4_SHARE:
    873  0  stevel 			case NLMPROC4_UNSHARE:
    874  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    875  0  stevel 				(void) strcat(line, sum_share());
    876  0  stevel 				break;
    877  0  stevel 			case NLMPROC4_NM_LOCK:
    878  0  stevel 				/* lockargs */
    879  0  stevel 				skip_netobj();		/* Cookie */
    880  0  stevel 				(void) getxdr_bool();	/* Block */
    881  0  stevel 				(void) getxdr_bool();	/* Excl */
    882  0  stevel 				(void) strcat(line, sum_lock4());
    883  0  stevel 				/* skip reclaim & state fields */
    884  0  stevel 				break;
    885  0  stevel 			case NLMPROC4_FREE_ALL:
    886  0  stevel 				(void) sprintf(line,
    887  0  stevel 					" %s", sum_notify());
    888  0  stevel 				break;
    889  0  stevel 			}
    890  0  stevel 			check_retransmit(line, (ulong_t)xid);
    891  0  stevel 		} else {
    892  0  stevel 			(void) sprintf(line, "NLM R %s",
    893  0  stevel 				procnames_short_4[proc]);
    894  0  stevel 			line += strlen(line);
    895  0  stevel 			switch (proc) {
    896  0  stevel 			case NLMPROC4_TEST:
    897  0  stevel 				/* testres */
    898  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    899  0  stevel 				(void) strcat(line, " ");
    900  0  stevel 				(void) strcat(line,
    901  0  stevel 				    nameof_stat4(getxdr_u_long()));
    902  0  stevel 				break;
    903  0  stevel 			case NLMPROC4_LOCK:
    904  0  stevel 			case NLMPROC4_CANCEL:
    905  0  stevel 			case NLMPROC4_UNLOCK:
    906  0  stevel 			case NLMPROC4_GRANTED:
    907  0  stevel 			case NLMPROC4_NM_LOCK:
    908  0  stevel 				/* res */
    909  0  stevel 				(void) strcat(line, sum_netobj("OH"));
    910  0  stevel 				(void) strcat(line, " ");
    911  0  stevel 				(void) strcat(line,
    912  0  stevel 					nameof_stat4(getxdr_u_long()));
    913  0  stevel 				break;
    914  0  stevel 			case NLMPROC4_SHARE:
    915  0  stevel 			case NLMPROC4_UNSHARE:
    916  0  stevel 				/* shareres */
    917  0  stevel 				pl = sum_netobj("OH");
    918  0  stevel 				i = getxdr_u_long();
    919  0  stevel 				sprintf(line, "%s %s %ld",
    920  0  stevel 					pl, nameof_stat4(i), getxdr_long());
    921  0  stevel 				break;
    922  0  stevel 			case NLMPROC4_FREE_ALL:
    923  0  stevel 				break;
    924  0  stevel 			}
    925  0  stevel 		}
    926  0  stevel 	}
    927  0  stevel 
    928  0  stevel 	if (flags & F_DTAIL) {
    929  0  stevel 		show_header("NLM:  ", "Network Lock Manager", len);
    930  0  stevel 		show_space();
    931  0  stevel 		if (setjmp(xdr_err)) {
    932  0  stevel 			return;
    933  0  stevel 		}
    934  0  stevel 		(void) sprintf(get_line(0, 0),
    935  0  stevel 			"Proc = %d (%s)",
    936  0  stevel 			proc, procnames_long_4[proc]);
    937  0  stevel 		if (type == CALL) {
    938  0  stevel 			switch (proc) {
    939  0  stevel 			case NLMPROC4_TEST:
    940  0  stevel 			case NLMPROC4_GRANTED:
    941  0  stevel 			case NLMPROC4_TEST_MSG:
    942  0  stevel 			case NLMPROC4_GRANTED_MSG:
    943  0  stevel 				show_testargs4();
    944  0  stevel 				break;
    945  0  stevel 			case NLMPROC4_LOCK:
    946  0  stevel 			case NLMPROC4_LOCK_MSG:
    947  0  stevel 			case NLMPROC4_NM_LOCK:
    948  0  stevel 				show_lockargs4();
    949  0  stevel 				break;
    950  0  stevel 			case NLMPROC4_CANCEL:
    951  0  stevel 			case NLMPROC4_CANCEL_MSG:
    952  0  stevel 				show_cancargs4();
    953  0  stevel 				break;
    954  0  stevel 			case NLMPROC4_UNLOCK:
    955  0  stevel 			case NLMPROC4_UNLOCK_MSG:
    956  0  stevel 				show_unlockargs4();
    957  0  stevel 				break;
    958  0  stevel 			case NLMPROC4_TEST_RES:
    959  0  stevel 				show_testres4();
    960  0  stevel 				break;
    961  0  stevel 			case NLMPROC4_LOCK_RES:
    962  0  stevel 			case NLMPROC4_CANCEL_RES:
    963  0  stevel 			case NLMPROC4_UNLOCK_RES:
    964  0  stevel 			case NLMPROC4_GRANTED_RES:
    965  0  stevel 				show_res4();
    966  0  stevel 				break;
    967  0  stevel 			case NLMPROC4_SHARE:
    968  0  stevel 			case NLMPROC4_UNSHARE:
    969  0  stevel 				show_shareargs();
    970  0  stevel 				break;
    971  0  stevel 			case NLMPROC4_FREE_ALL:
    972  0  stevel 				show_notify();
    973  0  stevel 				break;
    974  0  stevel 			}
    975  0  stevel 		} else {
    976  0  stevel 			switch (proc) {
    977  0  stevel 			case NLMPROC4_TEST:
    978  0  stevel 				show_testres4();
    979  0  stevel 				break;
    980  0  stevel 			case NLMPROC4_LOCK:
    981  0  stevel 			case NLMPROC4_CANCEL:
    982  0  stevel 			case NLMPROC4_UNLOCK:
    983  0  stevel 			case NLMPROC4_GRANTED:
    984  0  stevel 			case NLM_NM_LOCK:
    985  0  stevel 				show_res4();
    986  0  stevel 				break;
    987  0  stevel 			case NLMPROC4_TEST_MSG:
    988  0  stevel 			case NLMPROC4_LOCK_MSG:
    989  0  stevel 			case NLMPROC4_CANCEL_MSG:
    990  0  stevel 			case NLMPROC4_UNLOCK_MSG:
    991  0  stevel 			case NLMPROC4_GRANTED_MSG:
    992  0  stevel 			case NLMPROC4_TEST_RES:
    993  0  stevel 			case NLMPROC4_LOCK_RES:
    994  0  stevel 			case NLMPROC4_CANCEL_RES:
    995  0  stevel 			case NLMPROC4_UNLOCK_RES:
    996  0  stevel 			case NLMPROC4_GRANTED_RES:
    997  0  stevel 				break;
    998  0  stevel 			case NLM_SHARE:
    999  0  stevel 			case NLM_UNSHARE:
   1000  0  stevel 				show_shareres4();
   1001  0  stevel 				break;
   1002  0  stevel 			case NLM_FREE_ALL:
   1003  0  stevel 				break;
   1004  0  stevel 			}
   1005  0  stevel 		}
   1006  0  stevel 		show_trailer();
   1007  0  stevel 	}
   1008  0  stevel }
   1009  0  stevel 
   1010  0  stevel static char *
   1011  0  stevel sum_lock4()
   1012  0  stevel {
   1013  0  stevel 	static char buff[LM_MAXSTRLEN + 1];
   1014  0  stevel 	char *cp = buff;
   1015  0  stevel 	long id;
   1016  0  stevel 	u_longlong_t off, len;
   1017  0  stevel 
   1018  0  stevel 	(void) getxdr_string(buff, LM_MAXSTRLEN);	/* Caller */
   1019  0  stevel 	(void) strcpy(buff, sum_netobj("FH"));		/* Fh */
   1020  0  stevel 	cp += strlen(buff);
   1021  0  stevel 	skip_netobj();					/* Owner */
   1022  0  stevel 	id  = getxdr_long();
   1023  0  stevel 	off = getxdr_u_longlong();
   1024  0  stevel 	len = getxdr_u_longlong();
   1025  0  stevel 	(void) sprintf(cp, " PID=%ld Region=%llu:%llu", id, off, len);
   1026  0  stevel 	return (buff);
   1027  0  stevel }
   1028  0  stevel 
   1029  0  stevel static void
   1030  0  stevel show_lock4()
   1031  0  stevel {
   1032  0  stevel 	showxdr_string(LM_MAXSTRLEN, "Caller = %s");
   1033  0  stevel 	show_netobj("Filehandle = %s");
   1034  0  stevel 	show_netobj("Lock owner = %s");
   1035  0  stevel 	showxdr_long("Svid = %ld (process id)");
   1036  0  stevel 	showxdr_u_longlong("Offset = %llu bytes");
   1037  0  stevel 	showxdr_u_longlong("Length = %llu bytes");
   1038  0  stevel }
   1039  0  stevel 
   1040  0  stevel static void
   1041  0  stevel show_cancargs4()
   1042  0  stevel {
   1043  0  stevel 	show_netobj("Cookie = %s");
   1044  0  stevel 	showxdr_bool("Block = %s");
   1045  0  stevel 	showxdr_bool("Exclusive = %s");
   1046  0  stevel 	show_lock4();
   1047  0  stevel }
   1048  0  stevel 
   1049  0  stevel static void
   1050  0  stevel show_lockargs4()
   1051  0  stevel {
   1052  0  stevel 	show_netobj("Cookie = %s");
   1053  0  stevel 	showxdr_bool("Block = %s");
   1054  0  stevel 	showxdr_bool("Exclusive = %s");
   1055  0  stevel 	show_lock4();
   1056  0  stevel 	showxdr_bool("Reclaim = %s");
   1057  0  stevel 	showxdr_long("State = %ld");
   1058  0  stevel }
   1059  0  stevel 
   1060  0  stevel static void
   1061  0  stevel show_unlockargs4()
   1062  0  stevel {
   1063  0  stevel 	show_netobj("Cookie = %s");
   1064  0  stevel 	show_lock4();
   1065  0  stevel }
   1066  0  stevel 
   1067  0  stevel static void
   1068  0  stevel show_testargs4()
   1069  0  stevel {
   1070  0  stevel 	show_netobj("Cookie = %s");
   1071  0  stevel 	showxdr_bool("Exclusive = %s");
   1072  0  stevel 	show_lock4();
   1073  0  stevel }
   1074  0  stevel 
   1075  0  stevel static void
   1076  0  stevel show_res4()
   1077  0  stevel {
   1078  0  stevel 	show_netobj("Cookie = %s");
   1079  0  stevel 	(void) show_stat4();
   1080  0  stevel }
   1081  0  stevel 
   1082  0  stevel static char *
   1083  0  stevel nameof_stat4(s)
   1084  0  stevel 	ulong_t s;
   1085  0  stevel {
   1086  0  stevel 	switch ((enum nlm4_stats) s) {
   1087  0  stevel 	case NLM4_GRANTED:	return ("granted");
   1088  0  stevel 	case NLM4_DENIED:	return ("denied");
   1089  0  stevel 	case NLM4_DENIED_NOLOCKS:return ("denied (no locks)");
   1090  0  stevel 	case NLM4_BLOCKED:	return ("blocked");
   1091  0  stevel 	case NLM4_DENIED_GRACE_PERIOD: return ("denied (grace period)");
   1092  0  stevel 	case NLM4_DEADLCK:	return ("deadlock");
   1093  0  stevel 	case NLM4_ROFS:		return ("read-only fs");
   1094  0  stevel 	case NLM4_STALE_FH:	return ("stale fh");
   1095  0  stevel 	case NLM4_FBIG:		return ("file too big");
   1096  0  stevel 	case NLM4_FAILED:	return ("failed");
   1097  0  stevel 	default:		return ("?");
   1098  0  stevel 	}
   1099  0  stevel }
   1100  0  stevel 
   1101  0  stevel static enum nlm4_stats
   1102  0  stevel show_stat4()
   1103  0  stevel {
   1104  0  stevel 	enum nlm4_stats s;
   1105  0  stevel 
   1106  0  stevel 	s = (enum nlm4_stats) getxdr_u_long();
   1107  0  stevel 	(void) sprintf(get_line(0, 0),
   1108  0  stevel 		"Status = %d (%s)",
   1109  0  stevel 		s, nameof_stat4((ulong_t)s));
   1110  0  stevel 
   1111  0  stevel 	return (s);
   1112  0  stevel }
   1113  0  stevel 
   1114  0  stevel static void
   1115  0  stevel show_testres4()
   1116  0  stevel {
   1117  0  stevel 	show_netobj("Cookie = %s");
   1118  0  stevel 	if (show_stat() == NLM4_DENIED) {
   1119  0  stevel 		showxdr_bool("Exclusive = %s");
   1120  0  stevel 		showxdr_long("Svid = %ld (process id)");
   1121  0  stevel 		show_netobj("Owner handle = %s");
   1122  0  stevel 		showxdr_u_longlong("Offset = %llu bytes");
   1123  0  stevel 		showxdr_u_longlong("Length = %llu bytes");
   1124  0  stevel 	}
   1125  0  stevel }
   1126  0  stevel 
   1127  0  stevel static void
   1128  0  stevel show_shareres4()
   1129  0  stevel {
   1130  0  stevel 	show_netobj("Cookie = %s");
   1131  0  stevel 	(void) show_stat4();
   1132  0  stevel 	showxdr_long("Sequence = %d");
   1133  0  stevel }
   1134