Annotation of researchv9/jerq/sgs/strip/main.c, revision 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.