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