|
|
1.1 ! root 1: /* ! 2: * ldclose - close current object file. ! 3: * if current object file is an archive member, ! 4: * set up for next object file from archive. ! 5: * ! 6: * #ifdef PORTAR printable ascii headers archive version ! 7: * #else #ifdef PORT5AR UNIX 5.0 semi-portable archive version ! 8: * #else pre UNIX 5.0 (old) archive version ! 9: * #endif ! 10: */ ! 11: #include <stdio.h> ! 12: #include <ar.h> ! 13: #include "filehdr.h" ! 14: #include "ldfcn.h" ! 15: ! 16: int ! 17: ldclose(ldptr) ! 18: LDFILE *ldptr; ! 19: { ! 20: extern int fseek(); ! 21: extern int fread(); ! 22: extern int fclose(); ! 23: extern int vldldptr(); ! 24: extern int freeldptr(); ! 25: extern long sgetl(); ! 26: ! 27: #ifdef PORTAR ! 28: struct ar_hdr arhdr; ! 29: long ar_size; ! 30: ! 31: if (vldldptr(ldptr) == FAILURE) ! 32: return (SUCCESS); ! 33: if (TYPE(ldptr) == ARTYPE && ! 34: FSEEK(ldptr, -((long)sizeof(arhdr)), BEGINNING) == OKFSEEK && ! 35: FREAD((char *)&arhdr, sizeof(arhdr), 1, ldptr) == 1 && ! 36: !strncmp(arhdr.ar_fmag, ARFMAG, sizeof(arhdr.ar_fmag)) && ! 37: sscanf(arhdr.ar_size, "%ld", &ar_size) == 1) ! 38: { ! 39: /* ! 40: * Be sure OFFSET is even ! 41: */ ! 42: OFFSET(ldptr) += ar_size + sizeof(arhdr) + (ar_size & 01); ! 43: if (FSEEK(ldptr, 0L, BEGINNING) == OKFSEEK && ! 44: FREAD((char *)&(HEADER(ldptr)), FILHSZ, 1, ldptr) == 1) ! 45: { ! 46: return (FAILURE); ! 47: } ! 48: } ! 49: #else ! 50: #ifdef PORT5AR ! 51: struct arf_hdr arhdr; ! 52: long ar_size, nsyms; ! 53: ! 54: if (vldldptr(ldptr) == FAILURE) ! 55: return (SUCCESS); ! 56: if (TYPE(ldptr) == ARTYPE && ! 57: FSEEK(ldptr, -((long)sizeof(arhdr)), BEGINNING) == OKFSEEK && ! 58: FREAD((char *)&arhdr, sizeof(arhdr), 1, ldptr) == 1) ! 59: { ! 60: ar_size = sgetl(arhdr.arf_size); ! 61: /* ! 62: * Be sure offset is even ! 63: */ ! 64: OFFSET(ldptr) += ar_size + sizeof(arhdr) + (ar_size & 01); ! 65: if (FSEEK(ldptr, 0L, BEGINNING) == OKFSEEK && ! 66: FREAD((char *)&(HEADER(ldptr)), FILHSZ, 1, ldptr) == 1) ! 67: { ! 68: return (FAILURE); ! 69: } ! 70: } ! 71: #else ! 72: ARCHDR arhdr; ! 73: ! 74: if (vldldptr(ldptr) == FAILURE) ! 75: return (SUCCESS); ! 76: if (TYPE(ldptr) == ARTYPE && ! 77: FSEEK(ldptr, -((long)ARCHSZ), BEGINNING) == OKFSEEK && ! 78: FREAD((char *)&arhdr, ARCHSZ, 1, ldptr) == 1) ! 79: { ! 80: /* ! 81: * Be sure OFFSET is even ! 82: */ ! 83: OFFSET(ldptr) += arhdr.ar_size + ARCHSZ + (arhdr.ar_size & 01); ! 84: if (FSEEK(ldptr, 0L, BEGINNING) == OKFSEEK && ! 85: FREAD((char *)&(HEADER(ldptr)), FILHSZ, 1, ldptr) == 1) ! 86: { ! 87: return (FAILURE); ! 88: } ! 89: } ! 90: #endif ! 91: #endif ! 92: fclose(IOPTR(ldptr)); ! 93: freeldptr(ldptr); ! 94: return (SUCCESS); ! 95: } ! 96: ! 97: static char ID[] = "@(#) ldclose.c: 1.3 2/16/83";
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.