123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- #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 = (void *)(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;
- isabs = tpp->name[0]=='/';
- f.name = (char *)tpp->name+isabs;
- if (verbose)
- print("%s mode %o, %s", f.name, f.mode, 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, long off, long cnt)
- {
- if (cnt>sizeof(buffer))
- print("count too big\n");
- seek(tapefile, 512*(int)r->data+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;
- }
|