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