]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/cwfs/fworm.c
webfs(4): document -d and -D flags
[plan9front.git] / sys / src / cmd / cwfs / fworm.c
1 #include "all.h"
2
3 #define FDEV(d)         ((d)->fw.fw)
4
5 Devsize
6 fwormsize(Device *d)
7 {
8         Devsize l;
9
10         l = devsize(FDEV(d));
11         l -= l/(BUFSIZE*8) + 1;
12         return l;
13 }
14
15 void
16 fwormream(Device *d)
17 {
18         Iobuf *p;
19         Device *fdev;
20         Off a, b;
21
22         if(chatty)
23                 print("fworm ream\n");
24         devinit(d);
25         fdev = FDEV(d);
26         a = fwormsize(d);
27         b = devsize(fdev);
28         if(chatty){
29                 print("\tfwsize = %lld\n", (Wideoff)a);
30                 print("\tbwsize = %lld\n", (Wideoff)b-a);
31         }
32         for(; a < b; a++) {
33                 p = getbuf(fdev, a, Bmod|Bres);
34                 if(!p)
35                         panic("fworm: init");
36                 memset(p->iobuf, 0, RBUFSIZE);
37                 settag(p, Tvirgo, a);
38                 putbuf(p);
39         }
40 }
41
42 void
43 fworminit(Device *d)
44 {
45         print("fworm init\n");
46         devinit(FDEV(d));
47 }
48
49 int
50 fwormread(Device *d, Off b, void *c)
51 {
52         Iobuf *p;
53         Device *fdev;
54         Devsize l;
55
56         if(chatty > 1)
57                 fprint(2, "fworm read  %lld\n", (Wideoff)b);
58         fdev = FDEV(d);
59         l = devsize(fdev);
60         l -= l/(BUFSIZE*8) + 1;
61         if(b >= l)
62                 panic("fworm: rbounds %lld", (Wideoff)b);
63         l += b/(BUFSIZE*8);
64
65         p = getbuf(fdev, l, Brd|Bres);
66         if(!p || checktag(p, Tvirgo, l))
67                 panic("fworm: checktag %lld", (Wideoff)l);
68         l = b % (BUFSIZE*8);
69         if(!(p->iobuf[l/8] & (1<<(l%8)))) {
70                 putbuf(p);
71                 fprint(2, "fworm: read %lld\n", (Wideoff)b);
72                 return 1;
73         }
74         putbuf(p);
75         return devread(fdev, b, c);
76 }
77
78 int
79 fwormwrite(Device *d, Off b, void *c)
80 {
81         Iobuf *p;
82         Device *fdev;
83         Devsize l;
84
85         if(chatty > 1)
86                 fprint(2, "fworm write %lld\n", (Wideoff)b);
87         fdev = FDEV(d);
88         l = devsize(fdev);
89         l -= l/(BUFSIZE*8) + 1;
90         if(b >= l)
91                 panic("fworm: wbounds %lld", (Wideoff)b);
92         l += b/(BUFSIZE*8);
93
94         p = getbuf(fdev, l, Brd|Bmod|Bres);
95         if(!p || checktag(p, Tvirgo, l))
96                 panic("fworm: checktag %lld", (Wideoff)l);
97         l = b % (BUFSIZE*8);
98         if((p->iobuf[l/8] & (1<<(l%8)))) {
99                 putbuf(p);
100                 fprint(2, "fworm: write %lld\n", (Wideoff)b);
101                 return 1;
102         }
103         p->iobuf[l/8] |= 1<<(l%8);
104         putbuf(p);
105         return devwrite(fdev, b, c);
106 }