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