|
|
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.