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