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
interpret_nisbind(flags,type,xid,vers,proc,data,len)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
interpret_nis(flags,type,xid,vers,proc,data,len)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
niscall(proc)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
nisreply(proc)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 *
sum_ypxfrstat(status)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
sum_ypstat(line)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
detail_ypstat()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 *
sum_ypmaplist()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
detail_ypmaplist()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 *
ypbind_error(err)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