1bd389b36SDavid du Colombier #include <u.h>
2bd389b36SDavid du Colombier #include <libc.h>
3bd389b36SDavid du Colombier #include "tapefs.h"
4bd389b36SDavid du Colombier
5219b2ee8SDavid du Colombier /*
6219b2ee8SDavid du Colombier * File system for tp tapes. dectape versions have 192
7219b2ee8SDavid du Colombier * entries, magtape have 496. This treats the same
8219b2ee8SDavid du Colombier * by ignoring entries with bad header checksums
9219b2ee8SDavid du Colombier */
10bd389b36SDavid du Colombier
11bd389b36SDavid du Colombier struct tp {
12bd389b36SDavid du Colombier unsigned char name[32];
13bd389b36SDavid du Colombier unsigned char mode[2];
14bd389b36SDavid du Colombier unsigned char uid[1];
15bd389b36SDavid du Colombier unsigned char gid[1];
16bd389b36SDavid du Colombier unsigned char unused[1];
17bd389b36SDavid du Colombier unsigned char size[3];
18bd389b36SDavid du Colombier unsigned char tmod[4];
19bd389b36SDavid du Colombier unsigned char taddress[2];
20*41fe996aSDavid du Colombier unsigned char unused2[16];
21bd389b36SDavid du Colombier unsigned char checksum[2];
22219b2ee8SDavid du Colombier } dir[496+8];
23219b2ee8SDavid du Colombier
24219b2ee8SDavid du Colombier char buffer[8192];
25219b2ee8SDavid du Colombier int tapefile;
26bd389b36SDavid du Colombier
27bd389b36SDavid du Colombier void
populate(char * name)28bd389b36SDavid du Colombier populate(char *name)
29bd389b36SDavid du Colombier {
307dd7cddfSDavid du Colombier int i, isabs, badcksum, goodcksum;
31bd389b36SDavid du Colombier struct tp *tpp;
32bd389b36SDavid du Colombier Fileinf f;
33bd389b36SDavid du Colombier
34bd389b36SDavid du Colombier replete = 1;
35bd389b36SDavid du Colombier tapefile = open(name, OREAD);
36bd389b36SDavid du Colombier if (tapefile<0)
37bd389b36SDavid du Colombier error("Can't open argument file");
38219b2ee8SDavid du Colombier read(tapefile, dir, sizeof dir);
397dd7cddfSDavid du Colombier badcksum = goodcksum = 0;
40219b2ee8SDavid du Colombier for (i=0, tpp=&dir[8]; i<496; i++, tpp++) {
41219b2ee8SDavid du Colombier unsigned char *sp = (unsigned char *)tpp;
42219b2ee8SDavid du Colombier int j, cksum = 0;
43219b2ee8SDavid du Colombier for (j=0; j<32; j++, sp+=2)
44219b2ee8SDavid du Colombier cksum += sp[0] + (sp[1]<<8);
45219b2ee8SDavid du Colombier cksum &= 0xFFFF;
467dd7cddfSDavid du Colombier if (cksum!=0) {
477dd7cddfSDavid du Colombier badcksum++;
48219b2ee8SDavid du Colombier continue;
497dd7cddfSDavid du Colombier }
507dd7cddfSDavid du Colombier goodcksum++;
51bd389b36SDavid du Colombier if (tpp->name[0]=='\0')
52bd389b36SDavid du Colombier continue;
53*41fe996aSDavid du Colombier f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8);
54219b2ee8SDavid du Colombier if (f.addr==0)
55219b2ee8SDavid du Colombier continue;
56bd389b36SDavid du Colombier f.size = (tpp->size[0]<<16) + (tpp->size[1]<<0) + (tpp->size[2]<<8);
57bd389b36SDavid du Colombier f.mdate = (tpp->tmod[2]<<0) + (tpp->tmod[3]<<8)
58bd389b36SDavid du Colombier +(tpp->tmod[0]<<16) + (tpp->tmod[1]<<24);
59bd389b36SDavid du Colombier f.mode = tpp->mode[0]&0777;
60ed250ae1SDavid du Colombier f.uid = tpp->uid[0];
61ed250ae1SDavid du Colombier f.gid = tpp->gid[0];
62bd389b36SDavid du Colombier isabs = tpp->name[0]=='/';
63bd389b36SDavid du Colombier f.name = (char *)tpp->name+isabs;
64bd389b36SDavid du Colombier poppath(f, 1);
65bd389b36SDavid du Colombier }
667dd7cddfSDavid du Colombier fprint(2, "%d bad checksums, %d good\n", badcksum, goodcksum);
67bd389b36SDavid du Colombier }
68bd389b36SDavid du Colombier
69bd389b36SDavid du Colombier void
popdir(Ram * r)70bd389b36SDavid du Colombier popdir(Ram *r)
71bd389b36SDavid du Colombier {
72bd389b36SDavid du Colombier USED(r);
73bd389b36SDavid du Colombier }
74bd389b36SDavid du Colombier
75bd389b36SDavid du Colombier void
dotrunc(Ram * r)76bd389b36SDavid du Colombier dotrunc(Ram *r)
77bd389b36SDavid du Colombier {
78bd389b36SDavid du Colombier USED(r);
79bd389b36SDavid du Colombier }
80bd389b36SDavid du Colombier
81bd389b36SDavid du Colombier void
docreate(Ram * r)82bd389b36SDavid du Colombier docreate(Ram *r)
83bd389b36SDavid du Colombier {
84bd389b36SDavid du Colombier USED(r);
85bd389b36SDavid du Colombier }
86bd389b36SDavid du Colombier
87bd389b36SDavid du Colombier char *
doread(Ram * r,vlong off,long cnt)88*41fe996aSDavid du Colombier doread(Ram *r, vlong off, long cnt)
89bd389b36SDavid du Colombier {
90219b2ee8SDavid du Colombier if (cnt>sizeof(buffer))
91219b2ee8SDavid du Colombier print("count too big\n");
92*41fe996aSDavid du Colombier seek(tapefile, 512*r->addr+off, 0);
93219b2ee8SDavid du Colombier read(tapefile, buffer, cnt);
94219b2ee8SDavid du Colombier return buffer;
95bd389b36SDavid du Colombier }
96bd389b36SDavid du Colombier
97bd389b36SDavid du Colombier void
dowrite(Ram * r,char * buf,long off,long cnt)98bd389b36SDavid du Colombier dowrite(Ram *r, char *buf, long off, long cnt)
99bd389b36SDavid du Colombier {
100bd389b36SDavid du Colombier USED(r); USED(buf); USED(off); USED(cnt);
101bd389b36SDavid du Colombier }
102bd389b36SDavid du Colombier
103bd389b36SDavid du Colombier int
dopermw(Ram * r)104bd389b36SDavid du Colombier dopermw(Ram *r)
105bd389b36SDavid du Colombier {
106bd389b36SDavid du Colombier USED(r);
107bd389b36SDavid du Colombier return 0;
108bd389b36SDavid du Colombier }
109