Blame


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"
4 64f7506b 2006-02-24 devnull
5 64f7506b 2006-02-24 devnull /*
6 64f7506b 2006-02-24 devnull * File system for old tap tapes.
7 64f7506b 2006-02-24 devnull */
8 64f7506b 2006-02-24 devnull
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];
19 64f7506b 2006-02-24 devnull
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;
25 64f7506b 2006-02-24 devnull
26 64f7506b 2006-02-24 devnull void
27 64f7506b 2006-02-24 devnull populate(char *name)
28 64f7506b 2006-02-24 devnull {
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;
32 64f7506b 2006-02-24 devnull
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;
47 64f7506b 2006-02-24 devnull }
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);
62 64f7506b 2006-02-24 devnull }
63 64f7506b 2006-02-24 devnull }
64 64f7506b 2006-02-24 devnull
65 64f7506b 2006-02-24 devnull long
66 64f7506b 2006-02-24 devnull cvtime(unsigned char *tp)
67 64f7506b 2006-02-24 devnull {
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) {
70 64f7506b 2006-02-24 devnull t /= 60;
71 64f7506b 2006-02-24 devnull t += 3*365*24*3600;
72 64f7506b 2006-02-24 devnull }
73 64f7506b 2006-02-24 devnull return t;
74 64f7506b 2006-02-24 devnull }
75 64f7506b 2006-02-24 devnull
76 64f7506b 2006-02-24 devnull void
77 64f7506b 2006-02-24 devnull popdir(Ram *r)
78 64f7506b 2006-02-24 devnull {
79 64f7506b 2006-02-24 devnull USED(r);
80 64f7506b 2006-02-24 devnull }
81 64f7506b 2006-02-24 devnull
82 64f7506b 2006-02-24 devnull void
83 64f7506b 2006-02-24 devnull dotrunc(Ram *r)
84 64f7506b 2006-02-24 devnull {
85 64f7506b 2006-02-24 devnull USED(r);
86 64f7506b 2006-02-24 devnull }
87 64f7506b 2006-02-24 devnull
88 64f7506b 2006-02-24 devnull void
89 64f7506b 2006-02-24 devnull docreate(Ram *r)
90 64f7506b 2006-02-24 devnull {
91 64f7506b 2006-02-24 devnull USED(r);
92 64f7506b 2006-02-24 devnull }
93 64f7506b 2006-02-24 devnull
94 64f7506b 2006-02-24 devnull char *
95 64f7506b 2006-02-24 devnull doread(Ram *r, vlong off, long cnt)
96 64f7506b 2006-02-24 devnull {
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;
102 64f7506b 2006-02-24 devnull }
103 64f7506b 2006-02-24 devnull
104 64f7506b 2006-02-24 devnull void
105 64f7506b 2006-02-24 devnull dowrite(Ram *r, char *buf, long off, long cnt)
106 64f7506b 2006-02-24 devnull {
107 64f7506b 2006-02-24 devnull USED(r); USED(buf); USED(off); USED(cnt);
108 64f7506b 2006-02-24 devnull }
109 64f7506b 2006-02-24 devnull
110 64f7506b 2006-02-24 devnull int
111 64f7506b 2006-02-24 devnull dopermw(Ram *r)
112 64f7506b 2006-02-24 devnull {
113 64f7506b 2006-02-24 devnull USED(r);
114 64f7506b 2006-02-24 devnull return 0;
115 64f7506b 2006-02-24 devnull }