1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include "tapefs.h"
4219b2ee8SDavid du Colombier
5219b2ee8SDavid du Colombier /*
6219b2ee8SDavid du Colombier * File system for old tap tapes.
7219b2ee8SDavid du Colombier */
8219b2ee8SDavid du Colombier
9219b2ee8SDavid du Colombier struct tap {
10219b2ee8SDavid du Colombier unsigned char name[32];
11219b2ee8SDavid du Colombier unsigned char mode[1];
12219b2ee8SDavid du Colombier unsigned char uid[1];
13219b2ee8SDavid du Colombier unsigned char size[2];
14219b2ee8SDavid du Colombier unsigned char tmod[4];
15219b2ee8SDavid du Colombier unsigned char taddress[2];
16219b2ee8SDavid du Colombier unsigned char unused[20];
17219b2ee8SDavid du Colombier unsigned char checksum[2];
18219b2ee8SDavid du Colombier } dir[192];
19219b2ee8SDavid du Colombier
20219b2ee8SDavid du Colombier int tapefile;
21219b2ee8SDavid du Colombier char buffer[8192];
22219b2ee8SDavid du Colombier long cvtime(unsigned char *);
237dd7cddfSDavid du Colombier extern int verbose;
247dd7cddfSDavid du Colombier extern int newtap;
25219b2ee8SDavid du Colombier
26219b2ee8SDavid du Colombier void
populate(char * name)27219b2ee8SDavid du Colombier populate(char *name)
28219b2ee8SDavid du Colombier {
29219b2ee8SDavid du Colombier int i, isabs;
30219b2ee8SDavid du Colombier struct tap *tpp;
31219b2ee8SDavid du Colombier Fileinf f;
32219b2ee8SDavid du Colombier
33219b2ee8SDavid du Colombier replete = 1;
34219b2ee8SDavid du Colombier tapefile = open(name, OREAD);
35219b2ee8SDavid du Colombier if (tapefile<0)
36219b2ee8SDavid du Colombier error("Can't open argument file");
37219b2ee8SDavid du Colombier read(tapefile, dir, sizeof dir);
38219b2ee8SDavid du Colombier for (i=0, tpp=&dir[8]; i<192; i++, tpp++) {
39219b2ee8SDavid du Colombier unsigned char *sp = (unsigned char *)tpp;
40219b2ee8SDavid du Colombier int j, cksum = 0;
41219b2ee8SDavid du Colombier for (j=0; j<32; j++, sp+=2)
42219b2ee8SDavid du Colombier cksum += sp[0] + (sp[1]<<8);
43219b2ee8SDavid du Colombier cksum &= 0xFFFF;
447dd7cddfSDavid du Colombier if (cksum!=0) {
457dd7cddfSDavid du Colombier print("cksum failure\n");
46219b2ee8SDavid du Colombier continue;
477dd7cddfSDavid du Colombier }
48219b2ee8SDavid du Colombier if (tpp->name[0]=='\0')
49219b2ee8SDavid du Colombier continue;
50*41fe996aSDavid du Colombier f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8);
51219b2ee8SDavid du Colombier if (f.addr==0)
52219b2ee8SDavid du Colombier continue;
53219b2ee8SDavid du Colombier f.size = tpp->size[0] + (tpp->size[1]<<8);
54219b2ee8SDavid du Colombier f.mdate = cvtime(tpp->tmod);
55219b2ee8SDavid du Colombier f.mode = tpp->mode[0]&0777;
5639734e7eSDavid du Colombier f.uid = tpp->uid[0]&0377;
57219b2ee8SDavid du Colombier isabs = tpp->name[0]=='/';
58219b2ee8SDavid du Colombier f.name = (char *)tpp->name+isabs;
597dd7cddfSDavid du Colombier if (verbose)
6039734e7eSDavid du Colombier print("%s mode %o uid %d, %s", f.name, f.mode, f.uid, ctime(f.mdate));
61219b2ee8SDavid du Colombier poppath(f, 1);
62219b2ee8SDavid du Colombier }
63219b2ee8SDavid du Colombier }
64219b2ee8SDavid du Colombier
65219b2ee8SDavid du Colombier long
cvtime(unsigned char * tp)66219b2ee8SDavid du Colombier cvtime(unsigned char *tp)
67219b2ee8SDavid du Colombier {
68219b2ee8SDavid du Colombier unsigned long t = (tp[1]<<24)+(tp[0]<<16)+(tp[3]<<8)+(tp[2]<<0);
697dd7cddfSDavid du Colombier if (!newtap) {
70219b2ee8SDavid du Colombier t /= 60;
717dd7cddfSDavid du Colombier t += 3*365*24*3600;
727dd7cddfSDavid du Colombier }
73219b2ee8SDavid du Colombier return t;
74219b2ee8SDavid du Colombier }
75219b2ee8SDavid du Colombier
76219b2ee8SDavid du Colombier void
popdir(Ram * r)77219b2ee8SDavid du Colombier popdir(Ram *r)
78219b2ee8SDavid du Colombier {
79219b2ee8SDavid du Colombier USED(r);
80219b2ee8SDavid du Colombier }
81219b2ee8SDavid du Colombier
82219b2ee8SDavid du Colombier void
dotrunc(Ram * r)83219b2ee8SDavid du Colombier dotrunc(Ram *r)
84219b2ee8SDavid du Colombier {
85219b2ee8SDavid du Colombier USED(r);
86219b2ee8SDavid du Colombier }
87219b2ee8SDavid du Colombier
88219b2ee8SDavid du Colombier void
docreate(Ram * r)89219b2ee8SDavid du Colombier docreate(Ram *r)
90219b2ee8SDavid du Colombier {
91219b2ee8SDavid du Colombier USED(r);
92219b2ee8SDavid du Colombier }
93219b2ee8SDavid du Colombier
94219b2ee8SDavid du Colombier char *
doread(Ram * r,vlong off,long cnt)95*41fe996aSDavid du Colombier doread(Ram *r, vlong off, long cnt)
96219b2ee8SDavid du Colombier {
97219b2ee8SDavid du Colombier if (cnt>sizeof(buffer))
98219b2ee8SDavid du Colombier print("count too big\n");
99*41fe996aSDavid du Colombier seek(tapefile, 512*r->addr+off, 0);
100219b2ee8SDavid du Colombier read(tapefile, buffer, cnt);
101219b2ee8SDavid du Colombier return buffer;
102219b2ee8SDavid du Colombier }
103219b2ee8SDavid du Colombier
104219b2ee8SDavid du Colombier void
dowrite(Ram * r,char * buf,long off,long cnt)105219b2ee8SDavid du Colombier dowrite(Ram *r, char *buf, long off, long cnt)
106219b2ee8SDavid du Colombier {
107219b2ee8SDavid du Colombier USED(r); USED(buf); USED(off); USED(cnt);
108219b2ee8SDavid du Colombier }
109219b2ee8SDavid du Colombier
110219b2ee8SDavid du Colombier int
dopermw(Ram * r)111219b2ee8SDavid du Colombier dopermw(Ram *r)
112219b2ee8SDavid du Colombier {
113219b2ee8SDavid du Colombier USED(r);
114219b2ee8SDavid du Colombier return 0;
115219b2ee8SDavid du Colombier }
116