Annotation of researchv9/jerq/sgs/strip/main.c, revision 1.1.1.1

1.1       root        1: # define BUF 256
                      2: /* UNIX HEADER */
                      3: #include       <stdio.h>
                      4: #include       <ar.h>
                      5: 
                      6: /* COMMON SGS HEADERS */
                      7: #include       "filehdr.h"
                      8: #include       "ldfcn.h"
                      9: 
                     10: 
                     11: 
                     12: /* SGS SPECIFIC HEADERS */
                     13: #include       "paths.h"
                     14: #include       "sgs.h"
                     15: 
                     16: /* EXTERNAL VARIABLES DEFINED */
                     17: LDFILE         *ldptr;
                     18: ARCHDR         arhead;
                     19: long           xsize = 0;
                     20: int            aflag;
                     21: long           xmore;
                     22: int            mag;
                     23: char           tmpnam1[sizeof (TMPDIR) + 16],
                     24:                tmpnam2[sizeof (TMPDIR) + 16],
                     25:                tmpnam3[sizeof (TMPDIR) + 16],
                     26:                tmpnam4[sizeof (TMPDIR) + 16];
                     27: #if FLEXNAMES
                     28: char           tmpnam5[sizeof (TMPDIR) + 16];  /* string table temp file */
                     29: #endif
                     30: 
                     31:     /*  The SGS/UNIX Strip Command operates on one or more object files
                     32:      *
                     33:      *  main(argc, argv)
                     34:      *
                     35:      *  parses the command line (setflags( ))
                     36:      *  prepares to field interrupt (catchsig( ))
                     37:      *  opens, processes and closes each command line object file argument
                     38:      *  cleans up after itself 
                     39:      *
                     40:      *  defines:
                     41:      *      - ldptr = ldopen(*argv, NULL) for each command line file argument
                     42:      *      - tmpnam1 = TMPDIR/SGSstrp1?????  to be used for building the 
                     43:      *                 stripped file
                     44:      *
                     45:      *     - tmpnam2 = TMPDIR/SGSstrp2????? to be used for building a
                     46:      *                 temporary partially stripped symbol table
                     47:      *  calls:
                     48:      *      - setflags(--argc, ++argv) to set flags
                     49:      *      - catchsig( ) to set up interrupt handling
                     50:      *      - process(*argv) to direct the stripping of the object file *argv
                     51:      *
                     52:      *  prints:
                     53:      *      - a usage message if there are no command line object file arguments
                     54:      *      - an error message if it can't open a file or if it isn't MAGIC
                     55:      *
                     56:      *  exits successfully always
                     57:      */
                     58: 
                     59: 
                     60: main(argc, argv)
                     61: 
                     62: int    argc;
                     63: char   **argv;
                     64: 
                     65: {
                     66:     /* UNIX FUNCTIONS CALLED */
                     67:     extern             fprintf( ),
                     68:                        sprintf( ),
                     69:                        sputl( ),
                     70:                        unlink( );
                     71:     extern int         getpid( );
                     72: #ifdef PORT5AR
                     73:     extern long                time( );
                     74: #endif
                     75: 
                     76:     /* OBJECT FILE ACCESS ROUTINES CALLED */
                     77:     extern LDFILE      *ldopen( );
                     78:     extern int         ldaclose( );
                     79: 
                     80:     /* STRIP FUNCTIONS CALLED */
                     81:     extern int         setflags( ),
                     82:                        process( );
                     83:     extern             catchsig( ),
                     84:                        copyarh( ),
                     85:                        resetsig( );
                     86:     extern  FILE       *stripout;
                     87:            FILE        *tmp;
                     88:     extern  long       xmore;
                     89:     short              buf[BUF];
                     90:     int                        nitems,
                     91:                        retval = 0;             /* exit return value */
                     92: #ifdef PORT5AR
                     93:     struct  ar_hdr     arhbuf;
                     94: #endif
                     95: 
                     96: 
                     97: 
                     98:     if ((argc = setflags(--argc, ++argv)) == 0) {
                     99: #if UNIX
                    100:        fprintf(stderr,"usage:  %sstrip [-l] [-x] [-r] file ...\n", SGS);
                    101: #else
                    102:        fprintf( stderr, "usage: %sstrip [-l] [-x] [-r] [-s] [-f] file ...\n", SGS);
                    103: #endif
                    104:        exit(0);
                    105:     }
                    106: 
                    107:        sprintf(tmpnam1, "%s/%sstrp1%d", TMPDIR, SGS, getpid( ));
                    108:        sprintf(tmpnam2, "%s/%sstrp2%d", TMPDIR, SGS, getpid( ));
                    109:        sprintf(tmpnam3, "%s/%sstrp3%d", TMPDIR, SGS, getpid( ));
                    110:        sprintf(tmpnam4, "%s/%sstrp4%d", TMPDIR, SGS, getpid( ));
                    111: #if FLEXNAMES
                    112:        sprintf( tmpnam5, "%s/%sstrp5%d", TMPDIR, SGS, getpid( ));
                    113: #endif
                    114:        catchsig( );
                    115: 
                    116:        for (   ; argc > 0; --argc, ++argv) {
                    117:                if ((ldptr = ldopen(*argv, NULL)) == NULL) {
                    118:                        fprintf( stderr, "%sstrip:      %s:     cannot open\n", SGS, *argv );
                    119:                        continue;
                    120:                }
                    121: 
                    122:                mag = TYPE(ldptr);
                    123:                if (!ISMAGIC (TYPE(ldptr)) && (TYPE(ldptr) != ARTYPE)) {
                    124:                        fprintf(stderr, "%sstrip:  %s:  bad magic\n", SGS, *argv);
                    125:                        ldaclose(ldptr);
                    126: 
                    127:                } else if (TYPE(ldptr) == ARTYPE) {
                    128:                        aflag = 1;
                    129:                        do {
                    130:                            if (ldahread(ldptr, &arhead) != SUCCESS) {
                    131:                                fprintf(stderr,"error in archive hdr read %s    %s\n", *argv,arhead.ar_name);
                    132:                                ldaclose(ldptr);
                    133:                                exit(1);
                    134:                                }
                    135: 
                    136:                            if (process(*argv) != SUCCESS) {
                    137:                                /* abandon processing archive, bail out */
                    138:                                ldaclose(ldptr);
                    139:                                retval = 1;     /* return an error code */
                    140:                                goto getout;
                    141:                                }
                    142:                        } while (xmore != SUCCESS);
                    143: 
                    144:                        if ((stripout = fopen(tmpnam4, "r")) == NULL) {
                    145:                                fprintf(stderr,"cannot open temporary file %s for reading  \n", tmpnam4);
                    146:                                exit(1);
                    147:                        }
                    148:                        if ((tmp  = fopen(*argv, "w")) == NULL) {
                    149:                                fprintf(stderr,"cannot open temporary file %s for writing\n", *argv);
                    150:                                exit(1);
                    151:                        }
                    152: 
                    153: #if defined(PORTAR) || defined(PORT5AR)
                    154:                        /* rewrite the archive header without a symbol dir */
                    155:                        fprintf(stderr,"%sstrip: Warning - symbol directory deleted from archive %s\n",
                    156:                                SGS, *argv);
                    157:                        fprintf(stderr,"        execute  `ar ts %s` to restore symbol directory.\n",
                    158:                                *argv);
                    159: #endif
                    160: 
                    161: #ifdef PORT5AR
                    162:                        strncpy(arhbuf.ar_magic,ARMAG,SARMAG);
                    163:                        strncpy(arhbuf.ar_name,*argv,sizeof(arhbuf.ar_name));
                    164:                        sputl(time(NULL),arhbuf.ar_date);
                    165:                        sputl(0L,arhbuf.ar_syms);
                    166:                        if (fwrite(&arhbuf,sizeof(struct ar_hdr),1,tmp) != 1) {
                    167: #else
                    168: #ifdef PORTAR
                    169:                        if (fwrite( ARMAG, SARMAG, 1, tmp ) != 1) {
                    170: #else
                    171:                        if (fwrite( ARMAG, sizeof(ARMAG), 1, tmp ) != 1) {
                    172: #endif
                    173: #endif
                    174:                                error( *argv, "can't recreate file", 5 );
                    175:                                resetsig( );
                    176:                                exit(1);
                    177:                        }
                    178:                        while((nitems = fread(buf,sizeof(short), BUF, stripout)) != 0 ) {
                    179:                                if (fwrite(buf,sizeof(short), nitems,tmp) != nitems) {
                    180:                                        error(*argv,"can't recreate file ",5);
                    181:                                        resetsig( );
                    182:                                        exit(1);
                    183:                                }
                    184:                        }
                    185: 
                    186:                } else { /* not an archive */
                    187:                        (void) process(*argv);
                    188:                }
                    189:        } /* for */
                    190: 
                    191: getout:
                    192:        unlink(tmpnam1);
                    193:        unlink(tmpnam2);
                    194:        unlink(tmpnam3);
                    195:        unlink(tmpnam4);
                    196: #if FLEXNAMES
                    197:        unlink(tmpnam5);
                    198: #endif
                    199:        exit(retval);
                    200: }
                    201: /*
                    202:  *     @(#) main.c: 1.5 11/17/83
                    203:  */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.