xref: /netbsd-src/usr.sbin/mopd/common/dl.c (revision 5e4c038a45edbc7d63b7c2daa76e29f88b64a4e3)
1 /*	$NetBSD: dl.c,v 1.4 1999/08/17 12:38:09 simonb 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 #include <sys/cdefs.h>
33 #ifndef lint
34 __RCSID("$NetBSD: dl.c,v 1.4 1999/08/17 12:38:09 simonb Exp $");
35 #endif
36 
37 #include "os.h"
38 #include "dl.h"
39 #include "get.h"
40 #include "mopdef.h"
41 #include "print.h"
42 
43 void
44 mopDumpDL(fd, pkt, trans)
45 	FILE	*fd;
46 	u_char 	*pkt;
47 	int	 trans;
48 {
49 	int	i,index = 0;
50 	u_int32_t tmpl;
51 	u_char	tmpc,c,program[257],code,*ucp;
52 	u_short	len,tmps,moplen;
53 
54 	len = mopGetLength(pkt, trans);
55 
56 	switch (trans) {
57 	case TRANS_8023:
58 		index = 22;
59 		moplen = len - 8;
60 		break;
61 	default:
62 		index = 16;
63 		moplen = len;
64 	}
65 	code = mopGetChar(pkt,&index);
66 
67 	switch (code) {
68 	case MOP_K_CODE_MLT:
69 
70 		tmpc = mopGetChar(pkt,&index);	/* Load Number */
71 		(void)fprintf(fd,"Load Number  :   %02x\n",tmpc);
72 
73 		if (moplen > 6) {
74 			tmpl = mopGetLong(pkt,&index);/* Load Address */
75 			(void)fprintf(fd,"Load Address : %08x\n", tmpl);
76 		}
77 
78 		if (moplen > 10) {
79 #ifndef SHORT_PRINT
80 			for (i = 0; i < (moplen - 10); i++) {
81 				if ((i % 16) == 0) {
82 					if ((i / 16) == 0) {
83 					 	(void)fprintf(fd,
84 						       "Image Data   : %04x ",
85 							      moplen-10);
86 					} else {
87 						(void)fprintf(fd,
88 						       "                    ");
89 				        }
90 				}
91 
92 				(void)fprintf(fd, "%02x ",
93 					      mopGetChar(pkt,&index));
94 				if ((i % 16) == 15)
95 					(void)fprintf(fd,"\n");
96 			}
97 
98 			if ((i % 16) != 15)
99 				(void)fprintf(fd,"\n");
100 #else
101 			index = index + moplen - 10;
102 #endif
103 		}
104 
105 		tmpl = mopGetLong(pkt,&index);	/* Load Address */
106 		(void)fprintf(fd,"Xfer Address : %08x\n", tmpl);
107 
108 		break;
109 	case MOP_K_CODE_DCM:
110 
111 		/* Empty Message */
112 
113 		break;
114 	case MOP_K_CODE_MLD:
115 
116 		tmpc = mopGetChar(pkt,&index);	/* Load Number */
117 		(void)fprintf(fd,"Load Number  :   %02x\n",tmpc);
118 
119 		tmpl = mopGetLong(pkt,&index);	/* Load Address */
120 		(void)fprintf(fd,"Load Address : %08x\n", tmpl);
121 
122 		if (moplen > 6) {
123 #ifndef SHORT_PRINT
124 			for (i = 0; i < (moplen - 6); i++) {
125 				if ((i % 16) == 0) {
126 					if ((i / 16) == 0) {
127 						(void)fprintf(fd,
128 						       "Image Data   : %04x ",
129 							      moplen-6);
130 					} else {
131 						(void)fprintf(fd,
132 						       "                    ");
133 					}
134 				}
135 				(void)fprintf(fd,"%02x ",
136 					      mopGetChar(pkt,&index));
137 				if ((i % 16) == 15)
138 					(void)fprintf(fd,"\n");
139 			}
140 
141 			if ((i % 16) != 15)
142 				(void)fprintf(fd,"\n");
143 #else
144 			index = index + moplen - 6;
145 #endif
146 		}
147 
148 		break;
149 	case MOP_K_CODE_ASV:
150 
151 		/* Empty Message */
152 
153 		break;
154 	case MOP_K_CODE_RMD:
155 
156 		tmpl = mopGetLong(pkt,&index);	/* Memory Address */
157 		(void)fprintf(fd,"Mem Address  : %08x\n", tmpl);
158 
159 		tmps = mopGetShort(pkt,&index);	/* Count */
160 		(void)fprintf(fd,"Count        : %04x (%d)\n",tmps,tmps);
161 
162 		break;
163 	case MOP_K_CODE_RPR:
164 
165 		tmpc = mopGetChar(pkt,&index);	/* Device Type */
166 		(void)fprintf(fd, "Device Type  :   %02x ",tmpc);
167 		mopPrintDevice(fd, tmpc); (void)fprintf(fd, "\n");
168 
169 		tmpc = mopGetChar(pkt,&index);	/* Format Version */
170 		(void)fprintf(fd,"Format       :   %02x\n",tmpc);
171 
172 		tmpc = mopGetChar(pkt,&index);	/* Program Type */
173 		(void)fprintf(fd,"Program Type :   %02x ",tmpc);
174 		mopPrintPGTY(fd, tmpc); (void)fprintf(fd, "\n");
175 
176 		program[0] = 0;
177 		tmpc = mopGetChar(pkt,&index);	/* Software ID Len */
178 		for (i = 0; i < tmpc; i++) {
179 			program[i] = mopGetChar(pkt,&index);
180 			program[i+1] = '\0';
181 		}
182 
183 		(void)fprintf(fd,"Software     :   %02x '%s'\n",tmpc,program);
184 
185 		tmpc = mopGetChar(pkt,&index);	/* Processor */
186 		(void)fprintf(fd,"Processor    :   %02x ",tmpc);
187 		mopPrintBPTY(fd, tmpc); (void)fprintf(fd, "\n");
188 
189 		mopPrintInfo(fd, pkt, &index, moplen, code, trans);
190 
191 		break;
192 	case MOP_K_CODE_RML:
193 
194 		tmpc = mopGetChar(pkt,&index);	/* Load Number */
195 		(void)fprintf(fd,"Load Number  :   %02x\n",tmpc);
196 
197 		tmpc = mopGetChar(pkt,&index);	/* Error */
198 		(void)fprintf(fd,"Error        :   %02x (",tmpc);
199 		if ((tmpc == 0)) {
200 			(void)fprintf(fd,"no error)\n");
201 		} else {
202 		  	(void)fprintf(fd,"error)\n");
203 		}
204 
205 		break;
206 	case MOP_K_CODE_RDS:
207 
208 		tmpc = mopGetChar(pkt,&index);	/* Device Type */
209 		(void)fprintf(fd, "Device Type  :   %02x ",tmpc);
210 		mopPrintDevice(fd, tmpc); (void)fprintf(fd, "\n");
211 
212 		tmpc = mopGetChar(pkt,&index);	/* Format Version */
213 		(void)fprintf(fd,"Format       :   %02x\n",tmpc);
214 
215 		tmpl = mopGetLong(pkt,&index);	/* Memory Size */
216 		(void)fprintf(fd,"Memory Size  : %08x\n", tmpl);
217 
218 		tmpc = mopGetChar(pkt,&index);	/* Bits */
219 		(void)fprintf(fd,"Bits         :   %02x\n",tmpc);
220 
221 		mopPrintInfo(fd, pkt, &index, moplen, code, trans);
222 
223 		break;
224 	case MOP_K_CODE_MDD:
225 
226 		tmpl = mopGetLong(pkt,&index);	/* Memory Address */
227 		(void)fprintf(fd,"Mem Address  : %08x\n", tmpl);
228 
229 		if (moplen > 5) {
230 #ifndef SHORT_PRINT
231 			for (i = 0; i < (moplen - 5); i++) {
232 				if ((i % 16) == 0) {
233 					if ((i / 16) == 0) {
234 						(void)fprintf(fd,
235 						       "Image Data   : %04x ",
236 							      moplen-5);
237 					} else {
238 						(void)fprintf(fd,
239 						       "                    ");
240 				        }
241 				}
242 				(void)fprintf(fd,"%02x ",
243 					      mopGetChar(pkt,&index));
244 				if ((i % 16) == 15)
245 					(void)fprintf(fd,"\n");
246 			}
247 			if ((i % 16) != 15)
248 				(void)fprintf(fd,"\n");
249 #else
250 			index = index + moplen - 5;
251 #endif
252 		}
253 
254 		break;
255 	case MOP_K_CODE_PLT:
256 
257 		tmpc = mopGetChar(pkt,&index);	/* Load Number */
258 		(void)fprintf(fd,"Load Number  :   %02x\n",tmpc);
259 
260 		tmpc = mopGetChar(pkt,&index);	/* Parameter Type */
261 		while (tmpc != MOP_K_PLTP_END) {
262 			c = mopGetChar(pkt,&index);	/* Parameter Length */
263 			switch(tmpc) {
264 			case MOP_K_PLTP_TSN:		/* Target Name */
265 				(void)fprintf(fd,"Target Name  :   %02x '",
266 					      tmpc);
267 				for (i = 0; i < ((int) c); i++) {
268 					(void)fprintf(fd,"%c",
269 						    mopGetChar(pkt,&index));
270 				}
271 				(void)fprintf(fd,"'\n");
272 				break;
273 			case MOP_K_PLTP_TSA:		/* Target Address */
274 				(void)fprintf(fd,"Target Addr  :   %02x ",c);
275 				for (i = 0; i < ((int) c); i++) {
276 					(void)fprintf(fd,"%02x ",
277 						    mopGetChar(pkt,&index));
278 				}
279 				(void)fprintf(fd,"\n");
280 				break;
281 			case MOP_K_PLTP_HSN:		/* Host Name */
282 				(void)fprintf(fd,"Host Name    :   %02x '",
283 					      tmpc);
284 				for (i = 0; i < ((int) c); i++) {
285 					(void)fprintf(fd,"%c",
286 						    mopGetChar(pkt,&index));
287 				}
288 				(void)fprintf(fd,"'\n");
289 				break;
290 			case MOP_K_PLTP_HSA:		/* Host Address */
291 				(void)fprintf(fd,"Host Addr    :   %02x ",c);
292 				for (i = 0; i < ((int) c); i++) {
293 					(void)fprintf(fd,"%02x ",
294 						    mopGetChar(pkt,&index));
295 				}
296 				(void)fprintf(fd,"\n");
297 				break;
298 			case MOP_K_PLTP_HST:		/* Host Time */
299 				ucp = pkt + index; index = index + 10;
300 				(void)fprintf(fd,"Host Time    : ");
301 				mopPrintTime(fd, ucp);
302 				(void)fprintf(fd,"\n");
303 				break;
304 			default:
305 				break;
306 			}
307 			tmpc = mopGetChar(pkt,&index);/* Parameter Type */
308 		}
309 
310 		tmpl = mopGetLong(pkt,&index);	/* Transfer Address */
311 		(void)fprintf(fd,"Transfer Addr: %08x\n", tmpl);
312 
313 		break;
314 	default:
315 		break;
316 	}
317 }
318 
319 
320