Annotation of researchv9/jerq/sgs/libld/ldopen.c, revision 1.1

1.1     ! root        1: /*
        !             2: * ldopen - get LDFILE, header info for object file.
        !             3: *              if it is an archive, get the first file from the archive.
        !             4: *              if it is an already opened archive, assume ldclose() set
        !             5: *              up everything already.
        !             6: *
        !             7: * #ifdef PORTAR                printable ascii header archive version
        !             8: * #else #ifdef PORT5AR UNIX 5.0 semi-portable archive version
        !             9: * #else                        pre UNIX 5.0 (old) archive version
        !            10: * #endif
        !            11: */
        !            12: #include <stdio.h>
        !            13: #include <ar.h>
        !            14: #include "filehdr.h"
        !            15: #include "ldfcn.h"
        !            16: 
        !            17: LDFILE *
        !            18: ldopen(filename, ldptr)
        !            19:        char *filename;
        !            20:        LDFILE *ldptr; 
        !            21: {
        !            22:        extern FILE *fopen();
        !            23:        extern int fclose();
        !            24:        extern int fseek();
        !            25:        extern int fread();
        !            26:        extern int vldldptr();
        !            27:        extern LDFILE *allocldptr();
        !            28:        extern int freeldptr();
        !            29:        extern long sgetl();
        !            30:        FILE *ioptr;
        !            31:        unsigned short type;
        !            32: #ifdef PORTAR
        !            33:        struct ar_hdr arbuf;
        !            34:        char buf[SARMAG];
        !            35: #else
        !            36: #ifdef PORT5AR
        !            37:        struct ar_hdr arbuf;
        !            38:        long nsyms;
        !            39: #else
        !            40:        unsigned short atype = 0;
        !            41: #endif
        !            42: #endif
        !            43: 
        !            44:        if (vldldptr(ldptr) == FAILURE)
        !            45:        {
        !            46:                if ((ioptr = fopen(filename, "r")) == NULL)
        !            47:                        return (NULL);
        !            48: #ifdef PORTAR
        !            49:                if (fread(buf, sizeof(char) * SARMAG, 1, ioptr) != 1)
        !            50:                        buf[0] = '\0';
        !            51:                fseek(ioptr, 0L, 0);
        !            52: #else
        !            53: #ifdef PORT5AR
        !            54:                if (fread((char *)&arbuf, sizeof(arbuf), 1, ioptr) != 1)
        !            55:                        arbuf.ar_magic[0] = '\0';
        !            56:                fseek(ioptr, 0L, 0);
        !            57: #endif
        !            58: #endif
        !            59:                if (fread((char *)&type, sizeof(type), 1, ioptr) != 1 ||
        !            60:                        (ldptr = allocldptr()) == NULL)
        !            61:                {
        !            62:                        fclose(ioptr);
        !            63:                        return (NULL);
        !            64:                }
        !            65: #ifdef PORTAR
        !            66:                if (strncmp(buf, ARMAG, SARMAG) == 0)
        !            67:                {
        !            68:                        long ar_size;
        !            69: 
        !            70:                        TYPE(ldptr) = USH_ARTYPE;
        !            71:                        if (fseek(ioptr, (long)(sizeof(char) * SARMAG), 0) ==
        !            72:                                OKFSEEK &&
        !            73:                                fread((char *)&arbuf, sizeof(arbuf), 1, ioptr)
        !            74:                                == 1 &&
        !            75:                                !strncmp(arbuf.ar_fmag, ARFMAG,
        !            76:                                sizeof(arbuf.ar_fmag)) &&
        !            77:                                arbuf.ar_name[0] == '/' &&
        !            78:                                sscanf(arbuf.ar_size, "%ld", &ar_size) == 1)
        !            79:                        {
        !            80:                                OFFSET(ldptr) = sizeof(char) * SARMAG +
        !            81:                                        2 * sizeof(struct ar_hdr) +
        !            82:                                        ((ar_size + 01) & ~01);
        !            83:                        }
        !            84:                        else
        !            85:                                OFFSET(ldptr) = sizeof(char) * SARMAG +
        !            86:                                        sizeof(struct ar_hdr);
        !            87:                }
        !            88:                else
        !            89:                {
        !            90:                        TYPE(ldptr) = type;
        !            91:                        OFFSET(ldptr) = 0L;
        !            92:                }
        !            93: #else
        !            94: #ifdef PORT5AR
        !            95:                if (strncmp(arbuf.ar_magic, ARMAG, SARMAG) == 0)
        !            96:                {
        !            97:                        TYPE(ldptr) = USH_ARTYPE;
        !            98:                        nsyms = sgetl(arbuf.ar_syms);
        !            99: 
        !           100:                        OFFSET(ldptr) = (nsyms * sizeof(struct ar_sym)) +
        !           101:                                sizeof(struct arf_hdr) + sizeof(arbuf);
        !           102:                }
        !           103:                else
        !           104:                {
        !           105:                        TYPE(ldptr) = type;
        !           106:                        OFFSET(ldptr) = 0L;
        !           107:                }
        !           108: #else
        !           109:                if (sizeof(ARTYPE) == sizeof(type) ||
        !           110:                        fread((char *)&atype, sizeof(atype), 1, ioptr) != 1)
        !           111:                {
        !           112:                        atype = type;
        !           113:                }
        !           114:                if (atype == USH_ARTYPE ||
        !           115:                        type == USH_ARTYPE)
        !           116:                {
        !           117:                        TYPE(ldptr) = USH_ARTYPE;
        !           118:                        OFFSET(ldptr) = ARCHSZ + sizeof(ARMAG);
        !           119:                }
        !           120:                else
        !           121:                {
        !           122:                        TYPE(ldptr) = type;
        !           123:                        OFFSET(ldptr) = 0L;
        !           124:                }
        !           125: #endif
        !           126: #endif
        !           127:                IOPTR(ldptr) = ioptr;
        !           128:                if (FSEEK(ldptr, 0L, BEGINNING) == OKFSEEK &&
        !           129:                        FREAD((char *)&(HEADER(ldptr)), FILHSZ, 1, ldptr) == 1)
        !           130:                {
        !           131:                        return (ldptr);
        !           132:                }
        !           133:        }
        !           134:        else if (FSEEK(ldptr, 0L, BEGINNING) == OKFSEEK)
        !           135:                return (ldptr);
        !           136:        fclose(IOPTR(ldptr));
        !           137:        freeldptr(ldptr);
        !           138:        return (NULL);
        !           139: }
        !           140: 
        !           141: static char ID[] = "@(#) ldopen.c: 1.4 5/1/83";

unix.superglobalmegacorp.com

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