1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright (c) 1991, 1999 by Sun Microsystems, Inc. 24 * All rights reserved. 25 */ 26 27 #ident "%Z%%M% %I% %E% SMI" /* SunOS */ 28 29 #include <sys/types.h> 30 #include <sys/errno.h> 31 #include <setjmp.h> 32 #include <string.h> 33 34 #include <sys/socket.h> 35 #include <sys/sockio.h> 36 #include <sys/tiuser.h> 37 #include <net/if.h> 38 #include <netinet/in_systm.h> 39 #include <netinet/in.h> 40 #include <rpc/types.h> 41 #include <rpc/xdr.h> 42 #include <rpc/auth.h> 43 #include <rpc/clnt.h> 44 #include <rpc/rpc_msg.h> 45 #include <rpcsvc/yp_prot.h> 46 #include "snoop.h" 47 48 extern char *dlc_header; 49 extern jmp_buf xdr_err; 50 char *ypbind_error(); 51 char *sum_ypxfrstat(); 52 char *sum_ypmaplist(); 53 void detail_ypmaplist(); 54 55 static void niscall(int); 56 static void nisreply(int); 57 static int detail_ypstat(void); 58 static int sum_ypstat(char *); 59 60 /* 61 * Defines missing from 5.0 yp_prot.h 62 */ 63 #define YPBINDPROG ((ulong_t)100007) 64 #define YPBINDVERS ((ulong_t)2) 65 #define YPBINDVERS_ORIG ((ulong_t)1) 66 67 /* Procedure symbols */ 68 69 #define YPBINDPROC_NULL ((ulong_t)0) 70 #define YPBINDPROC_DOMAIN ((ulong_t)1) 71 #define YPBINDPROC_SETDOM ((ulong_t)2) 72 73 #define YPBIND_ERR_ERR 1 /* Internal error */ 74 #define YPBIND_ERR_NOSERV 2 /* No bound server for passed domain */ 75 #define YPBIND_ERR_RESC 3 /* System resource allocation failure */ 76 77 78 static char *procnames_bind_short[] = { 79 "NULL", /* 0 */ 80 "DOMAIN", /* 1 */ 81 "SETDOMAIN", /* 2 */ 82 }; 83 84 static char *procnames_bind_long[] = { 85 "Null procedure", /* 0 */ 86 "Get domain name", /* 1 */ 87 "Set domain name", /* 2 */ 88 }; 89 90 static char *procnames_short[] = { 91 "NULL", /* 0 */ 92 "DOMAIN", /* 1 */ 93 "DOMAIN_NONACK", /* 2 */ 94 "MATCH", /* 3 */ 95 "FIRST", /* 4 */ 96 "NEXT", /* 5 */ 97 "XFR", /* 6 */ 98 "CLEAR", /* 7 */ 99 "ALL", /* 8 */ 100 "MASTER", /* 9 */ 101 "ORDER", /* 10 */ 102 "MAPLIST", /* 11 */ 103 "NEWXFR", /* 12 */ 104 }; 105 106 #define MAXPROC_BIND 2 107 #define MAXPROC 12 108 109 static char *procnames_long[] = { 110 "Null procedure", /* 0 */ 111 "Verify domain support", /* 1 */ 112 "Verify domain support (broadcast)", /* 2 */ 113 "Return value of a key", /* 3 */ 114 "Return first key-value pair in map", /* 4 */ 115 "Return next key-value pair in map", /* 5 */ 116 "Request map update (old)", /* 6 */ 117 "Close current map on server", /* 7 */ 118 "Get all key-value pairs in map", /* 8 */ 119 "Get master server", /* 9 */ 120 "Get order", /* 10 */ 121 "Return list of supported maps", /* 11 */ 122 "Request map update", /* 12 */ 123 }; 124 125 void 126 interpret_nisbind(flags, type, xid, vers, proc, data, len) 127 int flags, type, xid, vers, proc; 128 char *data; 129 int len; 130 { 131 char *line; 132 char buff[YPMAXDOMAIN + 1]; 133 unsigned int status; 134 135 if (proc < 0 || proc > MAXPROC_BIND) 136 return; 137 138 if (flags & F_SUM) { 139 if (setjmp(xdr_err)) { 140 return; 141 } 142 143 line = get_sum_line(); 144 145 if (type == CALL) { 146 (void) sprintf(line, 147 "NISBIND C %s", 148 procnames_bind_short[proc]); 149 line += strlen(line); 150 switch (proc) { 151 case YPBINDPROC_NULL: 152 break; 153 case YPBINDPROC_DOMAIN: 154 (void) sprintf(line, " %s", 155 getxdr_string(buff, YPMAXDOMAIN)); 156 break; 157 case YPBINDPROC_SETDOM: 158 (void) sprintf(line, " %s", 159 getxdr_string(buff, YPMAXDOMAIN)); 160 break; 161 default: 162 break; 163 } 164 check_retransmit(line, xid); 165 } else { 166 (void) sprintf(line, "NISBIND R %s ", 167 procnames_bind_short[proc]); 168 line += strlen(line); 169 switch (proc) { 170 case YPBINDPROC_NULL: 171 break; 172 case YPBINDPROC_DOMAIN: 173 status = getxdr_long(); 174 if (status == 1) { /* success */ 175 (void) strcat(line, "OK"); 176 } else { /* failure */ 177 status = getxdr_long(); 178 (void) sprintf(line, "ERROR=%s", 179 ypbind_error(status)); 180 } 181 break; 182 case YPBINDPROC_SETDOM: 183 break; 184 default: 185 break; 186 } 187 } 188 } 189 190 if (flags & F_DTAIL) { 191 show_header("NISBIND:", 192 "Network Information Service Bind", len); 193 show_space(); 194 if (setjmp(xdr_err)) { 195 return; 196 } 197 (void) sprintf(get_line(0, 0), 198 "Proc = %d (%s)", 199 proc, procnames_bind_long[proc]); 200 if (type == CALL) { 201 switch (proc) { 202 case YPBINDPROC_NULL: 203 break; 204 case YPBINDPROC_DOMAIN: 205 (void) showxdr_string(YPMAXDOMAIN, 206 "Domain = %s"); 207 break; 208 case YPBINDPROC_SETDOM: 209 (void) showxdr_string(YPMAXDOMAIN, 210 "Domain = %s"); 211 (void) showxdr_hex(4, "Address=%s"); 212 (void) showxdr_hex(2, "Port=%s"); 213 (void) showxdr_u_long("Version=%lu"); 214 break; 215 default: 216 break; 217 } 218 } else { 219 switch (proc) { 220 case YPBINDPROC_NULL: 221 break; 222 case YPBINDPROC_DOMAIN: 223 status = getxdr_u_long(); 224 (void) sprintf(get_line(0, 0), 225 "Status = %lu (%s)", 226 status, 227 status == 1 ? "OK":"Fail"); 228 if (status == 1) { 229 (void) showxdr_hex(4, 230 "Address=%s"); 231 (void) showxdr_hex(2, 232 "Port=%s"); 233 } else { 234 status = getxdr_u_long(); 235 (void) sprintf(get_line(0, 0), 236 "Error = %lu (%s)", 237 status, 238 ypbind_error(status)); 239 } 240 break; 241 case YPBINDPROC_SETDOM: 242 break; 243 default: 244 break; 245 } 246 } 247 show_trailer(); 248 } 249 } 250 251 void 252 interpret_nis(flags, type, xid, vers, proc, data, len) 253 int flags, type, xid, vers, proc; 254 char *data; 255 int len; 256 { 257 char *line; 258 char *dom, *map, *key; 259 int transid, status; 260 /* buffers are all the same size so we don't have to keep track */ 261 char buff1[YPMAXRECORD + 1], buff2[YPMAXRECORD + 1]; 262 char buff3[YPMAXRECORD + 1]; 263 264 if (flags & F_SUM) { 265 if (setjmp(xdr_err)) { 266 return; 267 } 268 269 line = get_sum_line(); 270 271 if (type == CALL) { 272 if (proc > MAXPROC) 273 (void) sprintf(line, "NIS C %d", proc); 274 else 275 (void) sprintf(line, 276 "NIS C %s", 277 procnames_short[proc]); 278 line += strlen(line); 279 switch (proc) { 280 case YPPROC_NULL: 281 break; 282 case YPPROC_DOMAIN: 283 case YPPROC_DOMAIN_NONACK: 284 case YPPROC_MAPLIST: 285 /* YPMAXDOMAIN > YPMAXMAP */ 286 (void) sprintf(line, " %s", 287 getxdr_string(buff1, YPMAXDOMAIN)); 288 break; 289 case YPPROC_FIRST: 290 dom = getxdr_string(buff1, YPMAXDOMAIN); 291 map = getxdr_string(buff2, YPMAXMAP); 292 (void) sprintf(line, " %s", map); 293 break; 294 case YPPROC_MATCH: 295 case YPPROC_NEXT: 296 dom = getxdr_string(buff1, YPMAXDOMAIN); 297 map = getxdr_string(buff2, YPMAXMAP); 298 key = getxdr_string(buff3, YPMAXRECORD); 299 (void) sprintf(line, 300 " %s in %s", 301 key, map); 302 break; 303 case YPPROC_NEWXFR: 304 case YPPROC_XFR: 305 dom = getxdr_string(buff1, YPMAXDOMAIN); 306 map = getxdr_string(buff2, YPMAXMAP); 307 (void) sprintf(line, 308 " map %s in %s", 309 map, dom); 310 break; 311 case YPPROC_CLEAR: 312 break; 313 case YPPROC_ALL: 314 case YPPROC_MASTER: 315 case YPPROC_ORDER: 316 dom = getxdr_string(buff1, YPMAXDOMAIN); 317 map = getxdr_string(buff2, YPMAXMAP); 318 (void) sprintf(line, 319 " map %s in %s", 320 map, dom); 321 break; 322 default: 323 break; 324 } 325 check_retransmit(line, xid); 326 } else { 327 if (proc > MAXPROC) 328 (void) sprintf(line, "NIS R %d ", proc); 329 else 330 (void) sprintf(line, "NIS R %s ", 331 procnames_short[proc]); 332 line += strlen(line); 333 switch (proc) { 334 case YPPROC_NULL: 335 break; 336 case YPPROC_DOMAIN: 337 case YPPROC_DOMAIN_NONACK: 338 (void) sprintf(line, "%s", 339 getxdr_long() ? "OK":"Fail"); 340 break; 341 case YPPROC_MATCH: 342 (void) sum_ypstat(line); 343 break; 344 case YPPROC_FIRST: 345 case YPPROC_NEXT: 346 if (sum_ypstat(line) == YP_TRUE) { 347 line += strlen(line); 348 (void) getxdr_string(buff1, 349 YPMAXRECORD); 350 (void) sprintf(line, " key=%s", 351 getxdr_string(buff1, 352 YPMAXRECORD)); 353 } 354 break; 355 case YPPROC_NEWXFR: 356 case YPPROC_XFR: 357 transid = getxdr_u_long(); 358 status = getxdr_long(); 359 (void) sprintf(line, "transid=%lu %s", 360 transid, 361 sum_ypxfrstat(status)); 362 break; 363 case YPPROC_CLEAR: 364 break; 365 case YPPROC_ALL: 366 if (getxdr_u_long()) { 367 (void) sum_ypstat(line); 368 line += strlen(line); 369 (void) sprintf(line, " key=%s", 370 getxdr_string(buff1, YPMAXRECORD)); 371 } else { 372 (void) sprintf(line, 373 "No more"); 374 } 375 break; 376 case YPPROC_MASTER: 377 if (sum_ypstat(line) == YP_TRUE) { 378 line += strlen(line); 379 (void) sprintf(line, " peer=%s", 380 getxdr_string(buff1, 381 YPMAXPEER)); 382 } 383 break; 384 case YPPROC_ORDER: 385 if (sum_ypstat(line) == YP_TRUE) { 386 line += strlen(line); 387 (void) sprintf(line, " order=%lu", 388 getxdr_u_long()); 389 } 390 break; 391 case YPPROC_MAPLIST: 392 if (sum_ypstat(line) == YP_TRUE) { 393 line += strlen(line); 394 (void) sprintf(line, " %s", 395 sum_ypmaplist()); 396 } 397 break; 398 default: 399 break; 400 } 401 } 402 } 403 404 if (flags & F_DTAIL) { 405 show_header("NIS: ", "Network Information Service", len); 406 show_space(); 407 if (setjmp(xdr_err)) { 408 return; 409 } 410 (void) sprintf(get_line(0, 0), 411 "Proc = %d (%s)", 412 proc, 413 proc > MAXPROC ? "unknown" : procnames_long[proc]); 414 if (type == CALL) 415 niscall(proc); 416 else 417 nisreply(proc); 418 show_trailer(); 419 } 420 } 421 422 /* 423 * Print out version 2 NIS call packets 424 */ 425 426 static void 427 niscall(proc) 428 int proc; 429 { 430 switch (proc) { 431 case YPPROC_NULL: 432 break; 433 case YPPROC_DOMAIN: 434 case YPPROC_DOMAIN_NONACK: 435 case YPPROC_MAPLIST: 436 (void) showxdr_string(YPMAXDOMAIN, "Domain = %s"); 437 break; 438 case YPPROC_FIRST: 439 (void) showxdr_string(YPMAXDOMAIN, "Domain = %s"); 440 (void) showxdr_string(YPMAXMAP, "Map = %s"); 441 break; 442 case YPPROC_MATCH: 443 case YPPROC_NEXT: 444 (void) showxdr_string(YPMAXDOMAIN, "Domain = %s"); 445 (void) showxdr_string(YPMAXMAP, "Map = %s"); 446 (void) showxdr_string(YPMAXRECORD, "Key = %s"); 447 break; 448 case YPPROC_NEWXFR: 449 (void) showxdr_string(YPMAXDOMAIN, "Domain = %s"); 450 (void) showxdr_string(YPMAXMAP, "Map = %s"); 451 (void) showxdr_u_long("Order = %lu"); 452 (void) showxdr_string(YPMAXPEER, "Peer = %s"); 453 (void) showxdr_u_long("Transid = %lu"); 454 (void) showxdr_u_long("Prog = %lu"); 455 (void) showxdr_string(YPMAXPEER, "Name = %s"); 456 break; 457 case YPPROC_XFR: 458 (void) showxdr_string(YPMAXDOMAIN, "Domain = %s"); 459 (void) showxdr_string(YPMAXMAP, "Map = %s"); 460 (void) showxdr_u_long("Order = %lu"); 461 (void) showxdr_string(YPMAXPEER, "Peer = %s"); 462 (void) showxdr_u_long("Transid = %lu"); 463 (void) showxdr_u_long("Prog = %lu"); 464 (void) showxdr_u_long("Port = %lu"); 465 break; 466 case YPPROC_CLEAR: 467 break; 468 case YPPROC_ALL: 469 case YPPROC_MASTER: 470 case YPPROC_ORDER: 471 (void) showxdr_string(YPMAXDOMAIN, "Domain = %s"); 472 (void) showxdr_string(YPMAXMAP, "Map = %s"); 473 break; 474 default: 475 break; 476 } 477 } 478 479 /* 480 * Print out version 2 NIS reply packets 481 */ 482 483 void 484 nisreply(proc) 485 int proc; 486 { 487 unsigned int xfrstat, more; 488 489 switch (proc) { 490 case YPPROC_NULL: 491 break; 492 case YPPROC_DOMAIN: 493 case YPPROC_DOMAIN_NONACK: 494 (void) sprintf(get_line(0, 0), 495 "Result=%s", 496 getxdr_u_long() ? "OK":"Fail"); 497 break; 498 case YPPROC_MATCH: 499 (void) detail_ypstat(); 500 (void) showxdr_string(YPMAXRECORD, "Value = %s"); 501 break; 502 case YPPROC_FIRST: 503 case YPPROC_NEXT: 504 (void) detail_ypstat(); 505 (void) showxdr_string(YPMAXRECORD, "Value = %s"); 506 (void) showxdr_string(YPMAXRECORD, "Key = %s"); 507 break; 508 case YPPROC_NEWXFR: 509 case YPPROC_XFR: 510 (void) showxdr_u_long("Transid = %lu"); 511 xfrstat = getxdr_u_long(); 512 (void) sprintf(get_line(0, 0), 513 "Transfer status = %lu (%s)", 514 xfrstat, sum_ypxfrstat(xfrstat)); 515 break; 516 case YPPROC_CLEAR: 517 break; 518 case YPPROC_ALL: 519 more = getxdr_u_long(); 520 (void) sprintf(get_line(0, 0), 521 "More = %s", 522 more ? "true" : "false"); 523 if (more) { 524 (void) detail_ypstat(); 525 (void) showxdr_string(YPMAXRECORD, "Value = %s"); 526 (void) showxdr_string(YPMAXRECORD, "Key = %s"); 527 } 528 break; 529 case YPPROC_MASTER: 530 (void) detail_ypstat(); 531 (void) showxdr_string(YPMAXPEER, "Peer = %s"); 532 case YPPROC_ORDER: 533 (void) detail_ypstat(); 534 (void) showxdr_u_long("Order=%lu"); 535 break; 536 case YPPROC_MAPLIST: 537 (void) detail_ypstat(); 538 detail_ypmaplist(); 539 break; 540 default: 541 break; 542 } 543 } 544 545 char * 546 sum_ypxfrstat(status) 547 int status; 548 { 549 static char buff [16]; 550 551 switch (status) { 552 case 1: return ("Success"); 553 case 2: return ("Master's version not newer"); 554 case -1: return ("Can't find server for map"); 555 case -2: return ("No such domain"); 556 case -3: return ("Resource allocation failure"); 557 case -4: return ("RPC failure talking to server"); 558 case -5: return ("Can't get master address"); 559 case -6: return ("NIS server/map db error"); 560 case -7: return ("Bad arguments"); 561 case -8: return ("Local dbm operation failed"); 562 case -9: return ("Local file I/O operation failed"); 563 case -10: return ("Map version skew during transfer"); 564 case -11: return ("Can't send clear req to local ypserv"); 565 case -12: return ("No local order number in map"); 566 case -13: return ("Transfer error"); 567 case -14: return ("Transfer request refused"); 568 default: 569 (void) sprintf(buff, "(%d)", status); 570 return (buff); 571 } 572 /* NOTREACHED */ 573 } 574 575 static int 576 sum_ypstat(line) 577 char *line; 578 { 579 ulong_t status; 580 char *str; 581 char buff[16]; 582 583 status = getxdr_u_long(); 584 switch (status) { 585 case YP_TRUE: str = "OK"; break; 586 case YP_NOMORE: str = "No more entries"; break; 587 case YP_FALSE: str = "Fail"; break; 588 case YP_NOMAP: str = "No such map"; break; 589 case YP_NODOM: str = "No such domain"; break; 590 case YP_NOKEY: str = "No such key"; break; 591 case YP_BADOP: str = "Invalid operation"; break; 592 case YP_BADDB: str = "Bad database"; break; 593 case YP_YPERR: str = "Server error"; break; 594 case YP_BADARGS:str = "Bad args"; break; 595 case YP_VERS: str = "Version mismatch"; break; 596 default: (void) sprintf(buff, "(%lu)", status); 597 str = buff; 598 break; 599 } 600 (void) strcpy(line, str); 601 return ((int)status); 602 } 603 604 static int 605 detail_ypstat() 606 { 607 ulong_t status; 608 char buff[32]; 609 610 611 status = sum_ypstat(buff); 612 (void) sprintf(get_line(0, 0), 613 "Status = %d (%s)", 614 status, buff); 615 616 return ((int)status); 617 } 618 619 char * 620 sum_ypmaplist() 621 { 622 static char buff[YPMAXMAP + 1]; 623 int maps = 0; 624 625 if (setjmp(xdr_err)) { 626 (void) sprintf(buff, "%d+ maps", maps); 627 return (buff); 628 } 629 630 while (getxdr_long()) { 631 (void) getxdr_string(buff, YPMAXMAP); 632 maps++; 633 } 634 635 (void) sprintf(buff, "%d maps", maps); 636 return (buff); 637 } 638 639 void 640 detail_ypmaplist() 641 { 642 int maps = 0; 643 644 if (setjmp(xdr_err)) { 645 (void) sprintf(get_line(0, 0), 646 " %d+ maps. (Frame is incomplete)", 647 maps); 648 return; 649 } 650 651 (void) sprintf(get_line(0, 0), "Map list"); 652 653 while (getxdr_long()) { 654 (void) showxdr_string(YPMAXMAP, " %s"); 655 maps++; 656 } 657 658 (void) sprintf(get_line(0, 0), "%d maps", maps); 659 } 660 661 char * 662 ypbind_error(err) 663 int err; 664 { 665 static char buff[16]; 666 667 switch (err) { 668 case YPBIND_ERR_ERR: return ("Internal error"); 669 case YPBIND_ERR_NOSERV: return ("Internal error"); 670 case YPBIND_ERR_RESC: return ("Resource allocation fail"); 671 default: 672 (void) sprintf(buff, "(%d)", err); 673 return (buff); 674 } 675 /* NOTREACHED */ 676 } 677