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 <netinet/in.h>
35#include <rpc/types.h>
36#include <rpc/rpc.h>
37#include <rpc/xdr.h>
38#include <rpc/auth.h>
39#include <rpc/clnt.h>
40#include <rpc/rpc_msg.h>
41#include <rpcsvc/bootparam_prot.h>
42#include "snoop.h"
43
44extern char *dlc_header;
45extern jmp_buf xdr_err;
46
47static void show_address(char *);
48static char *sum_address(void);
49
50static char *procnames_short[] = {
51	"Null",		/*  0 */
52	"WHOAMI?",	/*  1 */
53	"GETFILE",	/*  2 */
54};
55
56static char *procnames_long[] = {
57	"Null procedure",	/*  0 */
58	"Who am I?",		/*  1 */
59	"Get file name",	/*  2 */
60};
61
62#define	MAXPROC	2
63
64void
65interpret_bparam(flags, type, xid, vers, proc, data, len)
66	int flags, type, xid, vers, proc;
67	char *data;
68	int len;
69{
70	char *line;
71	char buff[MAX_PATH_LEN + 1];
72	char buff2[MAX_MACHINE_NAME + 1];
73
74	if (proc < 0 || proc > MAXPROC)
75		return;
76
77	if (flags & F_SUM) {
78		if (setjmp(xdr_err)) {
79			return;
80		}
81
82		line = get_sum_line();
83
84		if (type == CALL) {
85			(void) sprintf(line,
86				"BPARAM C %s",
87				procnames_short[proc]);
88			line += strlen(line);
89
90			switch (proc) {
91			case BOOTPARAMPROC_WHOAMI:
92				(void) sprintf(line, " %s",
93					sum_address());
94				break;
95			case BOOTPARAMPROC_GETFILE:
96				(void) getxdr_string(buff,
97					MAX_MACHINE_NAME);
98				(void) sprintf(line, " %s",
99					getxdr_string(buff,
100					MAX_FILEID));
101				break;
102			}
103
104			check_retransmit(line, xid);
105		} else {
106			(void) sprintf(line, "BPARAM R %s ",
107				procnames_short[proc]);
108			line += strlen(line);
109			switch (proc) {
110			case BOOTPARAMPROC_WHOAMI:
111				(void) getxdr_string(buff,
112					MAX_MACHINE_NAME);
113				(void) getxdr_string(buff2,
114					MAX_MACHINE_NAME);
115				(void) sprintf(line, "%s in %s",
116					buff, buff2);
117				break;
118			case BOOTPARAMPROC_GETFILE:
119				(void) getxdr_string(buff,
120					MAX_MACHINE_NAME);
121				(void) sum_address();
122				(void) sprintf(line, "File=%s",
123					getxdr_string(buff,
124						MAX_PATH_LEN));
125				break;
126			}
127		}
128	}
129
130	if (flags & F_DTAIL) {
131		show_header("BPARAM:  ", "Boot Parameters", len);
132		show_space();
133		if (setjmp(xdr_err)) {
134			return;
135		}
136		(void) sprintf(get_line(0, 0),
137			"Proc = %d (%s)",
138			proc, procnames_long[proc]);
139
140		if (type == CALL) {
141			switch (proc) {
142			case BOOTPARAMPROC_WHOAMI:
143				show_address("Client address");
144				break;
145
146			case BOOTPARAMPROC_GETFILE:
147				(void) showxdr_string(MAX_MACHINE_NAME,
148					"Hostname = %s");
149				(void) showxdr_string(MAX_FILEID,
150					"File = %s");
151				break;
152			}
153		} else {
154			switch (proc) {
155			case BOOTPARAMPROC_WHOAMI:
156				(void) showxdr_string(MAX_MACHINE_NAME,
157					"Client name = %s");
158				(void) showxdr_string(MAX_MACHINE_NAME,
159					"Domain name = %s");
160				show_address("Router addr");
161				break;
162
163			case BOOTPARAMPROC_GETFILE:
164				(void) showxdr_string(MAX_MACHINE_NAME,
165					"Server name = %s");
166				show_address("Server addr");
167				(void) showxdr_string(MAX_PATH_LEN,
168					"Server file = %s");
169				break;
170			}
171		}
172
173		show_trailer();
174	}
175}
176
177static char *
178sum_address()
179{
180	struct in_addr host;
181	extern char *inet_ntoa();
182	int atype;
183
184	atype = getxdr_u_long();
185	if (atype != IP_ADDR_TYPE)
186		return ("?");
187
188	host.S_un.S_un_b.s_b1 = getxdr_char();
189	host.S_un.S_un_b.s_b2 = getxdr_char();
190	host.S_un.S_un_b.s_b3 = getxdr_char();
191	host.S_un.S_un_b.s_b4 = getxdr_char();
192
193	return (inet_ntoa(host));
194}
195
196static void
197show_address(label)
198	char *label;
199{
200	struct in_addr host;
201	extern char *inet_ntoa();
202	int atype;
203
204	atype = getxdr_u_long();
205	if (atype == IP_ADDR_TYPE) {
206		host.S_un.S_un_b.s_b1 = getxdr_char();
207		host.S_un.S_un_b.s_b2 = getxdr_char();
208		host.S_un.S_un_b.s_b3 = getxdr_char();
209		host.S_un.S_un_b.s_b4 = getxdr_char();
210
211		(void) sprintf(get_line(0, 0),
212			"%s = %s (%s)",
213			label,
214			inet_ntoa(host),
215			addrtoname(AF_INET, &host));
216	} else {
217		(void) sprintf(get_line(0, 0),
218		"Router addr = ? (type not known)");
219	}
220}
221