Blame


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