V9/jerq/sgs/strip/process.c
/* UNIX HEADER */
#include <stdio.h>
#include <ar.h>
/* COMMON SGS HEADERS */
#include "filehdr.h"
#include "ldfcn.h"
/* SGS SPECIFIC HEADER */
#include "paths.h"
#include "sgs.h"
/* STRIP HEADER */
#include "defs.h"
/* EXTERNAL VARIABLES DEFINED */
FILE *strp1;
FILE *strp2;
FILE *stripout;
FILHDR filehead;
#if AR16WR
FILE *tempfil, *readtmp;
#endif
/* process(filename)
*
* directs the stripping of the named object file
* checks the object file header to determine that it can be stripped
* opens a temporary file (tmpnam1) and then builds the stripped file in it
* copies the temporary stripped file back to its original place (filename)
*
* the flags in the file header are set to reflect the new state
* of the file:
* if all flags are OFF there will be no symbols or line numbers
* if lflag is ON then there will be no line numbers
* if sflag is ON then there will be no local symbols
* if rflag or xflag is ON then there will be no local symbols
* or line numbers
* if bflag is ON then there will be no local symbols except
* .bb, .eb, .bf, .ef
* if fflag if ON then there will be no local symbols or line numbers
* and no relocation except from a section of type COPY
*
* defines:
* - strp1 = fopen(tmpnam1, "w") for building temporary
* = fopen(tmpnam1, "r") for copying temporary to original
* - strp2 = fopen(tmpnam2, "w") for building temporary
* - stripout = fopen(filename "w") for copying temporary to original
*
* calls:
* - checkflags(filename, &filehead) to check object file flags
* - buildtmp(filename, &filehead) to build the temporary file
* - copytmp(filename, &filehead) to copy the temporary to the original
* - error(filename, message, level) when an error occurs; level
* indicates the severity of the error and the current strip state
*
* returns SUCCESS or FAILURE
*/
int
process(filename)
char *filename;
{
/* UNIX FUNCTIONS CALLED */
extern FILE *fopen( );
extern fclose( ),
exit( );
extern int fseek( );
extern long ftell( );
/* COMMON OBJECT FILE ACCESS ROUTINES CALLED */
extern int ldaclose( );
/* STRIP FUNCTIONS CALLED */
extern int checkflags( ),
buildtmp( ),
copyarh( ),
copytmp( );
extern error( );
/* EXTERNAL VARIABLES USED */
extern LDFILE *ldptr;
extern char tmpnam1[ ],
tmpnam2[ ],
tmpnam3[ ],
tmpnam4[ ];
extern FILE *strp1,
*strp2,
*stripout;
#if AR16WR
extern FILE *tempfil,
*readtmp,
#endif
extern FILHDR filehead;
extern int rflag,
sflag;
extern int fflag;
extern int lflag;
extern ARCHDR arhead;
extern int aflag;
extern long xmore;
extern int mag;
#if FLEXNAMES
extern long string_size;
#endif
if (ldfhread(ldptr, &filehead) != SUCCESS)
{
error(filename, "cannot read file header", 1);
return(FAILURE);
}
else
{
if ( ! ISMAGIC(filehead.f_magic) )
{
error(filename, "not the correct magic number", 1);
return(FAILURE);
}
}
if (checkflags(filename, &filehead) != SUCCESS)
return(FAILURE);
if ((strp1 = fopen(tmpnam1, "w")) == NULL)
{
error(filename, "cannot open temporary file", 1);
exit(FATAL);
}
if ((strp2 = fopen(tmpnam2, "w")) == NULL)
{
error(filename, "cannot open temporary file", 1);
exit(FATAL);
}
#if AR16WR
if ( rflag || sflag )
{
if ((tempfil = fopen(tmpnam3, "w")) == NULL)
{
error(filename, "cannot open temporary file", 1);
exit(FATAL);
}
if ((readtmp = fopen(tmpnam3, "r")) == NULL)
{
error(filename, "cannot open temporary file", 1);
exit(FATAL);
}
}
#endif
if (buildtmp(filename, &filehead) == SUCCESS)
{
xmore = ldclose(ldptr);
fclose(strp1);
fclose(strp2);
#if AR16WR
if ( rflag || sflag )
{
fclose(tempfil);
fclose(readtmp);
}
#else
freetempent( );
#endif
if (aflag)
{
aflag = 0;
if ((stripout = fopen(tmpnam4, "w")) == NULL)
{
error(filename, "cannot write cannot strip", 0);
return(FAILURE);
}
}
else if (TYPE(ldptr) != ARTYPE)
if ((stripout = fopen( filename, "w" )) == NULL)
{
error(filename, "cannot write, cannot strip",5);
return( FAILURE );
}
if ((strp1 = fopen(tmpnam1, "r")) == NULL)
{
error(filename, "cannot open temporary file", 5);
exit(FATAL);
}
if ((strp2 = fopen(tmpnam2, "r")) == NULL)
{
error(filename, "cannot open temporary file", 5);
exit(FATAL);
}
if (TYPE(ldptr) == ARTYPE)
{
fseek(strp1,0L,2);
fseek(strp2,0L,2);
arhead.ar_size = ftell(strp1) + ftell(strp2) + sizeof(FILHDR);
#if FLEXNAMES
if (string_size > 0L)
arhead.ar_size += string_size;
#endif
arhead.ar_size += (arhead.ar_size & 1);
fseek(strp1,0L,0);
fseek(strp2,0L,0);
if (copyarh(filename, &arhead) != SUCCESS)
{
fprintf(stderr, "can't copy archive header back");
}
}
/* set the new file header flags appropriately */
if (!lflag)
filehead.f_flags |= F_LSYMS;
if (!sflag)
filehead.f_flags |= F_LNNO;
#if !UNIX
if (fflag)
filehead.f_flags |= F_RELFLG;
#endif
if (copytmp(filename, &filehead) == SUCCESS)
{
if (xmore == SUCCESS )
fclose(stripout);
fclose(strp1);
fclose(strp2);
}
}
return(SUCCESS);
}
int
copyarh(filename, arhead)
char *filename;
ARCHDR *arhead;
{
/* UNIX FUNCTIONS CALLED */
extern int fwrite( );
extern sputl( );
/* STRIP FUNCTIONS CALLED */
extern resetsig( ),
error( );
/* EXTERNAL VARIABLES USED */
extern LDFILE *ldptr;
extern FILE *stripout;
#ifdef PORT5AR
/* LOCAL VARIABLES USED */
struct arf_hdr arfbuf;
strncpy(arfbuf.arf_name,arhead->ar_name,sizeof(arfbuf.arf_name));
sputl(arhead->ar_date,arfbuf.arf_date);
sputl((long)arhead->ar_uid,arfbuf.arf_uid);
sputl((long)arhead->ar_gid,arfbuf.arf_gid);
sputl(arhead->ar_mode,arfbuf.arf_mode);
sputl(arhead->ar_size,arfbuf.arf_size);
if (fwrite( &arfbuf, sizeof( struct arf_hdr ), 1, stripout ) != 1 )
#else
#ifdef PORTAR
struct ar_hdr arbuf;
char *p;
sprintf( arbuf.ar_name, "%-16s", arhead->ar_name );
p = arbuf.ar_name + sizeof( arbuf.ar_name ) - 1;
while ( *--p == ' ' );
*++p = '/';
sprintf( arbuf.ar_date, "%-12ld", arhead->ar_date );
sprintf( arbuf.ar_uid, "%-6u", arhead->ar_uid );
sprintf( arbuf.ar_gid, "%-6u", arhead->ar_gid );
sprintf( arbuf.ar_mode, "%-8o", arhead->ar_mode );
sprintf( arbuf.ar_size, "%-10ld", arhead->ar_size );
strncpy( arbuf.ar_fmag, ARFMAG, sizeof( arbuf.ar_fmag ) );
if (fwrite( &arbuf, sizeof( struct ar_hdr ), 1, stripout ) != 1)
#else
if (fwrite(&arhead, sizeof(ARCHDR), 1, stripout) != 1)
#endif
#endif
{
error(filename, "cannot recreate archive header", 5);
resetsig( );
return(FAILURE);
}
else
{
return(SUCCESS);
}
}
/*
* @(#)process.c 1.9 11/17/83;
*/