Annotation of researchv9/jerq/sgs/compress/copy.c, revision 1.1

1.1     ! root        1: /*
        !             2: *     static char ID_cp[] = "@(#) copy.c: 1.4 10/7/83";
        !             3: 
        !             4: */
        !             5: #include       <stdio.h>
        !             6: #include       <sys/types.h>
        !             7: #include       <sys/stat.h>
        !             8: #define        ERROR   0
        !             9: #define BSIZE  256
        !            10: #include       "filehdr.h"
        !            11: #include       "scnhdr.h"
        !            12: #include       "reloc.h"
        !            13: #include       "syms.h"
        !            14: #include       "linenum.h"
        !            15: #include       "ldfcn.h"
        !            16: 
        !            17: LDFILE         *oldfile;
        !            18: FILE   *compress;
        !            19: 
        !            20: int
        !            21: cpyfile(argv,argv2)
        !            22: char   *argv;
        !            23: char   *argv2;
        !            24: {
        !            25: 
        !            26:        extern int      copy();
        !            27:        extern int      vflag;
        !            28:        FILHDR          fhead;
        !            29:        LINENO          line;
        !            30:        RELOC           rel;
        !            31:        SCNHDR          sect;
        !            32:        SYMENT          symbol;
        !            33:        AUXENT          auxil;
        !            34:        long            indx;
        !            35:        long            datasze;
        !            36:        int             sumrel;
        !            37:        int             sumln;
        !            38:        long            frstrel;
        !            39:        long            frstln;
        !            40:        int             i;
        !            41:        long            k;
        !            42: #ifdef FLEXNAMES
        !            43:        char            buf[BUFSIZ];
        !            44: #endif
        !            45:        struct stat     statrec;
        !            46:        unsigned short  fmode;
        !            47: 
        !            48:        indx = 0;
        !            49:        sumrel = 0;
        !            50:        sumln = 0;
        !            51:        frstrel = 0;
        !            52:        frstln = 0;
        !            53: 
        !            54:        if ((oldfile = ldopen(argv, NULL)) == NULL) {
        !            55:                fprintf(stderr,"unable to open %s \n", *argv);
        !            56:                return(FAILURE);
        !            57:        }
        !            58:        if (stat(argv, &statrec) != 0) {
        !            59:                fprintf(stderr,"unable to obtain mode of %s \n", *argv);
        !            60:                return(FAILURE);
        !            61:        }
        !            62:        fmode=statrec.st_mode;
        !            63:        if ((compress = fopen(argv2, "w")) == NULL) {
        !            64:                fprintf(stderr,"unable to create %s\n", argv2);
        !            65:                return(FAILURE);
        !            66:        }
        !            67:        chmod(argv2,fmode);
        !            68: 
        !            69:        if ( ldfhread(oldfile, &fhead) == FAILURE) {
        !            70:                if (vflag > 0)
        !            71:                        fprintf(stderr,"cannot read header\n");
        !            72:                return(ERROR);
        !            73:        }
        !            74: 
        !            75:        indx += FILHSZ;
        !            76:        if (fwrite(&fhead, FILHSZ, 1, compress) != 1)
        !            77:                return(ERROR);
        !            78: 
        !            79:        if ( ldohseek(oldfile) == SUCCESS)
        !            80:                if ( copy((long)HEADER(oldfile).f_opthdr) != SUCCESS) {
        !            81:                        if ( vflag > 0)
        !            82:                                fprintf(stderr,"error in copying opt header\n");
        !            83:                        return(ERROR);
        !            84:                }
        !            85:        indx += HEADER(oldfile).f_opthdr;
        !            86: 
        !            87:        for (i=1; i <= HEADER(oldfile).f_nscns; ++i) {
        !            88:                if ( ldshread(oldfile, i, &sect) != SUCCESS) {
        !            89:                        if ( vflag > 0)
        !            90:                                fprintf(stderr,"cannot read sect head at %d\n", i);
        !            91:                        return(ERROR);
        !            92:                }
        !            93:                if ( i==0 || frstrel == 0)
        !            94:                        frstrel = sect.s_relptr;
        !            95:                if ( i == 0 || frstln == 0)
        !            96:                        frstln = sect.s_lnnoptr;
        !            97:                sumrel += sect.s_nreloc;
        !            98:                sumln += sect.s_nlnno;
        !            99: 
        !           100:                if( fwrite(&sect, SCNHSZ, 1, compress) != 1)
        !           101:                        return(FAILURE);
        !           102:                indx += SCNHSZ;
        !           103:        }
        !           104: 
        !           105:        if (sumrel != 0)
        !           106:                datasze = frstrel - indx;
        !           107:        else
        !           108:                if (sumln != 0)
        !           109:                        datasze = frstln - indx;
        !           110:                else
        !           111:                        datasze = HEADER(oldfile).f_symptr - indx;
        !           112: 
        !           113:        if ( datasze != 0)
        !           114:                if ( copy((long)datasze) != SUCCESS) {
        !           115:                        if ( vflag > 0)
        !           116:                                fprintf(stderr,"error in copying raw data\n");
        !           117:                        return(FAILURE);
        !           118:                }
        !           119:        indx = indx + datasze;
        !           120: 
        !           121:        if ( HEADER(oldfile).f_flags != F_RELFLG && sumrel != 0)
        !           122:                for ( i=0; i < sumrel; i++) {
        !           123:                        if (fread(&rel, RELSZ, 1, IOPTR(oldfile)) < 1)
        !           124:                                return(FAILURE);
        !           125:                        if ( fwrite(&rel, RELSZ, 1, compress) != 1)
        !           126:                                return(FAILURE);
        !           127:                        indx += RELSZ;
        !           128:                }
        !           129: 
        !           130:        if ( HEADER(oldfile).f_flags != F_LNNO && sumln != 0) {
        !           131:                for ( i=0; i < sumln; i++) {
        !           132:                        if (fread(&line, LINESZ, 1, IOPTR(oldfile)) < 1)
        !           133:                                return(FAILURE);
        !           134:                        if (fwrite(&line, LINESZ, 1, compress) != 1)
        !           135:                                return(FAILURE);
        !           136:                        indx += LINESZ;
        !           137:                }
        !           138:        }
        !           139: 
        !           140:        if ( indx != HEADER(oldfile).f_symptr) {
        !           141:                fprintf(stderr,"error in indexing\n");
        !           142:                return(FAILURE);
        !           143:        }
        !           144: 
        !           145:        for(k=0L; k < HEADER(oldfile).f_nsyms; k++) {
        !           146:                ldtbread(oldfile, k, &symbol);
        !           147:                fwrite(&symbol, SYMESZ, 1, compress); 
        !           148:                for ( i=0; i < symbol.n_numaux; i++) {
        !           149:                        if (fread(&auxil, AUXESZ, 1, IOPTR(oldfile)) != 1)
        !           150:                                return(FAILURE);
        !           151:                        k++;
        !           152:                        if(fwrite(&auxil, AUXESZ, 1, compress) != 1)
        !           153:                                return(FAILURE);
        !           154:                }
        !           155:        }
        !           156: #ifdef FLEXNAMES
        !           157:        /*
        !           158:        * Copy the string table (rest of the object file)
        !           159:        */
        !           160:        while ((i = fread(buf, sizeof(char), BUFSIZ, IOPTR(oldfile))) > 0)
        !           161:        {
        !           162:                i -= fwrite(buf, sizeof(char), i, compress);
        !           163:                if (i != 0)
        !           164:                        return (FAILURE);
        !           165:        }
        !           166:        if (i != 0)
        !           167:                return (FAILURE);
        !           168: #endif
        !           169:        fclose(compress);
        !           170:        ldclose(oldfile);
        !           171:        return(SUCCESS);
        !           172: }

unix.superglobalmegacorp.com

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