snoop_bparam.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
990b4856d0eaada6f8140335733a1b1771ed2746lling/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * CDDL HEADER START
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * The contents of this file are subject to the terms of the
990b4856d0eaada6f8140335733a1b1771ed2746lling * Common Development and Distribution License, Version 1.0 only
990b4856d0eaada6f8140335733a1b1771ed2746lling * (the "License"). You may not use this file except in compliance
990b4856d0eaada6f8140335733a1b1771ed2746lling * with the License.
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
990b4856d0eaada6f8140335733a1b1771ed2746lling * or http://www.opensolaris.org/os/licensing.
990b4856d0eaada6f8140335733a1b1771ed2746lling * See the License for the specific language governing permissions
990b4856d0eaada6f8140335733a1b1771ed2746lling * and limitations under the License.
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * When distributing Covered Code, include this CDDL HEADER in each
990b4856d0eaada6f8140335733a1b1771ed2746lling * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
990b4856d0eaada6f8140335733a1b1771ed2746lling * If applicable, add the following below this CDDL HEADER, with the
990b4856d0eaada6f8140335733a1b1771ed2746lling * fields enclosed by brackets "[]" replaced with your own identifying
990b4856d0eaada6f8140335733a1b1771ed2746lling * information: Portions Copyright [yyyy] [name of copyright owner]
990b4856d0eaada6f8140335733a1b1771ed2746lling *
990b4856d0eaada6f8140335733a1b1771ed2746lling * CDDL HEADER END
990b4856d0eaada6f8140335733a1b1771ed2746lling */
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson/*
990b4856d0eaada6f8140335733a1b1771ed2746lling * Copyright (c) 1991, 1999 by Sun Microsystems, Inc.
990b4856d0eaada6f8140335733a1b1771ed2746lling * All rights reserved.
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens */
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens#ident "%Z%%M% %I% %E% SMI" /* SunOS */
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <sys/types.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <sys/errno.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <setjmp.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <string.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <netinet/in.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <rpc/types.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <rpc/rpc.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <rpc/xdr.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <rpc/auth.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <rpc/clnt.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <rpc/rpc_msg.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include <rpcsvc/bootparam_prot.h>
990b4856d0eaada6f8140335733a1b1771ed2746lling#include "snoop.h"
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746llingextern char *dlc_header;
990b4856d0eaada6f8140335733a1b1771ed2746llingextern jmp_buf xdr_err;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic void show_address(char *);
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic char *sum_address(void);
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic char *procnames_short[] = {
990b4856d0eaada6f8140335733a1b1771ed2746lling "Null", /* 0 */
990b4856d0eaada6f8140335733a1b1771ed2746lling "WHOAMI?", /* 1 */
990b4856d0eaada6f8140335733a1b1771ed2746lling "GETFILE", /* 2 */
990b4856d0eaada6f8140335733a1b1771ed2746lling};
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic char *procnames_long[] = {
990b4856d0eaada6f8140335733a1b1771ed2746lling "Null procedure", /* 0 */
990b4856d0eaada6f8140335733a1b1771ed2746lling "Who am I?", /* 1 */
990b4856d0eaada6f8140335733a1b1771ed2746lling "Get file name", /* 2 */
990b4856d0eaada6f8140335733a1b1771ed2746lling};
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling#define MAXPROC 2
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746llingvoid
990b4856d0eaada6f8140335733a1b1771ed2746llinginterpret_bparam(flags, type, xid, vers, proc, data, len)
990b4856d0eaada6f8140335733a1b1771ed2746lling int flags, type, xid, vers, proc;
990b4856d0eaada6f8140335733a1b1771ed2746lling char *data;
990b4856d0eaada6f8140335733a1b1771ed2746lling int len;
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling char *line;
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson char buff[MAX_PATH_LEN + 1];
990b4856d0eaada6f8140335733a1b1771ed2746lling char buff2[MAX_MACHINE_NAME + 1];
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (proc < 0 || proc > MAXPROC)
990b4856d0eaada6f8140335733a1b1771ed2746lling return;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (flags & F_SUM) {
990b4856d0eaada6f8140335733a1b1771ed2746lling if (setjmp(xdr_err)) {
990b4856d0eaada6f8140335733a1b1771ed2746lling return;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick line = get_sum_line();
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick
990b4856d0eaada6f8140335733a1b1771ed2746lling if (type == CALL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) sprintf(line,
990b4856d0eaada6f8140335733a1b1771ed2746lling "BPARAM C %s",
990b4856d0eaada6f8140335733a1b1771ed2746lling procnames_short[proc]);
990b4856d0eaada6f8140335733a1b1771ed2746lling line += strlen(line);
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling switch (proc) {
990b4856d0eaada6f8140335733a1b1771ed2746lling case BOOTPARAMPROC_WHOAMI:
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) sprintf(line, " %s",
990b4856d0eaada6f8140335733a1b1771ed2746lling sum_address());
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case BOOTPARAMPROC_GETFILE:
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) getxdr_string(buff,
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick MAX_MACHINE_NAME);
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick (void) sprintf(line, " %s",
b24ab6762772a3f6a89393947930c7fa61306783Jeff Bonwick getxdr_string(buff,
990b4856d0eaada6f8140335733a1b1771ed2746lling MAX_FILEID));
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson
990b4856d0eaada6f8140335733a1b1771ed2746lling check_retransmit(line, xid);
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) sprintf(line, "BPARAM R %s ",
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson procnames_short[proc]);
990b4856d0eaada6f8140335733a1b1771ed2746lling line += strlen(line);
990b4856d0eaada6f8140335733a1b1771ed2746lling switch (proc) {
990b4856d0eaada6f8140335733a1b1771ed2746lling case BOOTPARAMPROC_WHOAMI:
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) getxdr_string(buff,
990b4856d0eaada6f8140335733a1b1771ed2746lling MAX_MACHINE_NAME);
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson (void) getxdr_string(buff2,
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson MAX_MACHINE_NAME);
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson (void) sprintf(line, "%s in %s",
990b4856d0eaada6f8140335733a1b1771ed2746lling buff, buff2);
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson break;
990b4856d0eaada6f8140335733a1b1771ed2746lling case BOOTPARAMPROC_GETFILE:
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) getxdr_string(buff,
990b4856d0eaada6f8140335733a1b1771ed2746lling MAX_MACHINE_NAME);
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) sum_address();
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson (void) sprintf(line, "File=%s",
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson getxdr_string(buff,
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson MAX_PATH_LEN));
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson }
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (flags & F_DTAIL) {
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson show_header("BPARAM: ", "Boot Parameters", len);
990b4856d0eaada6f8140335733a1b1771ed2746lling show_space();
990b4856d0eaada6f8140335733a1b1771ed2746lling if (setjmp(xdr_err)) {
83d7f9fe6bbb3e281a1ca55fdc5d1ec82ecc3e70Tom Erickson return;
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens }
4445fffbbb1ea25fd0e9ea68b9380dd7a6709025Matthew Ahrens (void) sprintf(get_line(0, 0),
990b4856d0eaada6f8140335733a1b1771ed2746lling "Proc = %d (%s)",
990b4856d0eaada6f8140335733a1b1771ed2746lling proc, procnames_long[proc]);
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling if (type == CALL) {
990b4856d0eaada6f8140335733a1b1771ed2746lling switch (proc) {
990b4856d0eaada6f8140335733a1b1771ed2746lling case BOOTPARAMPROC_WHOAMI:
990b4856d0eaada6f8140335733a1b1771ed2746lling show_address("Client address");
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling case BOOTPARAMPROC_GETFILE:
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) showxdr_string(MAX_MACHINE_NAME,
990b4856d0eaada6f8140335733a1b1771ed2746lling "Hostname = %s");
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) showxdr_string(MAX_FILEID,
990b4856d0eaada6f8140335733a1b1771ed2746lling "File = %s");
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
990b4856d0eaada6f8140335733a1b1771ed2746lling switch (proc) {
990b4856d0eaada6f8140335733a1b1771ed2746lling case BOOTPARAMPROC_WHOAMI:
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) showxdr_string(MAX_MACHINE_NAME,
990b4856d0eaada6f8140335733a1b1771ed2746lling "Client name = %s");
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) showxdr_string(MAX_MACHINE_NAME,
990b4856d0eaada6f8140335733a1b1771ed2746lling "Domain name = %s");
990b4856d0eaada6f8140335733a1b1771ed2746lling show_address("Router addr");
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling case BOOTPARAMPROC_GETFILE:
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) showxdr_string(MAX_MACHINE_NAME,
990b4856d0eaada6f8140335733a1b1771ed2746lling "Server name = %s");
990b4856d0eaada6f8140335733a1b1771ed2746lling show_address("Server addr");
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) showxdr_string(MAX_PATH_LEN,
990b4856d0eaada6f8140335733a1b1771ed2746lling "Server file = %s");
990b4856d0eaada6f8140335733a1b1771ed2746lling break;
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling show_trailer();
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic char *
990b4856d0eaada6f8140335733a1b1771ed2746llingsum_address()
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling struct in_addr host;
990b4856d0eaada6f8140335733a1b1771ed2746lling extern char *inet_ntoa();
990b4856d0eaada6f8140335733a1b1771ed2746lling int atype;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling atype = getxdr_u_long();
990b4856d0eaada6f8140335733a1b1771ed2746lling if (atype != IP_ADDR_TYPE)
990b4856d0eaada6f8140335733a1b1771ed2746lling return ("?");
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling host.S_un.S_un_b.s_b1 = getxdr_char();
990b4856d0eaada6f8140335733a1b1771ed2746lling host.S_un.S_un_b.s_b2 = getxdr_char();
990b4856d0eaada6f8140335733a1b1771ed2746lling host.S_un.S_un_b.s_b3 = getxdr_char();
990b4856d0eaada6f8140335733a1b1771ed2746lling host.S_un.S_un_b.s_b4 = getxdr_char();
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling return (inet_ntoa(host));
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746llingstatic void
990b4856d0eaada6f8140335733a1b1771ed2746llingshow_address(label)
990b4856d0eaada6f8140335733a1b1771ed2746lling char *label;
990b4856d0eaada6f8140335733a1b1771ed2746lling{
990b4856d0eaada6f8140335733a1b1771ed2746lling struct in_addr host;
990b4856d0eaada6f8140335733a1b1771ed2746lling extern char *inet_ntoa();
990b4856d0eaada6f8140335733a1b1771ed2746lling int atype;
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling atype = getxdr_u_long();
990b4856d0eaada6f8140335733a1b1771ed2746lling if (atype == IP_ADDR_TYPE) {
990b4856d0eaada6f8140335733a1b1771ed2746lling host.S_un.S_un_b.s_b1 = getxdr_char();
990b4856d0eaada6f8140335733a1b1771ed2746lling host.S_un.S_un_b.s_b2 = getxdr_char();
990b4856d0eaada6f8140335733a1b1771ed2746lling host.S_un.S_un_b.s_b3 = getxdr_char();
990b4856d0eaada6f8140335733a1b1771ed2746lling host.S_un.S_un_b.s_b4 = getxdr_char();
990b4856d0eaada6f8140335733a1b1771ed2746lling
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) sprintf(get_line(0, 0),
990b4856d0eaada6f8140335733a1b1771ed2746lling "%s = %s (%s)",
990b4856d0eaada6f8140335733a1b1771ed2746lling label,
990b4856d0eaada6f8140335733a1b1771ed2746lling inet_ntoa(host),
990b4856d0eaada6f8140335733a1b1771ed2746lling addrtoname(AF_INET, &host));
990b4856d0eaada6f8140335733a1b1771ed2746lling } else {
990b4856d0eaada6f8140335733a1b1771ed2746lling (void) sprintf(get_line(0, 0),
990b4856d0eaada6f8140335733a1b1771ed2746lling "Router addr = ? (type not known)");
990b4856d0eaada6f8140335733a1b1771ed2746lling }
990b4856d0eaada6f8140335733a1b1771ed2746lling}
990b4856d0eaada6f8140335733a1b1771ed2746lling