xref: /openbsd-src/usr.sbin/mopd/common/dl.c (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /*	$OpenBSD: dl.c,v 1.2 1996/09/21 19:11:26 maja Exp $ */
2 
3 /*
4  * Copyright (c) 1993-95 Mats O Jansson.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *	This product includes software developed by Mats O Jansson.
17  * 4. The name of the author may not be used to endorse or promote products
18  *    derived from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef LINT
33 static char rcsid[] = "$OpenBSD: dl.c,v 1.2 1996/09/21 19:11:26 maja Exp $";
34 #endif
35 
36 #include "os.h"
37 #include "common/get.h"
38 #include "common/print.h"
39 #include "common/mopdef.h"
40 
41 void
42 mopDumpDL(fd, pkt, trans)
43 	FILE	*fd;
44 	u_char 	*pkt;
45 	int	 trans;
46 {
47 	int	i,index = 0;
48 	long	tmpl;
49 	u_char	tmpc,c,program[17],code,*ucp;
50 	u_short	len,tmps,moplen;
51 
52 	len = mopGetLength(pkt, trans);
53 
54 	switch (trans) {
55 	case TRANS_8023:
56 		index = 22;
57 		moplen = len - 8;
58 		break;
59 	default:
60 		index = 16;
61 		moplen = len;
62 	}
63 	code = mopGetChar(pkt,&index);
64 
65 	switch (code) {
66 	case MOP_K_CODE_MLT:
67 
68 		tmpc = mopGetChar(pkt,&index);	/* Load Number */
69 		(void)fprintf(fd,"Load Number  :   %02x\n",tmpc);
70 
71 		if (moplen > 6) {
72 			tmpl = mopGetLong(pkt,&index);/* Load Address */
73 			(void)fprintf(fd,"Load Address : %08x\n",tmpl);
74 		}
75 
76 		if (moplen > 10) {
77 #ifndef SHORT_PRINT
78 			for (i = 0; i < (moplen - 10); i++) {
79 				if ((i % 16) == 0) {
80 					if ((i / 16) == 0) {
81 					 	(void)fprintf(fd,
82 						       "Image Data   : %04x ",
83 							      moplen-10);
84 					} else {
85 						(void)fprintf(fd,
86 						       "                    ");
87 				        }
88 				}
89 
90 				(void)fprintf(fd, "%02x ",
91 					      mopGetChar(pkt,&index));
92 				if ((i % 16) == 15)
93 					(void)fprintf(fd,"\n");
94 			}
95 
96 			if ((i % 16) != 15)
97 				(void)fprintf(fd,"\n");
98 #else
99 			index = index + moplen - 10;
100 #endif
101 		}
102 
103 		tmpl = mopGetLong(pkt,&index);	/* Load Address */
104 		(void)fprintf(fd,"Xfer Address : %08x\n",tmpl);
105 
106 		break;
107 	case MOP_K_CODE_DCM:
108 
109 		/* Empty Message */
110 
111 		break;
112 	case MOP_K_CODE_MLD:
113 
114 		tmpc = mopGetChar(pkt,&index);	/* Load Number */
115 		(void)fprintf(fd,"Load Number  :   %02x\n",tmpc);
116 
117 		tmpl = mopGetLong(pkt,&index);	/* Load Address */
118 		(void)fprintf(fd,"Load Address : %08x\n",tmpl);
119 
120 		if (moplen > 6) {
121 #ifndef SHORT_PRINT
122 			for (i = 0; i < (moplen - 6); i++) {
123 				if ((i % 16) == 0) {
124 					if ((i / 16) == 0) {
125 						(void)fprintf(fd,
126 						       "Image Data   : %04x ",
127 							      moplen-6);
128 					} else {
129 						(void)fprintf(fd,
130 						       "                    ");
131 					}
132 				}
133 				(void)fprintf(fd,"%02x ",
134 					      mopGetChar(pkt,&index));
135 				if ((i % 16) == 15)
136 					(void)fprintf(fd,"\n");
137 			}
138 
139 			if ((i % 16) != 15)
140 				(void)fprintf(fd,"\n");
141 #else
142 			index = index + moplen - 6;
143 #endif
144 		}
145 
146 		break;
147 	case MOP_K_CODE_ASV:
148 
149 		/* Empty Message */
150 
151 		break;
152 	case MOP_K_CODE_RMD:
153 
154 		tmpl = mopGetLong(pkt,&index);	/* Memory Address */
155 		(void)fprintf(fd,"Mem Address  : %08x\n",tmpl);
156 
157 		tmps = mopGetShort(pkt,&index);	/* Count */
158 		(void)fprintf(fd,"Count        : %04x (%d)\n",tmps,tmps);
159 
160 		break;
161 	case MOP_K_CODE_RPR:
162 
163 		tmpc = mopGetChar(pkt,&index);	/* Device Type */
164 		(void)fprintf(fd, "Device Type  :   %02x ",tmpc);
165 		mopPrintDevice(fd, tmpc); (void)fprintf(fd, "\n");
166 
167 		tmpc = mopGetChar(pkt,&index);	/* Format Version */
168 		(void)fprintf(fd,"Format       :   %02x\n",tmpc);
169 
170 		tmpc = mopGetChar(pkt,&index);	/* Program Type */
171 		(void)fprintf(fd,"Program Type :   %02x ",tmpc);
172 		mopPrintPGTY(fd, tmpc); (void)fprintf(fd, "\n");
173 
174 		program[0] = 0;
175 		tmpc = mopGetChar(pkt,&index);	/* Software ID Len */
176 		for (i = 0; i < tmpc; i++) {
177 			program[i] = mopGetChar(pkt,&index);
178 			program[i+1] = '\0';
179 		}
180 
181 		(void)fprintf(fd,"Software     :   %02x '%s'\n",tmpc,program);
182 
183 		tmpc = mopGetChar(pkt,&index);	/* Processor */
184 		(void)fprintf(fd,"Processor    :   %02x ",tmpc);
185 		mopPrintBPTY(fd, tmpc); (void)fprintf(fd, "\n");
186 
187 		mopPrintInfo(fd, pkt, &index, moplen, code, trans);
188 
189 		break;
190 	case MOP_K_CODE_RML:
191 
192 		tmpc = mopGetChar(pkt,&index);	/* Load Number */
193 		(void)fprintf(fd,"Load Number  :   %02x\n",tmpc);
194 
195 		tmpc = mopGetChar(pkt,&index);	/* Error */
196 		(void)fprintf(fd,"Error        :   %02x (",tmpc);
197 		if ((tmpc == 0)) {
198 			(void)fprintf(fd,"no error)\n");
199 		} else {
200 		  	(void)fprintf(fd,"error)\n");
201 		}
202 
203 		break;
204 	case MOP_K_CODE_RDS:
205 
206 		tmpc = mopGetChar(pkt,&index);	/* Device Type */
207 		(void)fprintf(fd, "Device Type  :   %02x ",tmpc);
208 		mopPrintDevice(fd, tmpc); (void)fprintf(fd, "\n");
209 
210 		tmpc = mopGetChar(pkt,&index);	/* Format Version */
211 		(void)fprintf(fd,"Format       :   %02x\n",tmpc);
212 
213 		tmpl = mopGetLong(pkt,&index);	/* Memory Size */
214 		(void)fprintf(fd,"Memory Size  : %08x\n",tmpl);
215 
216 		tmpc = mopGetChar(pkt,&index);	/* Bits */
217 		(void)fprintf(fd,"Bits         :   %02x\n",tmpc);
218 
219 		mopPrintInfo(fd, pkt, &index, moplen, code, trans);
220 
221 		break;
222 	case MOP_K_CODE_MDD:
223 
224 		tmpl = mopGetLong(pkt,&index);	/* Memory Address */
225 		(void)fprintf(fd,"Mem Address  : %08x\n",tmpl);
226 
227 		if (moplen > 5) {
228 #ifndef SHORT_PRINT
229 			for (i = 0; i < (moplen - 5); i++) {
230 				if ((i % 16) == 0) {
231 					if ((i / 16) == 0) {
232 						(void)fprintf(fd,
233 						       "Image Data   : %04x ",
234 							      moplen-5);
235 					} else {
236 						(void)fprintf(fd,
237 						       "                    ");
238 				        }
239 				}
240 				(void)fprintf(fd,"%02x ",
241 					      mopGetChar(pkt,&index));
242 				if ((i % 16) == 15)
243 					(void)fprintf(fd,"\n");
244 			}
245 			if ((i % 16) != 15)
246 				(void)fprintf(fd,"\n");
247 #else
248 			index = index + moplen - 5;
249 #endif
250 		}
251 
252 		break;
253 	case MOP_K_CODE_PLT:
254 
255 		tmpc = mopGetChar(pkt,&index);	/* Load Number */
256 		(void)fprintf(fd,"Load Number  :   %02x\n",tmpc);
257 
258 		tmpc = mopGetChar(pkt,&index);	/* Parameter Type */
259 		while (tmpc != MOP_K_PLTP_END) {
260 			c = mopGetChar(pkt,&index);	/* Parameter Length */
261 			switch(tmpc) {
262 			case MOP_K_PLTP_TSN:		/* Target Name */
263 				(void)fprintf(fd,"Target Name  :   %02x '",
264 					      tmpc);
265 				for (i = 0; i < ((int) c); i++) {
266 					(void)fprintf(fd,"%c",
267 						    mopGetChar(pkt,&index));
268 				}
269 				(void)fprintf(fd,"'\n");
270 				break;
271 			case MOP_K_PLTP_TSA:		/* Target Address */
272 				(void)fprintf(fd,"Target Addr  :   %02x ",c);
273 				for (i = 0; i < ((int) c); i++) {
274 					(void)fprintf(fd,"%02x ",
275 						    mopGetChar(pkt,&index));
276 				}
277 				(void)fprintf(fd,"\n");
278 				break;
279 			case MOP_K_PLTP_HSN:		/* Host Name */
280 				(void)fprintf(fd,"Host Name    :   %02x '",
281 					      tmpc);
282 				for (i = 0; i < ((int) c); i++) {
283 					(void)fprintf(fd,"%c",
284 						    mopGetChar(pkt,&index));
285 				}
286 				(void)fprintf(fd,"'\n");
287 				break;
288 			case MOP_K_PLTP_HSA:		/* Host Address */
289 				(void)fprintf(fd,"Host Addr    :   %02x ",c);
290 				for (i = 0; i < ((int) c); i++) {
291 					(void)fprintf(fd,"%02x ",
292 						    mopGetChar(pkt,&index));
293 				}
294 				(void)fprintf(fd,"\n");
295 				break;
296 			case MOP_K_PLTP_HST:		/* Host Time */
297 				ucp = pkt + index; index = index + 10;
298 				(void)fprintf(fd,"Host Time    : ");
299 				mopPrintTime(fd, ucp);
300 				(void)fprintf(fd,"\n");
301 				break;
302 			default:
303 				break;
304 			}
305 			tmpc = mopGetChar(pkt,&index);/* Parameter Type */
306 		}
307 
308 		tmpl = mopGetLong(pkt,&index);	/* Transfer Address */
309 		(void)fprintf(fd,"Transfer Addr: %08x\n",tmpl);
310 
311 		break;
312 	default:
313 		break;
314 	}
315 }
316 
317 
318