Blame


1 76193d7c 2003-09-30 devnull #include "sam.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull static Block *blist;
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull #if 0
6 76193d7c 2003-09-30 devnull static int
7 76193d7c 2003-09-30 devnull tempdisk(void)
8 76193d7c 2003-09-30 devnull {
9 76193d7c 2003-09-30 devnull char buf[128];
10 76193d7c 2003-09-30 devnull int i, fd;
11 76193d7c 2003-09-30 devnull
12 76193d7c 2003-09-30 devnull snprint(buf, sizeof buf, "/tmp/X%d.%.4ssam", getpid(), getuser());
13 76193d7c 2003-09-30 devnull for(i='A'; i<='Z'; i++){
14 76193d7c 2003-09-30 devnull buf[5] = i;
15 76193d7c 2003-09-30 devnull if(access(buf, AEXIST) == 0)
16 76193d7c 2003-09-30 devnull continue;
17 76193d7c 2003-09-30 devnull fd = create(buf, ORDWR|ORCLOSE|OCEXEC, 0600);
18 76193d7c 2003-09-30 devnull if(fd >= 0)
19 76193d7c 2003-09-30 devnull return fd;
20 76193d7c 2003-09-30 devnull }
21 76193d7c 2003-09-30 devnull return -1;
22 76193d7c 2003-09-30 devnull }
23 76193d7c 2003-09-30 devnull #else
24 76193d7c 2003-09-30 devnull extern int tempdisk(void);
25 76193d7c 2003-09-30 devnull #endif
26 76193d7c 2003-09-30 devnull
27 76193d7c 2003-09-30 devnull Disk*
28 2b604081 2005-05-07 devnull diskinit(void)
29 76193d7c 2003-09-30 devnull {
30 76193d7c 2003-09-30 devnull Disk *d;
31 76193d7c 2003-09-30 devnull
32 76193d7c 2003-09-30 devnull d = emalloc(sizeof(Disk));
33 76193d7c 2003-09-30 devnull d->fd = tempdisk();
34 76193d7c 2003-09-30 devnull if(d->fd < 0){
35 76193d7c 2003-09-30 devnull fprint(2, "sam: can't create temp file: %r\n");
36 76193d7c 2003-09-30 devnull exits("diskinit");
37 76193d7c 2003-09-30 devnull }
38 76193d7c 2003-09-30 devnull return d;
39 76193d7c 2003-09-30 devnull }
40 76193d7c 2003-09-30 devnull
41 76193d7c 2003-09-30 devnull static
42 76193d7c 2003-09-30 devnull uint
43 76193d7c 2003-09-30 devnull ntosize(uint n, uint *ip)
44 76193d7c 2003-09-30 devnull {
45 76193d7c 2003-09-30 devnull uint size;
46 76193d7c 2003-09-30 devnull
47 76193d7c 2003-09-30 devnull if(n > Maxblock)
48 76193d7c 2003-09-30 devnull panic("internal error: ntosize");
49 76193d7c 2003-09-30 devnull size = n;
50 76193d7c 2003-09-30 devnull if(size & (Blockincr-1))
51 76193d7c 2003-09-30 devnull size += Blockincr - (size & (Blockincr-1));
52 76193d7c 2003-09-30 devnull /* last bucket holds blocks of exactly Maxblock */
53 76193d7c 2003-09-30 devnull if(ip)
54 76193d7c 2003-09-30 devnull *ip = size/Blockincr;
55 76193d7c 2003-09-30 devnull return size * sizeof(Rune);
56 76193d7c 2003-09-30 devnull }
57 76193d7c 2003-09-30 devnull
58 76193d7c 2003-09-30 devnull Block*
59 76193d7c 2003-09-30 devnull disknewblock(Disk *d, uint n)
60 76193d7c 2003-09-30 devnull {
61 76193d7c 2003-09-30 devnull uint i, j, size;
62 76193d7c 2003-09-30 devnull Block *b;
63 76193d7c 2003-09-30 devnull
64 76193d7c 2003-09-30 devnull size = ntosize(n, &i);
65 76193d7c 2003-09-30 devnull b = d->free[i];
66 76193d7c 2003-09-30 devnull if(b)
67 522b0689 2003-09-30 devnull d->free[i] = b->u.next;
68 76193d7c 2003-09-30 devnull else{
69 76193d7c 2003-09-30 devnull /* allocate in chunks to reduce malloc overhead */
70 76193d7c 2003-09-30 devnull if(blist == nil){
71 76193d7c 2003-09-30 devnull blist = emalloc(100*sizeof(Block));
72 76193d7c 2003-09-30 devnull for(j=0; j<100-1; j++)
73 522b0689 2003-09-30 devnull blist[j].u.next = &blist[j+1];
74 76193d7c 2003-09-30 devnull }
75 76193d7c 2003-09-30 devnull b = blist;
76 522b0689 2003-09-30 devnull blist = b->u.next;
77 76193d7c 2003-09-30 devnull b->addr = d->addr;
78 219cf22d 2014-03-13 rsc if(d->addr+size < d->addr){
79 219cf22d 2014-03-13 rsc panic("temp file overflow");
80 219cf22d 2014-03-13 rsc }
81 76193d7c 2003-09-30 devnull d->addr += size;
82 76193d7c 2003-09-30 devnull }
83 522b0689 2003-09-30 devnull b->u.n = n;
84 76193d7c 2003-09-30 devnull return b;
85 76193d7c 2003-09-30 devnull }
86 76193d7c 2003-09-30 devnull
87 76193d7c 2003-09-30 devnull void
88 76193d7c 2003-09-30 devnull diskrelease(Disk *d, Block *b)
89 76193d7c 2003-09-30 devnull {
90 76193d7c 2003-09-30 devnull uint i;
91 76193d7c 2003-09-30 devnull
92 522b0689 2003-09-30 devnull ntosize(b->u.n, &i);
93 522b0689 2003-09-30 devnull b->u.next = d->free[i];
94 76193d7c 2003-09-30 devnull d->free[i] = b;
95 76193d7c 2003-09-30 devnull }
96 76193d7c 2003-09-30 devnull
97 76193d7c 2003-09-30 devnull void
98 76193d7c 2003-09-30 devnull diskwrite(Disk *d, Block **bp, Rune *r, uint n)
99 76193d7c 2003-09-30 devnull {
100 76193d7c 2003-09-30 devnull int size, nsize;
101 76193d7c 2003-09-30 devnull Block *b;
102 76193d7c 2003-09-30 devnull
103 76193d7c 2003-09-30 devnull b = *bp;
104 522b0689 2003-09-30 devnull size = ntosize(b->u.n, nil);
105 76193d7c 2003-09-30 devnull nsize = ntosize(n, nil);
106 76193d7c 2003-09-30 devnull if(size != nsize){
107 76193d7c 2003-09-30 devnull diskrelease(d, b);
108 76193d7c 2003-09-30 devnull b = disknewblock(d, n);
109 76193d7c 2003-09-30 devnull *bp = b;
110 76193d7c 2003-09-30 devnull }
111 76193d7c 2003-09-30 devnull if(pwrite(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
112 76193d7c 2003-09-30 devnull panic("write error to temp file");
113 522b0689 2003-09-30 devnull b->u.n = n;
114 76193d7c 2003-09-30 devnull }
115 76193d7c 2003-09-30 devnull
116 76193d7c 2003-09-30 devnull void
117 76193d7c 2003-09-30 devnull diskread(Disk *d, Block *b, Rune *r, uint n)
118 76193d7c 2003-09-30 devnull {
119 522b0689 2003-09-30 devnull if(n > b->u.n)
120 76193d7c 2003-09-30 devnull panic("internal error: diskread");
121 76193d7c 2003-09-30 devnull
122 522b0689 2003-09-30 devnull ntosize(b->u.n, nil); /* called only for sanity check on Maxblock */
123 76193d7c 2003-09-30 devnull if(pread(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
124 76193d7c 2003-09-30 devnull panic("read error from temp file");
125 76193d7c 2003-09-30 devnull }