xref: /plan9/sys/src/cmd/tapefs/tpfs.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1bd389b36SDavid du Colombier #include <u.h>
2bd389b36SDavid du Colombier #include <libc.h>
3bd389b36SDavid du Colombier #include "tapefs.h"
4bd389b36SDavid du Colombier 
5*219b2ee8SDavid du Colombier /*
6*219b2ee8SDavid du Colombier  * File system for tp tapes.  dectape versions have 192
7*219b2ee8SDavid du Colombier  * entries, magtape have 496.  This treats the same
8*219b2ee8SDavid du Colombier  * by ignoring entries with bad header checksums
9*219b2ee8SDavid 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];
20bd389b36SDavid du Colombier 	unsigned char	unused[16];
21bd389b36SDavid du Colombier 	unsigned char	checksum[2];
22*219b2ee8SDavid du Colombier } dir[496+8];
23*219b2ee8SDavid du Colombier 
24*219b2ee8SDavid du Colombier char	buffer[8192];
25*219b2ee8SDavid du Colombier int	tapefile;
26bd389b36SDavid du Colombier 
27bd389b36SDavid du Colombier void
28bd389b36SDavid du Colombier populate(char *name)
29bd389b36SDavid du Colombier {
30bd389b36SDavid du Colombier 	int i, isabs;
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");
38*219b2ee8SDavid du Colombier 	read(tapefile, dir, sizeof dir);
39*219b2ee8SDavid du Colombier 	for (i=0, tpp=&dir[8]; i<496; i++, tpp++) {
40*219b2ee8SDavid du Colombier 		unsigned char *sp = (unsigned char *)tpp;
41*219b2ee8SDavid du Colombier 		int j, cksum = 0;
42*219b2ee8SDavid du Colombier 		for (j=0; j<32; j++, sp+=2)
43*219b2ee8SDavid du Colombier 			cksum += sp[0] + (sp[1]<<8);
44*219b2ee8SDavid du Colombier 		cksum &= 0xFFFF;
45*219b2ee8SDavid du Colombier 		if (cksum!=0)
46*219b2ee8SDavid du Colombier 			continue;
47bd389b36SDavid du Colombier 		if (tpp->name[0]=='\0')
48bd389b36SDavid du Colombier 			continue;
49bd389b36SDavid du Colombier 		f.addr = (void *)(tpp->taddress[0] + (tpp->taddress[1]<<8));
50*219b2ee8SDavid du Colombier 		if (f.addr==0)
51*219b2ee8SDavid du Colombier 			continue;
52bd389b36SDavid du Colombier 		f.size = (tpp->size[0]<<16) + (tpp->size[1]<<0) + (tpp->size[2]<<8);
53bd389b36SDavid du Colombier 		f.mdate = (tpp->tmod[2]<<0) + (tpp->tmod[3]<<8)
54bd389b36SDavid du Colombier 		     +(tpp->tmod[0]<<16) + (tpp->tmod[1]<<24);
55bd389b36SDavid du Colombier 		f.mode = tpp->mode[0]&0777;
56bd389b36SDavid du Colombier 		isabs = tpp->name[0]=='/';
57bd389b36SDavid du Colombier 		f.name = (char *)tpp->name+isabs;
58bd389b36SDavid du Colombier 		poppath(f, 1);
59bd389b36SDavid du Colombier 	}
60bd389b36SDavid du Colombier }
61bd389b36SDavid du Colombier 
62bd389b36SDavid du Colombier void
63bd389b36SDavid du Colombier popdir(Ram *r)
64bd389b36SDavid du Colombier {
65bd389b36SDavid du Colombier 	USED(r);
66bd389b36SDavid du Colombier }
67bd389b36SDavid du Colombier 
68bd389b36SDavid du Colombier void
69bd389b36SDavid du Colombier dotrunc(Ram *r)
70bd389b36SDavid du Colombier {
71bd389b36SDavid du Colombier 	USED(r);
72bd389b36SDavid du Colombier }
73bd389b36SDavid du Colombier 
74bd389b36SDavid du Colombier void
75bd389b36SDavid du Colombier docreate(Ram *r)
76bd389b36SDavid du Colombier {
77bd389b36SDavid du Colombier 	USED(r);
78bd389b36SDavid du Colombier }
79bd389b36SDavid du Colombier 
80bd389b36SDavid du Colombier char *
81bd389b36SDavid du Colombier doread(Ram *r, long off, long cnt)
82bd389b36SDavid du Colombier {
83*219b2ee8SDavid du Colombier 	if (cnt>sizeof(buffer))
84*219b2ee8SDavid du Colombier 		print("count too big\n");
85*219b2ee8SDavid du Colombier 	seek(tapefile, 512*(int)r->data+off, 0);
86*219b2ee8SDavid du Colombier 	read(tapefile, buffer, cnt);
87*219b2ee8SDavid du Colombier 	return buffer;
88bd389b36SDavid du Colombier }
89bd389b36SDavid du Colombier 
90bd389b36SDavid du Colombier void
91bd389b36SDavid du Colombier dowrite(Ram *r, char *buf, long off, long cnt)
92bd389b36SDavid du Colombier {
93bd389b36SDavid du Colombier 	USED(r); USED(buf); USED(off); USED(cnt);
94bd389b36SDavid du Colombier }
95bd389b36SDavid du Colombier 
96bd389b36SDavid du Colombier int
97bd389b36SDavid du Colombier dopermw(Ram *r)
98bd389b36SDavid du Colombier {
99bd389b36SDavid du Colombier 	USED(r);
100bd389b36SDavid du Colombier 	return 0;
101bd389b36SDavid du Colombier }
102