xref: /plan9/sys/src/cmd/tapefs/tpfs.c (revision 41fe996ad1ef7168ab61531223f4e75c6cf225c2)
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