]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/tapefs/tpfs.c
stats: show amount of reclaimable pages (add -r flag)
[plan9front.git] / sys / src / cmd / tapefs / tpfs.c
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 }