1 64f7506b 2006-02-24 devnull #include <u.h>
2 64f7506b 2006-02-24 devnull #include <libc.h>
3 64f7506b 2006-02-24 devnull #include "tapefs.h"
6 64f7506b 2006-02-24 devnull * File system for old tap tapes.
9 64f7506b 2006-02-24 devnull struct tap {
10 64f7506b 2006-02-24 devnull unsigned char name[32];
11 64f7506b 2006-02-24 devnull unsigned char mode[1];
12 64f7506b 2006-02-24 devnull unsigned char uid[1];
13 64f7506b 2006-02-24 devnull unsigned char size[2];
14 64f7506b 2006-02-24 devnull unsigned char tmod[4];
15 64f7506b 2006-02-24 devnull unsigned char taddress[2];
16 64f7506b 2006-02-24 devnull unsigned char unused[20];
17 64f7506b 2006-02-24 devnull unsigned char checksum[2];
18 64f7506b 2006-02-24 devnull } dir[192];
20 64f7506b 2006-02-24 devnull int tapefile;
21 64f7506b 2006-02-24 devnull char buffer[8192];
22 64f7506b 2006-02-24 devnull long cvtime(unsigned char *);
23 64f7506b 2006-02-24 devnull extern int verbose;
24 64f7506b 2006-02-24 devnull extern int newtap;
27 64f7506b 2006-02-24 devnull populate(char *name)
29 64f7506b 2006-02-24 devnull int i, isabs;
30 64f7506b 2006-02-24 devnull struct tap *tpp;
31 64f7506b 2006-02-24 devnull Fileinf f;
33 64f7506b 2006-02-24 devnull replete = 1;
34 64f7506b 2006-02-24 devnull tapefile = open(name, OREAD);
35 64f7506b 2006-02-24 devnull if (tapefile<0)
36 64f7506b 2006-02-24 devnull error("Can't open argument file");
37 64f7506b 2006-02-24 devnull read(tapefile, dir, sizeof dir);
38 64f7506b 2006-02-24 devnull for (i=0, tpp=&dir[8]; i<192; i++, tpp++) {
39 64f7506b 2006-02-24 devnull unsigned char *sp = (unsigned char *)tpp;
40 64f7506b 2006-02-24 devnull int j, cksum = 0;
41 64f7506b 2006-02-24 devnull for (j=0; j<32; j++, sp+=2)
42 64f7506b 2006-02-24 devnull cksum += sp[0] + (sp[1]<<8);
43 64f7506b 2006-02-24 devnull cksum &= 0xFFFF;
44 64f7506b 2006-02-24 devnull if (cksum!=0) {
45 64f7506b 2006-02-24 devnull print("cksum failure\n");
46 64f7506b 2006-02-24 devnull continue;
48 64f7506b 2006-02-24 devnull if (tpp->name[0]=='\0')
49 64f7506b 2006-02-24 devnull continue;
50 64f7506b 2006-02-24 devnull f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8);
51 64f7506b 2006-02-24 devnull if (f.addr==0)
52 64f7506b 2006-02-24 devnull continue;
53 64f7506b 2006-02-24 devnull f.size = tpp->size[0] + (tpp->size[1]<<8);
54 64f7506b 2006-02-24 devnull f.mdate = cvtime(tpp->tmod);
55 64f7506b 2006-02-24 devnull f.mode = tpp->mode[0]&0777;
56 64f7506b 2006-02-24 devnull f.uid = tpp->uid[0]&0377;
57 64f7506b 2006-02-24 devnull isabs = tpp->name[0]=='/';
58 64f7506b 2006-02-24 devnull f.name = (char *)tpp->name+isabs;
59 64f7506b 2006-02-24 devnull if (verbose)
60 64f7506b 2006-02-24 devnull print("%s mode %o uid %d, %s", f.name, f.mode, f.uid, ctime(f.mdate));
61 64f7506b 2006-02-24 devnull poppath(f, 1);
66 64f7506b 2006-02-24 devnull cvtime(unsigned char *tp)
68 64f7506b 2006-02-24 devnull unsigned long t = (tp[1]<<24)+(tp[0]<<16)+(tp[3]<<8)+(tp[2]<<0);
69 64f7506b 2006-02-24 devnull if (!newtap) {
71 64f7506b 2006-02-24 devnull t += 3*365*24*3600;
73 64f7506b 2006-02-24 devnull return t;
77 64f7506b 2006-02-24 devnull popdir(Ram *r)
83 64f7506b 2006-02-24 devnull dotrunc(Ram *r)
89 64f7506b 2006-02-24 devnull docreate(Ram *r)
95 64f7506b 2006-02-24 devnull doread(Ram *r, vlong off, long cnt)
97 64f7506b 2006-02-24 devnull if (cnt>sizeof(buffer))
98 64f7506b 2006-02-24 devnull print("count too big\n");
99 64f7506b 2006-02-24 devnull seek(tapefile, 512*r->addr+off, 0);
100 64f7506b 2006-02-24 devnull read(tapefile, buffer, cnt);
101 64f7506b 2006-02-24 devnull return buffer;
105 64f7506b 2006-02-24 devnull dowrite(Ram *r, char *buf, long off, long cnt)
107 64f7506b 2006-02-24 devnull USED(r); USED(buf); USED(off); USED(cnt);
111 64f7506b 2006-02-24 devnull dopermw(Ram *r)
113 64f7506b 2006-02-24 devnull USED(r);
114 64f7506b 2006-02-24 devnull return 0;