OpenBSD-4.6/usr.sbin/mopd/common/dl.c

Compare this file to the similar file:
Show the results in this format:

/*	$OpenBSD: dl.c,v 1.7 2006/04/17 13:17:07 maja Exp $ */

/*
 * Copyright (c) 1993-95 Mats O Jansson.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef lint
static const char rcsid[] =
    "$OpenBSD: dl.c,v 1.7 2006/04/17 13:17:07 maja Exp $";
#endif

#include "os.h"
#include "common/get.h"
#include "common/print.h"
#include "common/mopdef.h"

void
mopDumpDL(FILE *fd, u_char *pkt, int trans)
{
	int	i, idx = 0;
	long	tmpl;
	u_char	tmpc, c, program[17], code, *ucp;
	u_short	len, tmps, moplen;

	len = mopGetLength(pkt, trans);

	switch (trans) {
	case TRANS_8023:
		idx = 22;
		moplen = len - 8;
		break;
	default:
		idx = 16;
		moplen = len;
	}
	code = mopGetChar(pkt, &idx);

	switch (code) {
	case MOP_K_CODE_MLT:
		tmpc = mopGetChar(pkt, &idx);	/* Load Number */
		fprintf(fd, "Load Number  :   %02x\n", tmpc);

		if (moplen > 6) {
			tmpl = mopGetLong(pkt, &idx);/* Load Address */
			fprintf(fd, "Load Address : %08lx\n", tmpl);
		}

		if (moplen > 10) {
			for (i = 0; i < (moplen - 10); i++) {
				if ((i % 16) == 0) {
					if ((i / 16) == 0)
						fprintf(fd,
						    "Image Data   : %04x ",
						    moplen-10);
					else
						fprintf(fd,
						    "                    ");
				}

				fprintf(fd, "%02x ", mopGetChar(pkt, &idx));
				if ((i % 16) == 15)
					fprintf(fd, "\n");
			}

			if ((i % 16) != 15)
				fprintf(fd, "\n");
		}

		tmpl = mopGetLong(pkt, &idx);	/* Load Address */
		fprintf(fd, "Xfer Address : %08lx\n", tmpl);
		break;
	case MOP_K_CODE_DCM:
		/* Empty Message */
		break;
	case MOP_K_CODE_MLD:
		tmpc = mopGetChar(pkt, &idx);	/* Load Number */
		fprintf(fd, "Load Number  :   %02x\n", tmpc);

		tmpl = mopGetLong(pkt, &idx);	/* Load Address */
		fprintf(fd, "Load Address : %08lx\n", tmpl);

		if (moplen > 6) {
			for (i = 0; i < (moplen - 6); i++) {
				if ((i % 16) == 0)
					if ((i / 16) == 0)
						fprintf(fd,
						    "Image Data   : %04x ",
						    moplen-6);
					else
						fprintf(fd,
						    "                    ");

				fprintf(fd, "%02x ", mopGetChar(pkt, &idx));
				if ((i % 16) == 15)
					fprintf(fd, "\n");
			}

			if ((i % 16) != 15)
				fprintf(fd, "\n");
		}
		break;
	case MOP_K_CODE_ASV:
		/* Empty Message */
		break;
	case MOP_K_CODE_RMD:
		tmpl = mopGetLong(pkt, &idx);	/* Memory Address */
		fprintf(fd, "Mem Address  : %08lx\n", tmpl);
		tmps = mopGetShort(pkt, &idx);	/* Count */
		fprintf(fd, "Count        : %04x (%d)\n", tmps, tmps);
		break;
	case MOP_K_CODE_RPR:
		tmpc = mopGetChar(pkt, &idx);	/* Device Type */
		fprintf(fd, "Device Type  :   %02x ", tmpc);
		mopPrintDevice(fd, tmpc);
		fprintf(fd, "\n");

		tmpc = mopGetChar(pkt, &idx);	/* Format Version */
		fprintf(fd, "Format       :   %02x\n", tmpc);

		tmpc = mopGetChar(pkt, &idx);	/* Program Type */
		fprintf(fd, "Program Type :   %02x ", tmpc);
		mopPrintPGTY(fd, tmpc);
		fprintf(fd, "\n");

		program[0] = 0;
		tmpc = mopGetChar(pkt, &idx);	/* Software ID Len */
		for (i = 0; i < tmpc; i++) {
			program[i] = mopGetChar(pkt, &idx);
			program[i + 1] = '\0';
		}

		fprintf(fd, "Software     :   %02x '%s'\n", tmpc, program);

		tmpc = mopGetChar(pkt, &idx);	/* Processor */
		fprintf(fd, "Processor    :   %02x ", tmpc);
		mopPrintBPTY(fd, tmpc);
		fprintf(fd, "\n");

		mopPrintInfo(fd, pkt, &idx, moplen, code, trans);

		break;
	case MOP_K_CODE_RML:

		tmpc = mopGetChar(pkt, &idx);	/* Load Number */
		fprintf(fd, "Load Number  :   %02x\n", tmpc);

		tmpc = mopGetChar(pkt, &idx);	/* Error */
		fprintf(fd, "Error        :   %02x (", tmpc);
		if ((tmpc == 0))
			fprintf(fd, "no error)\n");
		else
			fprintf(fd, "error)\n");

		break;
	case MOP_K_CODE_RDS:

		tmpc = mopGetChar(pkt, &idx);	/* Device Type */
		fprintf(fd, "Device Type  :   %02x ", tmpc);
		mopPrintDevice(fd, tmpc);
		fprintf(fd, "\n");

		tmpc = mopGetChar(pkt, &idx);	/* Format Version */
		fprintf(fd, "Format       :   %02x\n", tmpc);

		tmpl = mopGetLong(pkt, &idx);	/* Memory Size */
		fprintf(fd, "Memory Size  : %08lx\n", tmpl);

		tmpc = mopGetChar(pkt, &idx);	/* Bits */
		fprintf(fd, "Bits         :   %02x\n", tmpc);

		mopPrintInfo(fd, pkt, &idx, moplen, code, trans);

		break;
	case MOP_K_CODE_MDD:

		tmpl = mopGetLong(pkt, &idx);	/* Memory Address */
		fprintf(fd, "Mem Address  : %08lx\n", tmpl);

		if (moplen > 5) {
			for (i = 0; i < (moplen - 5); i++) {
				if ((i % 16) == 0) {
					if ((i / 16) == 0)
						fprintf(fd,
						    "Image Data   : %04x ",
						    moplen-5);
					else
						fprintf(fd,
						    "                    ");
				}
				fprintf(fd, "%02x ",  mopGetChar(pkt, &idx));
				if ((i % 16) == 15)
					fprintf(fd, "\n");
			}
			if ((i % 16) != 15)
				fprintf(fd, "\n");
		}

		break;
	case MOP_K_CODE_PLT:

		tmpc = mopGetChar(pkt, &idx);	/* Load Number */
		fprintf(fd, "Load Number  :   %02x\n", tmpc);

		tmpc = mopGetChar(pkt, &idx);	/* Parameter Type */
		while (tmpc != MOP_K_PLTP_END) {
			c = mopGetChar(pkt, &idx);	/* Parameter Length */
			switch (tmpc) {
			case MOP_K_PLTP_TSN:		/* Target Name */
				fprintf(fd, "Target Name  :   %02x '", c);
				for (i = 0; i < c; i++)
					fprintf(fd, "%c",
					    mopGetChar(pkt, &idx));
				fprintf(fd, "'\n");
				break;
			case MOP_K_PLTP_TSA:		/* Target Address */
				fprintf(fd, "Target Addr  :   %02x ", c);
				for (i = 0; i < c; i++)
					fprintf(fd, "%02x ",
					    mopGetChar(pkt, &idx));
				fprintf(fd, "\n");
				break;
			case MOP_K_PLTP_HSN:		/* Host Name */
				fprintf(fd, "Host Name    :   %02x '", c);
				for (i = 0; i < c; i++)
					fprintf(fd, "%c",
					    mopGetChar(pkt, &idx));
				fprintf(fd, "'\n");
				break;
			case MOP_K_PLTP_HSA:		/* Host Address */
				fprintf(fd, "Host Addr    :   %02x ", c);
				for (i = 0; i < c; i++)
					fprintf(fd, "%02x ",
					    mopGetChar(pkt, &idx));
				fprintf(fd, "\n");
				break;
			case MOP_K_PLTP_HST:		/* Host Time */
				ucp = pkt + idx; idx = idx + 10;
				fprintf(fd, "Host Time    : ");
				mopPrintTime(fd, ucp);
				fprintf(fd, "\n");
				break;
			default:
				break;
			}
			tmpc = mopGetChar(pkt, &idx);	/* Parameter Type */
		}

		tmpl = mopGetLong(pkt, &idx);	/* Transfer Address */
		fprintf(fd, "Transfer Addr: %08lx\n", tmpl);

		break;
	default:
		break;
	}
}