11 snprint(buf, sizeof buf, "/tmp/X%d.%.4ssam", getpid(), getuser());
12 for(i='A'; i<='Z'; i++){
14 if(access(buf, AEXIST) == 0)
16 fd = create(buf, ORDWR|ORCLOSE|OCEXEC, 0600);
28 d = emalloc(sizeof(Disk));
31 fprint(2, "sam: can't create temp file: %r\n");
39 ntosize(uint n, uint *ip)
44 panic("internal error: ntosize");
46 if(size & (Blockincr-1))
47 size += Blockincr - (size & (Blockincr-1));
48 /* last bucket holds blocks of exactly Maxblock */
51 return size * sizeof(Rune);
55 disknewblock(Disk *d, uint n)
60 size = ntosize(n, &i);
65 /* allocate in chunks to reduce malloc overhead */
67 blist = emalloc(100*sizeof(Block));
68 for(j=0; j<100-1; j++)
69 blist[j].next = &blist[j+1];
74 if(d->addr+size < d->addr){
75 panic("temp file overflow");
84 diskrelease(Disk *d, Block *b)
94 diskwrite(Disk *d, Block **bp, Rune *r, uint n)
100 size = ntosize(b->n, nil);
101 nsize = ntosize(n, nil);
104 b = disknewblock(d, n);
107 if(pwrite(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
108 panic("write error to temp file");
113 diskread(Disk *d, Block *b, Rune *r, uint n)
116 panic("internal error: diskread");
118 ntosize(b->n, nil); /* called only for sanity check on Maxblock */
119 if(pread(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
120 panic("read error from temp file");