|
|
1.1 root 1: /* UNIX HEADER */
2: #include <stdio.h>
3: #include <ar.h>
4:
5: /* COMMON SGS HEADERS */
6: #include "filehdr.h"
7: #include "ldfcn.h"
8:
9: /* SGS SPECIFIC HEADER */
10:
11: #include "paths.h"
12: #include "sgs.h"
13: /* STRIP HEADER */
14: #include "defs.h"
15:
16: /* EXTERNAL VARIABLES DEFINED */
17: FILE *strp1;
18: FILE *strp2;
19: FILE *stripout;
20: FILHDR filehead;
21: #if AR16WR
22: FILE *tempfil, *readtmp;
23: #endif
24:
25:
26: /* process(filename)
27: *
28: * directs the stripping of the named object file
29: * checks the object file header to determine that it can be stripped
30: * opens a temporary file (tmpnam1) and then builds the stripped file in it
31: * copies the temporary stripped file back to its original place (filename)
32: *
33: * the flags in the file header are set to reflect the new state
34: * of the file:
35: * if all flags are OFF there will be no symbols or line numbers
36: * if lflag is ON then there will be no line numbers
37: * if sflag is ON then there will be no local symbols
38: * if rflag or xflag is ON then there will be no local symbols
39: * or line numbers
40: * if bflag is ON then there will be no local symbols except
41: * .bb, .eb, .bf, .ef
42: * if fflag if ON then there will be no local symbols or line numbers
43: * and no relocation except from a section of type COPY
44: *
45: * defines:
46: * - strp1 = fopen(tmpnam1, "w") for building temporary
47: * = fopen(tmpnam1, "r") for copying temporary to original
48: * - strp2 = fopen(tmpnam2, "w") for building temporary
49: * - stripout = fopen(filename "w") for copying temporary to original
50: *
51: * calls:
52: * - checkflags(filename, &filehead) to check object file flags
53: * - buildtmp(filename, &filehead) to build the temporary file
54: * - copytmp(filename, &filehead) to copy the temporary to the original
55: * - error(filename, message, level) when an error occurs; level
56: * indicates the severity of the error and the current strip state
57: *
58: * returns SUCCESS or FAILURE
59: */
60:
61:
62: int
63: process(filename)
64:
65: char *filename;
66:
67: {
68: /* UNIX FUNCTIONS CALLED */
69: extern FILE *fopen( );
70: extern fclose( ),
71: exit( );
72: extern int fseek( );
73: extern long ftell( );
74:
75: /* COMMON OBJECT FILE ACCESS ROUTINES CALLED */
76: extern int ldaclose( );
77:
78: /* STRIP FUNCTIONS CALLED */
79: extern int checkflags( ),
80: buildtmp( ),
81: copyarh( ),
82: copytmp( );
83: extern error( );
84:
85: /* EXTERNAL VARIABLES USED */
86: extern LDFILE *ldptr;
87: extern char tmpnam1[ ],
88: tmpnam2[ ],
89: tmpnam3[ ],
90: tmpnam4[ ];
91: extern FILE *strp1,
92: *strp2,
93: *stripout;
94: #if AR16WR
95: extern FILE *tempfil,
96: *readtmp,
97: #endif
98: extern FILHDR filehead;
99: extern int rflag,
100: sflag;
101: extern int fflag;
102: extern int lflag;
103: extern ARCHDR arhead;
104: extern int aflag;
105: extern long xmore;
106: extern int mag;
107: #if FLEXNAMES
108: extern long string_size;
109: #endif
110:
111:
112: if (ldfhread(ldptr, &filehead) != SUCCESS)
113: {
114: error(filename, "cannot read file header", 1);
115: return(FAILURE);
116: }
117: else
118: {
119: if ( ! ISMAGIC(filehead.f_magic) )
120: {
121: error(filename, "not the correct magic number", 1);
122: return(FAILURE);
123: }
124: }
125:
126:
127: if (checkflags(filename, &filehead) != SUCCESS)
128: return(FAILURE);
129:
130: if ((strp1 = fopen(tmpnam1, "w")) == NULL)
131: {
132: error(filename, "cannot open temporary file", 1);
133: exit(FATAL);
134: }
135: if ((strp2 = fopen(tmpnam2, "w")) == NULL)
136: {
137: error(filename, "cannot open temporary file", 1);
138: exit(FATAL);
139: }
140:
141: #if AR16WR
142: if ( rflag || sflag )
143: {
144: if ((tempfil = fopen(tmpnam3, "w")) == NULL)
145: {
146: error(filename, "cannot open temporary file", 1);
147: exit(FATAL);
148: }
149: if ((readtmp = fopen(tmpnam3, "r")) == NULL)
150: {
151: error(filename, "cannot open temporary file", 1);
152: exit(FATAL);
153: }
154: }
155: #endif
156:
157: if (buildtmp(filename, &filehead) == SUCCESS)
158: {
159: xmore = ldclose(ldptr);
160: fclose(strp1);
161: fclose(strp2);
162:
163: #if AR16WR
164: if ( rflag || sflag )
165: {
166: fclose(tempfil);
167: fclose(readtmp);
168: }
169: #else
170: freetempent( );
171: #endif
172:
173: if (aflag)
174: {
175: aflag = 0;
176: if ((stripout = fopen(tmpnam4, "w")) == NULL)
177: {
178: error(filename, "cannot write cannot strip", 0);
179: return(FAILURE);
180: }
181: }
182: else if (TYPE(ldptr) != ARTYPE)
183: if ((stripout = fopen( filename, "w" )) == NULL)
184: {
185: error(filename, "cannot write, cannot strip",5);
186: return( FAILURE );
187: }
188:
189:
190: if ((strp1 = fopen(tmpnam1, "r")) == NULL)
191: {
192: error(filename, "cannot open temporary file", 5);
193: exit(FATAL);
194: }
195: if ((strp2 = fopen(tmpnam2, "r")) == NULL)
196: {
197: error(filename, "cannot open temporary file", 5);
198: exit(FATAL);
199: }
200:
201: if (TYPE(ldptr) == ARTYPE)
202: {
203: fseek(strp1,0L,2);
204: fseek(strp2,0L,2);
205: arhead.ar_size = ftell(strp1) + ftell(strp2) + sizeof(FILHDR);
206: #if FLEXNAMES
207: if (string_size > 0L)
208: arhead.ar_size += string_size;
209: #endif
210: arhead.ar_size += (arhead.ar_size & 1);
211: fseek(strp1,0L,0);
212: fseek(strp2,0L,0);
213: if (copyarh(filename, &arhead) != SUCCESS)
214: {
215: fprintf(stderr, "can't copy archive header back");
216: }
217: }
218:
219: /* set the new file header flags appropriately */
220: if (!lflag)
221: filehead.f_flags |= F_LSYMS;
222: if (!sflag)
223: filehead.f_flags |= F_LNNO;
224: #if !UNIX
225: if (fflag)
226: filehead.f_flags |= F_RELFLG;
227: #endif
228:
229: if (copytmp(filename, &filehead) == SUCCESS)
230: {
231: if (xmore == SUCCESS )
232: fclose(stripout);
233: fclose(strp1);
234: fclose(strp2);
235: }
236: }
237:
238: return(SUCCESS);
239: }
240:
241:
242: int
243: copyarh(filename, arhead)
244:
245: char *filename;
246: ARCHDR *arhead;
247:
248:
249: {
250:
251: /* UNIX FUNCTIONS CALLED */
252:
253: extern int fwrite( );
254: extern sputl( );
255:
256: /* STRIP FUNCTIONS CALLED */
257:
258: extern resetsig( ),
259: error( );
260:
261: /* EXTERNAL VARIABLES USED */
262:
263: extern LDFILE *ldptr;
264:
265: extern FILE *stripout;
266:
267: #ifdef PORT5AR
268: /* LOCAL VARIABLES USED */
269:
270: struct arf_hdr arfbuf;
271:
272: strncpy(arfbuf.arf_name,arhead->ar_name,sizeof(arfbuf.arf_name));
273: sputl(arhead->ar_date,arfbuf.arf_date);
274: sputl((long)arhead->ar_uid,arfbuf.arf_uid);
275: sputl((long)arhead->ar_gid,arfbuf.arf_gid);
276: sputl(arhead->ar_mode,arfbuf.arf_mode);
277: sputl(arhead->ar_size,arfbuf.arf_size);
278: if (fwrite( &arfbuf, sizeof( struct arf_hdr ), 1, stripout ) != 1 )
279: #else
280: #ifdef PORTAR
281: struct ar_hdr arbuf;
282: char *p;
283:
284: sprintf( arbuf.ar_name, "%-16s", arhead->ar_name );
285: p = arbuf.ar_name + sizeof( arbuf.ar_name ) - 1;
286: while ( *--p == ' ' );
287: *++p = '/';
288:
289: sprintf( arbuf.ar_date, "%-12ld", arhead->ar_date );
290: sprintf( arbuf.ar_uid, "%-6u", arhead->ar_uid );
291: sprintf( arbuf.ar_gid, "%-6u", arhead->ar_gid );
292: sprintf( arbuf.ar_mode, "%-8o", arhead->ar_mode );
293: sprintf( arbuf.ar_size, "%-10ld", arhead->ar_size );
294: strncpy( arbuf.ar_fmag, ARFMAG, sizeof( arbuf.ar_fmag ) );
295: if (fwrite( &arbuf, sizeof( struct ar_hdr ), 1, stripout ) != 1)
296: #else
297: if (fwrite(&arhead, sizeof(ARCHDR), 1, stripout) != 1)
298: #endif
299: #endif
300: {
301: error(filename, "cannot recreate archive header", 5);
302: resetsig( );
303: return(FAILURE);
304: }
305: else
306: {
307: return(SUCCESS);
308: }
309: }
310: /*
311: * @(#)process.c 1.9 11/17/83;
312: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.