Annotation of mstools/posix/samples/psxarc/archive.c, revision 1.1

1.1     ! root        1: //
        !             2: // In this file are routines to perform operations on archive files.
        !             3: // They do this by determining the type of the archive and calling a
        !             4: // corresponding type-specific routine.
        !             5: //
        !             6: 
        !             7: #include <stdlib.h>
        !             8: #include <stdio.h>
        !             9: #include <tar.h>
        !            10: #include <string.h>
        !            11: #include "buf.h"
        !            12: #include "psxarc.h"
        !            13: #include "tarhead.h"
        !            14: #include "cpio.h"
        !            15: #include "links.h"
        !            16: 
        !            17: //
        !            18: // These should be in an include file.
        !            19: //
        !            20: 
        !            21: extern void CpioList(), CpioRead(), CpioWrite();
        !            22: extern void TarList(), TarRead(), TarWrite();
        !            23: extern void cpio_itoa();
        !            24: 
        !            25: void
        !            26: ListArchive(PBUF pb)
        !            27: {
        !            28:        PCPIO_HEAD cp;
        !            29:        PTAR_HEAD tp;
        !            30: 
        !            31:        InitLinkList();
        !            32: 
        !            33:        bfill(pb);
        !            34:        cp = (PCPIO_HEAD)pb->data;
        !            35: 
        !            36:        if (0 == strncmp(cp->c_magic, MAGIC, strlen(MAGIC))) {
        !            37:                CpioList(pb);
        !            38:                return;
        !            39:        }
        !            40:        
        !            41:        tp = (PTAR_HEAD)pb->data;
        !            42: 
        !            43:        if (0 == strncmp(tp->s.magic, TMAGIC, strlen(TMAGIC))) {
        !            44:                TarList(pb);
        !            45:                return;
        !            46:        }
        !            47:        fprintf(stderr, "%s: unknown archive type\n", progname);
        !            48:        exit(4);
        !            49: }
        !            50: 
        !            51: void
        !            52: WriteArchive(PBUF pb, int format, char **files, int count)
        !            53: {
        !            54:        InitLinkList();
        !            55: 
        !            56:        if (FORMAT_CPIO == format) {
        !            57:                int len, i;
        !            58:                CPIO_HEAD h;
        !            59: 
        !            60:                CpioWrite(pb, files, count);
        !            61: 
        !            62:                // write the trailer.
        !            63:                (void)strncpy(h.c_magic, MAGIC, strlen(MAGIC));
        !            64:                cpio_itoa(C_ISREG, h.c_mode, sizeof(h.c_mode));
        !            65:                cpio_itoa(sizeof(LASTFILENAME), h.c_namesize,
        !            66:                        sizeof(h.c_namesize));
        !            67:                cpio_itoa(0, h.c_filesize, sizeof(h.c_namesize));
        !            68: 
        !            69:                for (i = 0; i < sizeof(h); ++i) {
        !            70:                        bputc(pb, ((char *)&h)[i]);
        !            71:                }
        !            72: 
        !            73:                // "sizeof" so we get the nul, too
        !            74:                len = sizeof(LASTFILENAME);
        !            75:                for (i = 0; i < len; ++i) {
        !            76:                        bputc(pb, LASTFILENAME[i]);
        !            77:                }
        !            78:                bflush(pb);
        !            79:                return;
        !            80:        }
        !            81:        if (FORMAT_TAR == format) {
        !            82:                TarWrite(pb, files, count);
        !            83:                
        !            84:                // a tar archive is terminated by two blocks of zeroes.
        !            85:                memset(pb->data, 0, sizeof(pb->data));
        !            86:                bflush(pb);
        !            87:                bflush(pb);
        !            88:                return;
        !            89:        }
        !            90:        // shouldn't get here.
        !            91:        exit(10);
        !            92: }
        !            93: 
        !            94: void
        !            95: ReadArchive(PBUF pb)
        !            96: {
        !            97:        PCPIO_HEAD cp;
        !            98:        PTAR_HEAD tp;
        !            99: 
        !           100:        InitLinkList();
        !           101: 
        !           102:        bfill(pb);
        !           103:        cp = (PCPIO_HEAD)pb->data;
        !           104: 
        !           105:        if (0 == strncmp(cp->c_magic, MAGIC, strlen(MAGIC))) {
        !           106:                CpioRead(pb);
        !           107:                return;
        !           108:        }
        !           109:        
        !           110:        tp = (PTAR_HEAD)pb->data;
        !           111: 
        !           112:        if (0 == strncmp(tp->s.magic, TMAGIC, strlen(TMAGIC))) {
        !           113:                TarRead(pb);
        !           114:                return;
        !           115:        }
        !           116:        fprintf(stderr, "%s: unknown archive type\n", progname);
        !           117:        exit(4);
        !           118: }

unix.superglobalmegacorp.com

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