xref: /plan9/sys/src/cmd/tapefs/tpfs.c (revision 41fe996ad1ef7168ab61531223f4e75c6cf225c2)
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	unused2[16];
21 	unsigned char	checksum[2];
22 } dir[496+8];
23 
24 char	buffer[8192];
25 int	tapefile;
26 
27 void
populate(char * name)28 populate(char *name)
29 {
30 	int i, isabs, badcksum, goodcksum;
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 	badcksum = goodcksum = 0;
40 	for (i=0, tpp=&dir[8]; i<496; i++, tpp++) {
41 		unsigned char *sp = (unsigned char *)tpp;
42 		int j, cksum = 0;
43 		for (j=0; j<32; j++, sp+=2)
44 			cksum += sp[0] + (sp[1]<<8);
45 		cksum &= 0xFFFF;
46 		if (cksum!=0) {
47 			badcksum++;
48 			continue;
49 		}
50 		goodcksum++;
51 		if (tpp->name[0]=='\0')
52 			continue;
53 		f.addr = tpp->taddress[0] + (tpp->taddress[1]<<8);
54 		if (f.addr==0)
55 			continue;
56 		f.size = (tpp->size[0]<<16) + (tpp->size[1]<<0) + (tpp->size[2]<<8);
57 		f.mdate = (tpp->tmod[2]<<0) + (tpp->tmod[3]<<8)
58 		     +(tpp->tmod[0]<<16) + (tpp->tmod[1]<<24);
59 		f.mode = tpp->mode[0]&0777;
60 		f.uid = tpp->uid[0];
61 		f.gid = tpp->gid[0];
62 		isabs = tpp->name[0]=='/';
63 		f.name = (char *)tpp->name+isabs;
64 		poppath(f, 1);
65 	}
66 	fprint(2, "%d bad checksums, %d good\n", badcksum, goodcksum);
67 }
68 
69 void
popdir(Ram * r)70 popdir(Ram *r)
71 {
72 	USED(r);
73 }
74 
75 void
dotrunc(Ram * r)76 dotrunc(Ram *r)
77 {
78 	USED(r);
79 }
80 
81 void
docreate(Ram * r)82 docreate(Ram *r)
83 {
84 	USED(r);
85 }
86 
87 char *
doread(Ram * r,vlong off,long cnt)88 doread(Ram *r, vlong off, long cnt)
89 {
90 	if (cnt>sizeof(buffer))
91 		print("count too big\n");
92 	seek(tapefile, 512*r->addr+off, 0);
93 	read(tapefile, buffer, cnt);
94 	return buffer;
95 }
96 
97 void
dowrite(Ram * r,char * buf,long off,long cnt)98 dowrite(Ram *r, char *buf, long off, long cnt)
99 {
100 	USED(r); USED(buf); USED(off); USED(cnt);
101 }
102 
103 int
dopermw(Ram * r)104 dopermw(Ram *r)
105 {
106 	USED(r);
107 	return 0;
108 }
109