Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
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
70
popdir(Ram *r)
71
{
72
	USED(r);
73
}
74
 
75
void
76
dotrunc(Ram *r)
77
{
78
	USED(r);
79
}
80
 
81
void
82
docreate(Ram *r)
83
{
84
	USED(r);
85
}
86
 
87
char *
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
98
dowrite(Ram *r, char *buf, long off, long cnt)
99
{
100
	USED(r); USED(buf); USED(off); USED(cnt);
101
}
102
 
103
int
104
dopermw(Ram *r)
105
{
106
	USED(r);
107
	return 0;
108
}