|
|
1.1 ! root 1: /* ! 2: * ldopen - get LDFILE, header info for object file. ! 3: * if it is an archive, get the first file from the archive. ! 4: * if it is an already opened archive, assume ldclose() set ! 5: * up everything already. ! 6: * ! 7: * #ifdef PORTAR printable ascii header archive version ! 8: * #else #ifdef PORT5AR UNIX 5.0 semi-portable archive version ! 9: * #else pre UNIX 5.0 (old) archive version ! 10: * #endif ! 11: */ ! 12: #include <stdio.h> ! 13: #include <ar.h> ! 14: #include "filehdr.h" ! 15: #include "ldfcn.h" ! 16: ! 17: LDFILE * ! 18: ldopen(filename, ldptr) ! 19: char *filename; ! 20: LDFILE *ldptr; ! 21: { ! 22: extern FILE *fopen(); ! 23: extern int fclose(); ! 24: extern int fseek(); ! 25: extern int fread(); ! 26: extern int vldldptr(); ! 27: extern LDFILE *allocldptr(); ! 28: extern int freeldptr(); ! 29: extern long sgetl(); ! 30: FILE *ioptr; ! 31: unsigned short type; ! 32: #ifdef PORTAR ! 33: struct ar_hdr arbuf; ! 34: char buf[SARMAG]; ! 35: #else ! 36: #ifdef PORT5AR ! 37: struct ar_hdr arbuf; ! 38: long nsyms; ! 39: #else ! 40: unsigned short atype = 0; ! 41: #endif ! 42: #endif ! 43: ! 44: if (vldldptr(ldptr) == FAILURE) ! 45: { ! 46: if ((ioptr = fopen(filename, "r")) == NULL) ! 47: return (NULL); ! 48: #ifdef PORTAR ! 49: if (fread(buf, sizeof(char) * SARMAG, 1, ioptr) != 1) ! 50: buf[0] = '\0'; ! 51: fseek(ioptr, 0L, 0); ! 52: #else ! 53: #ifdef PORT5AR ! 54: if (fread((char *)&arbuf, sizeof(arbuf), 1, ioptr) != 1) ! 55: arbuf.ar_magic[0] = '\0'; ! 56: fseek(ioptr, 0L, 0); ! 57: #endif ! 58: #endif ! 59: if (fread((char *)&type, sizeof(type), 1, ioptr) != 1 || ! 60: (ldptr = allocldptr()) == NULL) ! 61: { ! 62: fclose(ioptr); ! 63: return (NULL); ! 64: } ! 65: #ifdef PORTAR ! 66: if (strncmp(buf, ARMAG, SARMAG) == 0) ! 67: { ! 68: long ar_size; ! 69: ! 70: TYPE(ldptr) = USH_ARTYPE; ! 71: if (fseek(ioptr, (long)(sizeof(char) * SARMAG), 0) == ! 72: OKFSEEK && ! 73: fread((char *)&arbuf, sizeof(arbuf), 1, ioptr) ! 74: == 1 && ! 75: !strncmp(arbuf.ar_fmag, ARFMAG, ! 76: sizeof(arbuf.ar_fmag)) && ! 77: arbuf.ar_name[0] == '/' && ! 78: sscanf(arbuf.ar_size, "%ld", &ar_size) == 1) ! 79: { ! 80: OFFSET(ldptr) = sizeof(char) * SARMAG + ! 81: 2 * sizeof(struct ar_hdr) + ! 82: ((ar_size + 01) & ~01); ! 83: } ! 84: else ! 85: OFFSET(ldptr) = sizeof(char) * SARMAG + ! 86: sizeof(struct ar_hdr); ! 87: } ! 88: else ! 89: { ! 90: TYPE(ldptr) = type; ! 91: OFFSET(ldptr) = 0L; ! 92: } ! 93: #else ! 94: #ifdef PORT5AR ! 95: if (strncmp(arbuf.ar_magic, ARMAG, SARMAG) == 0) ! 96: { ! 97: TYPE(ldptr) = USH_ARTYPE; ! 98: nsyms = sgetl(arbuf.ar_syms); ! 99: ! 100: OFFSET(ldptr) = (nsyms * sizeof(struct ar_sym)) + ! 101: sizeof(struct arf_hdr) + sizeof(arbuf); ! 102: } ! 103: else ! 104: { ! 105: TYPE(ldptr) = type; ! 106: OFFSET(ldptr) = 0L; ! 107: } ! 108: #else ! 109: if (sizeof(ARTYPE) == sizeof(type) || ! 110: fread((char *)&atype, sizeof(atype), 1, ioptr) != 1) ! 111: { ! 112: atype = type; ! 113: } ! 114: if (atype == USH_ARTYPE || ! 115: type == USH_ARTYPE) ! 116: { ! 117: TYPE(ldptr) = USH_ARTYPE; ! 118: OFFSET(ldptr) = ARCHSZ + sizeof(ARMAG); ! 119: } ! 120: else ! 121: { ! 122: TYPE(ldptr) = type; ! 123: OFFSET(ldptr) = 0L; ! 124: } ! 125: #endif ! 126: #endif ! 127: IOPTR(ldptr) = ioptr; ! 128: if (FSEEK(ldptr, 0L, BEGINNING) == OKFSEEK && ! 129: FREAD((char *)&(HEADER(ldptr)), FILHSZ, 1, ldptr) == 1) ! 130: { ! 131: return (ldptr); ! 132: } ! 133: } ! 134: else if (FSEEK(ldptr, 0L, BEGINNING) == OKFSEEK) ! 135: return (ldptr); ! 136: fclose(IOPTR(ldptr)); ! 137: freeldptr(ldptr); ! 138: return (NULL); ! 139: } ! 140: ! 141: static char ID[] = "@(#) ldopen.c: 1.4 5/1/83";
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.