xref: /netbsd-src/usr.sbin/mopd/common/file.c (revision d0fed6c87ddc40a8bffa6f99e7433ddfc864dd83)
1 /*	$NetBSD: file.c,v 1.2 1997/03/25 03:07:12 thorpej Exp $	*/
2 
3 /*
4  * Copyright (c) 1995-96 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[] = "$NetBSD: file.c,v 1.2 1997/03/25 03:07:12 thorpej Exp $";
34 #endif
35 
36 #include "os.h"
37 #include "common/common.h"
38 #include "common/mopdef.h"
39 
40 #ifndef NOAOUT
41 #if defined(__NetBSD__) || defined(__OpenBSD__)
42 #include <sys/exec_aout.h>
43 #endif
44 #if defined(__bsdi__)
45 #define NOAOUT
46 #endif
47 #if defined(__FreeBSD__)
48 #include <sys/imgact_aout.h>
49 #endif
50 #if !defined(MID_VAX)
51 #define MID_VAX 140
52 #endif
53 #endif
54 
55 void
56 mopFilePutLX(buf, index, value, cnt)
57 	u_char	*buf;
58 	int	index, cnt;
59 	u_long	value;
60 {
61 	int i;
62 	for (i = 0; i < cnt; i++) {
63 		buf[index+i] = value % 256;
64 		value = value / 256;
65 	}
66 }
67 
68 void
69 mopFilePutBX(buf, index, value, cnt)
70 	u_char	*buf;
71 	int	index, cnt;
72 	u_long	value;
73 {
74 	int i;
75 	for (i = 0; i < cnt; i++) {
76 		buf[index+cnt-1-i] = value % 256;
77 		value = value / 256;
78 	}
79 }
80 
81 u_long
82 mopFileGetLX(buf, index, cnt)
83 	u_char	*buf;
84 	int	index, cnt;
85 {
86 	u_long ret = 0;
87 	int i;
88 
89 	for (i = 0; i < cnt; i++) {
90 		ret = ret*256 + buf[index+cnt-1-i];
91 	}
92 
93 	return(ret);
94 }
95 
96 u_long
97 mopFileGetBX(buf, index, cnt)
98 	u_char	*buf;
99 	int	index, cnt;
100 {
101 	u_long ret = 0;
102 	int i;
103 
104 	for (i = 0; i < cnt; i++) {
105 		ret = ret*256 + buf[index+i];
106 	}
107 
108 	return(ret);
109 }
110 
111 void
112 mopFileSwapX(buf, index, cnt)
113 	u_char	*buf;
114 	int	index, cnt;
115 {
116 	int i;
117 	u_char c;
118 
119 	for (i = 0; i < (cnt / 2); i++) {
120 		c = buf[index+i];
121 		buf[index+i] = buf[index+cnt-1-i];
122 		buf[index+cnt-1-i] = c;
123 	}
124 
125 }
126 
127 int
128 CheckMopFile(fd)
129 	int	fd;
130 {
131 	u_char	header[512];
132 	short	image_type;
133 
134 	if (read(fd, header, 512) != 512)
135 		return(-1);
136 
137 	(void)lseek(fd, (off_t) 0, SEEK_SET);
138 
139 	image_type = (u_short)(header[IHD_W_ALIAS+1]*256 +
140 			       header[IHD_W_ALIAS]);
141 
142 	switch(image_type) {
143 		case IHD_C_NATIVE:		/* Native mode image (VAX)   */
144 		case IHD_C_RSX:			/* RSX image produced by TKB */
145 		case IHD_C_BPA:			/* BASIC plus analog         */
146 		case IHD_C_ALIAS:		/* Alias		     */
147 		case IHD_C_CLI:			/* Image is CLI		     */
148 		case IHD_C_PMAX:		/* PMAX system image	     */
149 		case IHD_C_ALPHA:		/* ALPHA system image	     */
150 			break;
151 		default:
152 			return(-1);
153 	}
154 
155 	return(0);
156 }
157 
158 int
159 GetMopFileInfo(fd, load, xfr)
160 	int	fd;
161 	u_long	*load, *xfr;
162 {
163 	u_char	header[512];
164 	short	image_type;
165 	u_long	load_addr, xfr_addr, isd, iha, hbcnt, isize;
166 
167 	if (read(fd, header, 512) != 512)
168 		return(-1);
169 
170 	image_type = (u_short)(header[IHD_W_ALIAS+1]*256 +
171 			       header[IHD_W_ALIAS]);
172 
173 	switch(image_type) {
174 		case IHD_C_NATIVE:		/* Native mode image (VAX)   */
175 			isd = (header[IHD_W_SIZE+1]*256 +
176 			       header[IHD_W_SIZE]);
177 			iha = (header[IHD_W_ACTIVOFF+1]*256 +
178 			       header[IHD_W_ACTIVOFF]);
179 			hbcnt = (header[IHD_B_HDRBLKCNT]);
180 			isize = (header[isd+ISD_W_PAGCNT+1]*256 +
181 				 header[isd+ISD_W_PAGCNT]) * 512;
182 			load_addr = ((header[isd+ISD_V_VPN+1]*256 +
183 				      header[isd+ISD_V_VPN]) & ISD_M_VPN)
184 					* 512;
185 			xfr_addr = (header[iha+IHA_L_TFRADR1+3]*0x1000000 +
186 				    header[iha+IHA_L_TFRADR1+2]*0x10000 +
187 				    header[iha+IHA_L_TFRADR1+1]*0x100 +
188 				    header[iha+IHA_L_TFRADR1]) & 0x7fffffff;
189 #ifdef INFO
190 			printf("Native Image (VAX)\n");
191 			printf("Header Block Count: %d\n",hbcnt);
192 			printf("Image Size:         %08x\n",isize);
193 			printf("Load Address:       %08x\n",load_addr);
194 			printf("Transfer Address:   %08x\n",xfr_addr);
195 #endif
196 			break;
197 		case IHD_C_RSX:			/* RSX image produced by TKB */
198 			hbcnt = header[L_BBLK+1]*256 + header[L_BBLK];
199 			isize = (header[L_BLDZ+1]*256 + header[L_BLDZ]) * 64;
200 			load_addr = header[L_BSA+1]*256 + header[L_BSA];
201 			xfr_addr  = header[L_BXFR+1]*256 + header[L_BXFR];
202 #ifdef INFO
203 			printf("RSX Image\n");
204 			printf("Header Block Count: %d\n",hbcnt);
205 			printf("Image Size:         %08x\n",isize);
206 			printf("Load Address:       %08x\n",load_addr);
207 			printf("Transfer Address:   %08x\n",xfr_addr);
208 #endif
209 			break;
210 		case IHD_C_BPA:			/* BASIC plus analog         */
211 #ifdef INFO
212 			printf("BASIC-Plus Image, not supported\n");
213 #endif
214 			return(-1);
215 			break;
216 		case IHD_C_ALIAS:		/* Alias		     */
217 #ifdef INFO
218 			printf("Alias, not supported\n");
219 #endif
220 			return(-1);
221 			break;
222 		case IHD_C_CLI:			/* Image is CLI		     */
223 #ifdef INFO
224 			printf("CLI, not supported\n");
225 #endif
226 			return(-1);
227 			break;
228 		case IHD_C_PMAX:		/* PMAX system image	     */
229 			isd = (header[IHD_W_SIZE+1]*256 +
230 			       header[IHD_W_SIZE]);
231 			iha = (header[IHD_W_ACTIVOFF+1]*256 +
232 			       header[IHD_W_ACTIVOFF]);
233 			hbcnt = (header[IHD_B_HDRBLKCNT]);
234 			isize = (header[isd+ISD_W_PAGCNT+1]*256 +
235 				 header[isd+ISD_W_PAGCNT]) * 512;
236 			load_addr = (header[isd+ISD_V_VPN+1]*256 +
237 				     header[isd+ISD_V_VPN]) * 512;
238 			xfr_addr = (header[iha+IHA_L_TFRADR1+3]*0x1000000 +
239 				    header[iha+IHA_L_TFRADR1+2]*0x10000 +
240 				    header[iha+IHA_L_TFRADR1+1]*0x100 +
241 				    header[iha+IHA_L_TFRADR1]);
242 #ifdef INFO
243 			printf("PMAX Image \n");
244 			printf("Header Block Count: %d\n",hbcnt);
245 			printf("Image Size:         %08x\n",isize);
246 			printf("Load Address:       %08x\n",load_addr);
247 			printf("Transfer Address:   %08x\n",xfr_addr);
248 #endif
249 			break;
250 		case IHD_C_ALPHA:		/* ALPHA system image	     */
251 			isd = (header[EIHD_L_ISDOFF+3]*0x1000000 +
252 			       header[EIHD_L_ISDOFF+2]*0x10000 +
253 			       header[EIHD_L_ISDOFF+1]*0x100 +
254 			       header[EIHD_L_ISDOFF]);
255 			hbcnt = (header[EIHD_L_HDRBLKCNT+3]*0x1000000 +
256 				 header[EIHD_L_HDRBLKCNT+2]*0x10000 +
257 				 header[EIHD_L_HDRBLKCNT+1]*0x100 +
258 				 header[EIHD_L_HDRBLKCNT]);
259 			isize = (header[isd+EISD_L_SECSIZE+3]*0x1000000 +
260 				 header[isd+EISD_L_SECSIZE+2]*0x10000 +
261 				 header[isd+EISD_L_SECSIZE+1]*0x100 +
262 				 header[isd+EISD_L_SECSIZE]);
263 			load_addr = 0;
264 			xfr_addr = 0;
265 #ifdef INFO
266 			printf("Alpha Image \n");
267 			printf("Header Block Count: %d\n",hbcnt);
268 			printf("Image Size:         %08x\n",isize);
269 			printf("Load Address:       %08x\n",load_addr);
270 			printf("Transfer Address:   %08x\n",xfr_addr);
271 #endif
272 			break;
273 		default:
274 #ifdef INFO
275 			printf("Unknown Image (%d)\n",image_type);
276 #endif
277 			return(-1);
278 	}
279 
280 	if (load != NULL) {
281 		*load = load_addr;
282 	}
283 
284 	if (xfr != NULL) {
285 		*xfr  = xfr_addr;
286 	}
287 
288 	return(0);
289 }
290 
291 #ifndef NOAOUT
292 int
293 getMID(old_mid,new_mid)
294 	int	old_mid, new_mid;
295 {
296 	int	mid;
297 
298 	mid = old_mid;
299 
300 	switch (new_mid) {
301 	case MID_I386:
302 		mid = MID_I386;
303 		break;
304 #ifdef MID_M68K
305 	case MID_M68K:
306 		mid = MID_M68K;
307 		break;
308 #endif
309 #ifdef MID_M68K4K
310 	case MID_M68K4K:
311 		mid = MID_M68K4K;
312 		break;
313 #endif
314 #ifdef MID_NS32532
315 	case MID_NS32532:
316 		mid = MID_NS32532;
317 		break;
318 #endif
319 /*###323 [cc] for each function it appears in.)%%%*/
320 /*###323 [cc] (Each undeclared identifier is reported only once%%%*/
321 /*###323 [cc] `MID_SPARC' undeclared (first use this function)%%%*/
322 	case MID_SPARC:
323 		mid = MID_SPARC;
324 		break;
325 #ifdef MID_PMAX
326 	case MID_PMAX:
327 		mid = MID_PMAX;
328 		break;
329 #endif
330 #ifdef MID_VAX
331 	case MID_VAX:
332 		mid = MID_VAX;
333 		break;
334 #endif
335 #ifdef MID_ALPHA
336 	case MID_ALPHA:
337 		mid = MID_ALPHA;
338 		break;
339 #endif
340 #ifdef MID_MIPS
341 	case MID_MIPS:
342 		mid = MID_MIPS;
343 		break;
344 #endif
345 #ifdef MID_ARM6
346 	case MID_ARM6:
347 		mid = MID_ARM6;
348 		break;
349 #endif
350 	default:
351 /*###352 [cc] syntax error before `}'%%%*/
352 	}
353 
354 	return(mid);
355 }
356 
357 int
358 getCLBYTES(mid)
359 	int	mid;
360 {
361 	int	clbytes;
362 
363 	switch (mid) {
364 #ifdef MID_VAX
365 	case MID_VAX:
366 		clbytes = 1024;
367 		break;
368 #endif
369 	case MID_I386:
370 #ifdef MID_M68K4K
371 	case MID_M68K4K:
372 #endif
373 #ifdef MID_NS32532
374 	case MID_NS32532:
375 #endif
376 	case MID_SPARC:				/* It might be 8192 */
377 #ifdef MID_PMAX
378 	case MID_PMAX:
379 #endif
380 #ifdef MID_MIPS
381 	case MID_MIPS:
382 #endif
383 #ifdef MID_ARM6
384 	case MID_ARM6:
385 #endif
386 		clbytes = 4096;
387 		break;
388 #ifdef MID_M68K
389 	case MID_M68K:
390 #endif
391 #ifdef MID_ALPHA
392 	case MID_ALPHA:
393 #endif
394 #if defined(MID_M68K) || defined(MID_ALPHA)
395 		clbytes = 8192;
396 		break;
397 #endif
398 	default:
399 		clbytes = 0;
400 	}
401 
402 	return(clbytes);
403 }
404 #endif
405 
406 /*###406 [cc] syntax error before `int'%%%*/
407 int
408 CheckAOutFile(fd)
409 	int	fd;
410 {
411 #ifdef NOAOUT
412 	return(-1);
413 #else
414 	struct exec ex, ex_swap;
415 	int	mid = -1;
416 
417 /*###416 [cc] `fd' undeclared (first use this function)%%%*/
418 	if (read(fd, (char *)&ex, sizeof(ex)) != sizeof(ex))
419 		return(-1);
420 
421 	(void)lseek(fd, (off_t) 0, SEEK_SET);
422 
423 	if (read(fd, (char *)&ex_swap, sizeof(ex_swap)) != sizeof(ex_swap))
424 		return(-1);
425 
426 	(void)lseek(fd, (off_t) 0, SEEK_SET);
427 
428 	mid = getMID(mid, N_GETMID (ex));
429 
430 	if (mid == -1) {
431 		mid = getMID(mid, N_GETMID (ex_swap));
432 	}
433 
434 	if (mid != -1) {
435 		return(0);
436 	} else {
437 		return(-1);
438 	}
439 #endif NOAOUT
440 }
441 
442 /*###440 [cc] syntax error before `int'%%%*/
443 int
444 GetAOutFileInfo(fd, load, xfr, a_text, a_text_fill,
445 		a_data, a_data_fill, a_bss, a_bss_fill, aout)
446 	int	fd, *aout;
447 	u_long	*load, *xfr, *a_text, *a_text_fill;
448 	u_long	*a_data, *a_data_fill, *a_bss, *a_bss_fill;
449 {
450 #ifdef NOAOUT
451 	return(-1);
452 #else
453 	struct exec ex, ex_swap;
454 	int	mid = -1;
455 	u_long	magic, clbytes, clofset;
456 
457 	if (read(fd, (char *)&ex, sizeof(ex)) != sizeof(ex))
458 		return(-1);
459 
460 	(void)lseek(fd, (off_t) 0, SEEK_SET);
461 
462 	if (read(fd, (char *)&ex_swap, sizeof(ex_swap)) != sizeof(ex_swap))
463 		return(-1);
464 
465 	mopFileSwapX((u_char *)&ex_swap, 0, 4);
466 
467 	mid = getMID(mid, N_GETMID (ex));
468 
469 	if (mid == -1) {
470 		mid = getMID(mid, N_GETMID (ex_swap));
471 		if (mid != -1) {
472 			mopFileSwapX((u_char *)&ex, 0, 4);
473 		}
474 	}
475 
476 	if (mid == -1) {
477 		return(-1);
478 	}
479 
480 	if (N_BADMAG (ex)) {
481 		return(-1);
482 	}
483 
484 	switch (mid) {
485 	case MID_I386:
486 #ifdef MID_NS32532
487 	case MID_NS32532:
488 #endif
489 #ifdef MID_PMAX
490 	case MID_PMAX:
491 #endif
492 #ifdef MID_VAX
493 	case MID_VAX:
494 #endif
495 #ifdef MID_ALPHA
496 	case MID_ALPHA:
497 #endif
498 #ifdef MID_ARM6
499 	case MID_ARM6:
500 #endif
501 		ex.a_text  = mopFileGetLX((u_char *)&ex_swap,  4, 4);
502 		ex.a_data  = mopFileGetLX((u_char *)&ex_swap,  8, 4);
503 		ex.a_bss   = mopFileGetLX((u_char *)&ex_swap, 12, 4);
504 		ex.a_syms  = mopFileGetLX((u_char *)&ex_swap, 16, 4);
505 		ex.a_entry = mopFileGetLX((u_char *)&ex_swap, 20, 4);
506 		ex.a_trsize= mopFileGetLX((u_char *)&ex_swap, 24, 4);
507 		ex.a_drsize= mopFileGetLX((u_char *)&ex_swap, 28, 4);
508 		break;
509 #ifdef MID_M68K
510 	case MID_M68K:
511 #endif
512 #ifdef MID_M68K4K
513 	case MID_M68K4K:
514 #endif
515 	case MID_SPARC:
516 #ifdef MID_MIPS
517 	case MID_MIPS:
518 #endif
519 		ex.a_text  = mopFileGetBX((u_char *)&ex_swap,  4, 4);
520 		ex.a_data  = mopFileGetBX((u_char *)&ex_swap,  8, 4);
521 		ex.a_bss   = mopFileGetBX((u_char *)&ex_swap, 12, 4);
522 		ex.a_syms  = mopFileGetBX((u_char *)&ex_swap, 16, 4);
523 		ex.a_entry = mopFileGetBX((u_char *)&ex_swap, 20, 4);
524 		ex.a_trsize= mopFileGetBX((u_char *)&ex_swap, 24, 4);
525 		ex.a_drsize= mopFileGetBX((u_char *)&ex_swap, 28, 4);
526 		break;
527 	default:
528 /*###525 [cc] syntax error before `}'%%%*/
529 	}
530 
531 #ifdef INFO
532 	printf("a.out image (");
533 	switch (N_GETMID (ex)) {
534 	case MID_I386:
535 		printf("i386");
536 		break;
537 #ifdef MID_M68K
538 	case MID_M68K:
539 		printf("m68k");
540 		break;
541 #endif
542 #ifdef MID_M68K4K
543 	case MID_M68K4K:
544 		printf("m68k 4k");
545 		break;
546 #endif
547 #ifdef MID_NS32532
548 	case MID_NS32532:
549 		printf("pc532");
550 		break;
551 #endif
552 	case MID_SPARC:
553 		printf("sparc");
554 		break;
555 #ifdef MID_PMAX
556 	case MID_PMAX:
557 		printf("pmax");
558 		break;
559 #endif
560 #ifdef MID_VAX
561 	case MID_VAX:
562 		printf("vax");
563 		break;
564 #endif
565 #ifdef MID_ALPHA
566 	case MID_ALPHA:
567 		printf("alpha");
568 		break;
569 #endif
570 #ifdef MID_MIPS
571 	case MID_MIPS:
572 		printf("mips");
573 		break;
574 #endif
575 #ifdef MID_ARM6
576 	case MID_ARM6:
577 		printf("arm32");
578 		break;
579 #endif
580 	default:
581 	}
582 	printf(") Magic: ");
583 	switch (N_GETMAGIC (ex)) {
584 	case OMAGIC:
585 		printf("OMAGIC");
586 		break;
587 	case NMAGIC:
588 		printf("NMAGIC");
589 		break;
590 	case ZMAGIC:
591 		printf("ZMAGIC");
592 		break;
593 	case QMAGIC:
594 		printf("QMAGIC");
595 		break;
596 	default:
597 		printf("Unknown %d",N_GETMAGIC (ex));
598 	}
599 	printf("\n");
600 	printf("Size of text:       %08x\n",ex.a_text);
601 	printf("Size of data:       %08x\n",ex.a_data);
602 	printf("Size of bss:        %08x\n",ex.a_bss);
603 	printf("Size of symbol tab: %08x\n",ex.a_syms);
604 	printf("Transfer Address:   %08x\n",ex.a_entry);
605 	printf("Size of reloc text: %08x\n",ex.a_trsize);
606 	printf("Size of reloc data: %08x\n",ex.a_drsize);
607 #endif
608 	magic = N_GETMAGIC (ex);
609 	clbytes = getCLBYTES(mid);
610 	clofset = clbytes - 1;
611 
612 /*###608 [cc] `load' undeclared (first use this function)%%%*/
613 	if (load != NULL) {
614 		*load   = 0;
615 	}
616 
617 /*###612 [cc] `xfr' undeclared (first use this function)%%%*/
618 	if (xfr != NULL) {
619 		*xfr    = ex.a_entry;
620 	}
621 
622 /*###616 [cc] `a_text' undeclared (first use this function)%%%*/
623 	if (a_text != NULL) {
624 		*a_text = ex.a_text;
625 	}
626 
627 /*###620 [cc] `a_text_fill' undeclared (first use this function)%%%*/
628 	if (a_text_fill != NULL) {
629 		if (magic == ZMAGIC || magic == NMAGIC) {
630 			*a_text_fill = clbytes - (ex.a_text & clofset);
631 			if (*a_text_fill == clbytes) {
632 				*a_text_fill = 0;
633 			}
634 		} else {
635 			*a_text_fill = 0;
636 	        }
637 	}
638 
639 /*###631 [cc] `a_data' undeclared (first use this function)%%%*/
640 	if (a_data != NULL) {
641 		*a_data = ex.a_data;
642 	}
643 
644 /*###635 [cc] `a_data_fill' undeclared (first use this function)%%%*/
645 	if (a_data_fill != NULL) {
646 		if (magic == ZMAGIC || magic == NMAGIC) {
647 			*a_data_fill = clbytes - (ex.a_data & clofset);
648 			if (*a_data_fill == clbytes) {
649 				*a_data_fill = 0;
650 			}
651 		} else {
652 			*a_data_fill = 0;
653 	        }
654 	}
655 
656 /*###646 [cc] `a_bss' undeclared (first use this function)%%%*/
657 	if (a_bss != NULL) {
658 		*a_bss  = ex.a_bss;
659 	}
660 
661 /*###650 [cc] `a_bss_fill' undeclared (first use this function)%%%*/
662 	if (a_bss_fill != NULL) {
663 		if (magic == ZMAGIC || magic == NMAGIC) {
664 			*a_bss_fill = clbytes - (ex.a_bss & clofset);
665 			if (*a_bss_fill == clbytes) {
666 				*a_bss_fill = 0;
667 			}
668 		} else {
669 			*a_bss_fill = clbytes -
670 				((ex.a_text+ex.a_data+ex.a_bss) & clofset);
671 			if (*a_text_fill == clbytes) {
672 				*a_text_fill = 0;
673 			}
674 	        }
675 	}
676 
677 /*###665 [cc] `aout' undeclared (first use this function)%%%*/
678 	if (aout != NULL) {
679 		*aout = mid;
680 	}
681 
682 	return(0);
683 #endif NOAOUT
684 }
685 
686 /*###673 [cc] syntax error before `int'%%%*/
687 int
688 GetFileInfo(fd, load, xfr, aout,
689 	    a_text, a_text_fill, a_data, a_data_fill, a_bss, a_bss_fill)
690 	int	fd, *aout;
691 	u_long	*load, *xfr, *a_text, *a_text_fill;
692 	u_long	*a_data, *a_data_fill, *a_bss, *a_bss_fill;
693 {
694 	int	err;
695 
696 	err = CheckAOutFile(fd);
697 
698 	if (err == 0) {
699 		err = GetAOutFileInfo(fd, load, xfr,
700 				      a_text, a_text_fill,
701 				      a_data, a_data_fill,
702 				      a_bss, a_bss_fill,
703 				      aout);
704 		if (err != 0) {
705 			return(-1);
706 		}
707 	} else {
708 		err = CheckMopFile(fd);
709 
710 		if (err == 0) {
711 			err = GetMopFileInfo(fd, load, xfr);
712 			if (err != 0) {
713 				return(-1);
714 			}
715 			*aout = -1;
716 		} else {
717 			return(-1);
718 		}
719 	}
720 
721 	return(0);
722 }
723 
724 ssize_t
725 /*###711 [cc] syntax error before `mopFileRead'%%%*/
726 mopFileRead(dlslot, buf)
727 	struct dllist *dlslot;
728 	u_char	*buf;
729 {
730 	ssize_t len, outlen;
731 	int	bsz;
732 	long	pos, notdone, total;
733 
734 /*###719 [cc] `dlslot' undeclared (first use this function)%%%*/
735 	if (dlslot->aout == -1) {
736 /*###720 [cc] `buf' undeclared (first use this function)%%%*/
737 		len = read(dlslot->ldfd,buf,dlslot->dl_bsz);
738 	} else {
739 		bsz = dlslot->dl_bsz;
740 		pos = dlslot->a_lseek;
741 		len = 0;
742 
743 		total = dlslot->a_text;
744 
745 		if (pos < total) {
746 			notdone = total - pos;
747 			if (notdone <= bsz) {
748 /*###731 [cc] subscripted value is neither array nor pointer%%%*/
749 				outlen = read(dlslot->ldfd,&buf[len],notdone);
750 			} else {
751 /*###733 [cc] subscripted value is neither array nor pointer%%%*/
752 				outlen = read(dlslot->ldfd,&buf[len],bsz);
753 			}
754 			len = len + outlen;
755 			pos = pos + outlen;
756 			bsz = bsz - outlen;
757 		}
758 
759 		total = total + dlslot->a_text_fill;
760 
761 		if ((bsz > 0) && (pos < total)) {
762 			notdone = total - pos;
763 			if (notdone <= bsz) {
764 				outlen = notdone;
765 			} else {
766 				outlen = bsz;
767 			}
768 /*###749 [cc] subscripted value is neither array nor pointer%%%*/
769 			bzero(&buf[len],outlen);
770 			len = len + outlen;
771 			pos = pos + outlen;
772 			bsz = bsz - outlen;
773 		}
774 
775 		total = total + dlslot->a_data;
776 
777 		if ((bsz > 0) && (pos < total)) {
778 			notdone = total - pos;
779 			if (notdone <= bsz) {
780 /*###760 [cc] subscripted value is neither array nor pointer%%%*/
781 				outlen = read(dlslot->ldfd,&buf[len],notdone);
782 			} else {
783 /*###762 [cc] subscripted value is neither array nor pointer%%%*/
784 				outlen = read(dlslot->ldfd,&buf[len],bsz);
785 			}
786 			len = len + outlen;
787 			pos = pos + outlen;
788 			bsz = bsz - outlen;
789 		}
790 
791 		total = total + dlslot->a_data_fill;
792 
793 		if ((bsz > 0) && (pos < total)) {
794 			notdone = total - pos;
795 			if (notdone <= bsz) {
796 				outlen = notdone;
797 			} else {
798 				outlen = bsz;
799 			}
800 /*###778 [cc] subscripted value is neither array nor pointer%%%*/
801 			bzero(&buf[len],outlen);
802 			len = len + outlen;
803 			pos = pos + outlen;
804 			bsz = bsz - outlen;
805 		}
806 
807 		total = total + dlslot->a_bss;
808 
809 		if ((bsz > 0) && (pos < total)) {
810 			notdone = total - pos;
811 			if (notdone <= bsz) {
812 				outlen = notdone;
813 			} else {
814 				outlen = bsz;
815 			}
816 /*###793 [cc] subscripted value is neither array nor pointer%%%*/
817 			bzero(&buf[len],outlen);
818 			len = len + outlen;
819 			pos = pos + outlen;
820 			bsz = bsz - outlen;
821 		}
822 
823 		total = total + dlslot->a_bss_fill;
824 
825 		if ((bsz > 0) && (pos < total)) {
826 			notdone = total - pos;
827 			if (notdone <= bsz) {
828 				outlen = notdone;
829 			} else {
830 				outlen = bsz;
831 			}
832 /*###808 [cc] subscripted value is neither array nor pointer%%%*/
833 			bzero(&buf[len],outlen);
834 			len = len + outlen;
835 			pos = pos + outlen;
836 			bsz = bsz - outlen;
837 		}
838 
839 		dlslot->a_lseek = pos;
840 
841 	}
842 
843 	return(len);
844 }
845 /*###820 [cc] syntax error at end of input%%%*/
846