Annotation of researchv9/jerq/sgs/compress/copy.c, revision 1.1.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.