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