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