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 44 extern char *dlc_header; 45 extern jmp_buf xdr_err; 46 47 static void show_address(char *); 48 static char *sum_address(void); 49 50 static char *procnames_short[] = { 51 "Null", /* 0 */ 52 "WHOAMI?", /* 1 */ 53 "GETFILE", /* 2 */ 54 }; 55 56 static char *procnames_long[] = { 57 "Null procedure", /* 0 */ 58 "Who am I?", /* 1 */ 59 "Get file name", /* 2 */ 60 }; 61 62 #define MAXPROC 2 63 64 void 65 interpret_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 177 static char * 178 sum_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 196 static void 197 show_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