xref: /plan9/sys/src/cmd/tapefs/tpfs.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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];
20bd389b36SDavid du Colombier 	unsigned char	unused[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
28bd389b36SDavid du Colombier populate(char *name)
29bd389b36SDavid du Colombier {
30*7dd7cddfSDavid 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);
39*7dd7cddfSDavid 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;
46*7dd7cddfSDavid du Colombier 		if (cksum!=0) {
47*7dd7cddfSDavid du Colombier 			badcksum++;
48219b2ee8SDavid du Colombier 			continue;
49*7dd7cddfSDavid du Colombier 		}
50*7dd7cddfSDavid du Colombier 		goodcksum++;
51bd389b36SDavid du Colombier 		if (tpp->name[0]=='\0')
52bd389b36SDavid du Colombier 			continue;
53bd389b36SDavid du Colombier 		f.addr = (void *)(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;
60bd389b36SDavid du Colombier 		isabs = tpp->name[0]=='/';
61bd389b36SDavid du Colombier 		f.name = (char *)tpp->name+isabs;
62bd389b36SDavid du Colombier 		poppath(f, 1);
63bd389b36SDavid du Colombier 	}
64*7dd7cddfSDavid du Colombier 	fprint(2, "%d bad checksums, %d good\n", badcksum, goodcksum);
65bd389b36SDavid du Colombier }
66bd389b36SDavid du Colombier 
67bd389b36SDavid du Colombier void
68bd389b36SDavid du Colombier popdir(Ram *r)
69bd389b36SDavid du Colombier {
70bd389b36SDavid du Colombier 	USED(r);
71bd389b36SDavid du Colombier }
72bd389b36SDavid du Colombier 
73bd389b36SDavid du Colombier void
74bd389b36SDavid du Colombier dotrunc(Ram *r)
75bd389b36SDavid du Colombier {
76bd389b36SDavid du Colombier 	USED(r);
77bd389b36SDavid du Colombier }
78bd389b36SDavid du Colombier 
79bd389b36SDavid du Colombier void
80bd389b36SDavid du Colombier docreate(Ram *r)
81bd389b36SDavid du Colombier {
82bd389b36SDavid du Colombier 	USED(r);
83bd389b36SDavid du Colombier }
84bd389b36SDavid du Colombier 
85bd389b36SDavid du Colombier char *
86bd389b36SDavid du Colombier doread(Ram *r, long off, long cnt)
87bd389b36SDavid du Colombier {
88219b2ee8SDavid du Colombier 	if (cnt>sizeof(buffer))
89219b2ee8SDavid du Colombier 		print("count too big\n");
90219b2ee8SDavid du Colombier 	seek(tapefile, 512*(int)r->data+off, 0);
91219b2ee8SDavid du Colombier 	read(tapefile, buffer, cnt);
92219b2ee8SDavid du Colombier 	return buffer;
93bd389b36SDavid du Colombier }
94bd389b36SDavid du Colombier 
95bd389b36SDavid du Colombier void
96bd389b36SDavid du Colombier dowrite(Ram *r, char *buf, long off, long cnt)
97bd389b36SDavid du Colombier {
98bd389b36SDavid du Colombier 	USED(r); USED(buf); USED(off); USED(cnt);
99bd389b36SDavid du Colombier }
100bd389b36SDavid du Colombier 
101bd389b36SDavid du Colombier int
102bd389b36SDavid du Colombier dopermw(Ram *r)
103bd389b36SDavid du Colombier {
104bd389b36SDavid du Colombier 	USED(r);
105bd389b36SDavid du Colombier 	return 0;
106bd389b36SDavid du Colombier }
107