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