12
snprint(buf, sizeof buf, "/tmp/X%d.%.4ssam", getpid(), getuser());
13
for(i='A'; i<='Z'; i++){
15
if(access(buf, AEXIST) == 0)
17
fd = create(buf, ORDWR|ORCLOSE|OCEXEC, 0600);
24
extern int tempdisk(void);
32
d = emalloc(sizeof(Disk));
35
fprint(2, "sam: can't create temp file: %r\n");
43
ntosize(uint n, uint *ip)
48
panic("internal error: ntosize");
50
if(size & (Blockincr-1))
51
size += Blockincr - (size & (Blockincr-1));
52
/* last bucket holds blocks of exactly Maxblock */
55
return size * sizeof(Rune);
59
disknewblock(Disk *d, uint n)
64
size = ntosize(n, &i);
67
d->free[i] = b->u.next;
69
/* allocate in chunks to reduce malloc overhead */
71
blist = emalloc(100*sizeof(Block));
72
for(j=0; j<100-1; j++)
73
blist[j].u.next = &blist[j+1];
85
diskrelease(Disk *d, Block *b)
90
b->u.next = d->free[i];
95
diskwrite(Disk *d, Block **bp, Rune *r, uint n)
101
size = ntosize(b->u.n, nil);
102
nsize = ntosize(n, nil);
105
b = disknewblock(d, n);
108
if(pwrite(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
109
panic("write error to temp file");
114
diskread(Disk *d, Block *b, Rune *r, uint n)
117
panic("internal error: diskread");
119
ntosize(b->u.n, nil); /* called only for sanity check on Maxblock */
120
if(pread(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
121
panic("read error from temp file");