Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include "tapefs.h"

/*
 * File system for old tap tapes.
 */

struct tap {
        unsigned char   name[32];
        unsigned char   mode[1];
        unsigned char   uid[1];
        unsigned char   size[2];
        unsigned char   tmod[4];
        unsigned char   taddress[2];
        unsigned char   unused[20];
        unsigned char   checksum[2];
} dir[192];

int     tapefile;
char    buffer[8192];
long    cvtime(unsigned char *);
extern  int verbose;
extern  int newtap;

void
populate(char *name)
{
        int i, isabs;
        struct tap *tpp;
        Fileinf f;

        replete = 1;
        tapefile = open(name, OREAD);
        if (tapefile<0)
                error("Can't open argument file");
        read(tapefile, dir, sizeof dir);
        for (i=0, tpp=&dir[8]; i<192; i++, tpp++) {
                unsigned char *sp = (unsigned char *)tpp;
                int j, cksum = 0;
                for (j=0; j<32; j++, sp+=2)
                        cksum += sp[0] + (sp[1]<<8);
                cksum &= 0xFFFF;
                if (cksum!=0) {
                        print("cksum failure\n");
                        continue;
                }
                if (tpp->name[0]=='\0')
                        continue;
                f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8);
                if (f.addr==0)
                        continue;
                f.size = tpp->size[0] + (tpp->size[1]<<8);
                f.mdate = cvtime(tpp->tmod);
                f.mode = tpp->mode[0]&0777;
                f.uid = tpp->uid[0]&0377;
                isabs = tpp->name[0]=='/';
                f.name = (char *)tpp->name+isabs;
                if (verbose)
                        print("%s mode %o uid %d, %s", f.name, f.mode, f.uid, ctime(f.mdate));
                poppath(f, 1);
        }
}

long
cvtime(unsigned char *tp)
{
        unsigned long t = (tp[1]<<24)+(tp[0]<<16)+(tp[3]<<8)+(tp[2]<<0);
        if (!newtap) {
                t /= 60;
                t += 3*365*24*3600;
        }
        return t;
}

void
popdir(Ram *r)
{
        USED(r);
}

void
dotrunc(Ram *r)
{
        USED(r);
}

void
docreate(Ram *r)
{
        USED(r);
}

char *
doread(Ram *r, vlong off, long cnt)
{
        if (cnt>sizeof(buffer))
                print("count too big\n");
        seek(tapefile, 512*r->addr+off, 0);
        read(tapefile, buffer, cnt);
        return buffer;
}

void
dowrite(Ram *r, char *buf, long off, long cnt)
{
        USED(r); USED(buf); USED(off); USED(cnt);
}

int
dopermw(Ram *r)
{
        USED(r);
        return 0;
}