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