Blob


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