Blame


1 b2cfc4e2 2003-09-30 devnull #include "lib9.h"
2 b2cfc4e2 2003-09-30 devnull #include <bio.h>
3 b2cfc4e2 2003-09-30 devnull
4 b2cfc4e2 2003-09-30 devnull enum
5 b2cfc4e2 2003-09-30 devnull {
6 b2cfc4e2 2003-09-30 devnull MAXBUFS = 20
7 b2cfc4e2 2003-09-30 devnull };
8 b2cfc4e2 2003-09-30 devnull
9 b2cfc4e2 2003-09-30 devnull static Biobuf* wbufs[MAXBUFS];
10 b2cfc4e2 2003-09-30 devnull static int atexitflag;
11 b2cfc4e2 2003-09-30 devnull
12 b2cfc4e2 2003-09-30 devnull static
13 b2cfc4e2 2003-09-30 devnull void
14 b2cfc4e2 2003-09-30 devnull batexit(void)
15 b2cfc4e2 2003-09-30 devnull {
16 b2cfc4e2 2003-09-30 devnull Biobuf *bp;
17 b2cfc4e2 2003-09-30 devnull int i;
18 b2cfc4e2 2003-09-30 devnull
19 b2cfc4e2 2003-09-30 devnull for(i=0; i<MAXBUFS; i++) {
20 b2cfc4e2 2003-09-30 devnull bp = wbufs[i];
21 b2cfc4e2 2003-09-30 devnull if(bp != 0) {
22 b2cfc4e2 2003-09-30 devnull wbufs[i] = 0;
23 b2cfc4e2 2003-09-30 devnull Bflush(bp);
24 b2cfc4e2 2003-09-30 devnull }
25 b2cfc4e2 2003-09-30 devnull }
26 b2cfc4e2 2003-09-30 devnull }
27 b2cfc4e2 2003-09-30 devnull
28 b2cfc4e2 2003-09-30 devnull static
29 b2cfc4e2 2003-09-30 devnull void
30 b2cfc4e2 2003-09-30 devnull deinstall(Biobuf *bp)
31 b2cfc4e2 2003-09-30 devnull {
32 b2cfc4e2 2003-09-30 devnull int i;
33 b2cfc4e2 2003-09-30 devnull
34 b2cfc4e2 2003-09-30 devnull for(i=0; i<MAXBUFS; i++)
35 b2cfc4e2 2003-09-30 devnull if(wbufs[i] == bp)
36 b2cfc4e2 2003-09-30 devnull wbufs[i] = 0;
37 b2cfc4e2 2003-09-30 devnull }
38 b2cfc4e2 2003-09-30 devnull
39 b2cfc4e2 2003-09-30 devnull static
40 b2cfc4e2 2003-09-30 devnull void
41 b2cfc4e2 2003-09-30 devnull install(Biobuf *bp)
42 b2cfc4e2 2003-09-30 devnull {
43 b2cfc4e2 2003-09-30 devnull int i;
44 b2cfc4e2 2003-09-30 devnull
45 b2cfc4e2 2003-09-30 devnull deinstall(bp);
46 b2cfc4e2 2003-09-30 devnull for(i=0; i<MAXBUFS; i++)
47 b2cfc4e2 2003-09-30 devnull if(wbufs[i] == 0) {
48 b2cfc4e2 2003-09-30 devnull wbufs[i] = bp;
49 b2cfc4e2 2003-09-30 devnull break;
50 b2cfc4e2 2003-09-30 devnull }
51 b2cfc4e2 2003-09-30 devnull if(atexitflag == 0) {
52 b2cfc4e2 2003-09-30 devnull atexitflag = 1;
53 b2cfc4e2 2003-09-30 devnull atexit(batexit);
54 b2cfc4e2 2003-09-30 devnull }
55 b2cfc4e2 2003-09-30 devnull }
56 b2cfc4e2 2003-09-30 devnull
57 b2cfc4e2 2003-09-30 devnull int
58 b2cfc4e2 2003-09-30 devnull Binits(Biobuf *bp, int f, int mode, unsigned char *p, int size)
59 b2cfc4e2 2003-09-30 devnull {
60 b2cfc4e2 2003-09-30 devnull
61 b2cfc4e2 2003-09-30 devnull p += Bungetsize; /* make room for Bungets */
62 b2cfc4e2 2003-09-30 devnull size -= Bungetsize;
63 b2cfc4e2 2003-09-30 devnull
64 4dd07e01 2004-12-28 devnull switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) {
65 b2cfc4e2 2003-09-30 devnull default:
66 b2cfc4e2 2003-09-30 devnull fprint(2, "Bopen: unknown mode %d\n", mode);
67 b2cfc4e2 2003-09-30 devnull return Beof;
68 b2cfc4e2 2003-09-30 devnull
69 b2cfc4e2 2003-09-30 devnull case OREAD:
70 b2cfc4e2 2003-09-30 devnull bp->state = Bractive;
71 b2cfc4e2 2003-09-30 devnull bp->ocount = 0;
72 b2cfc4e2 2003-09-30 devnull break;
73 b2cfc4e2 2003-09-30 devnull
74 b2cfc4e2 2003-09-30 devnull case OWRITE:
75 b2cfc4e2 2003-09-30 devnull install(bp);
76 b2cfc4e2 2003-09-30 devnull bp->state = Bwactive;
77 b2cfc4e2 2003-09-30 devnull bp->ocount = -size;
78 b2cfc4e2 2003-09-30 devnull break;
79 b2cfc4e2 2003-09-30 devnull }
80 b2cfc4e2 2003-09-30 devnull bp->bbuf = p;
81 b2cfc4e2 2003-09-30 devnull bp->ebuf = p+size;
82 b2cfc4e2 2003-09-30 devnull bp->bsize = size;
83 b2cfc4e2 2003-09-30 devnull bp->icount = 0;
84 b2cfc4e2 2003-09-30 devnull bp->gbuf = bp->ebuf;
85 b2cfc4e2 2003-09-30 devnull bp->fid = f;
86 b2cfc4e2 2003-09-30 devnull bp->flag = 0;
87 b2cfc4e2 2003-09-30 devnull bp->rdline = 0;
88 b2cfc4e2 2003-09-30 devnull bp->offset = 0;
89 4dd07e01 2004-12-28 devnull bp->runesize = 0;
90 b2cfc4e2 2003-09-30 devnull return 0;
91 b2cfc4e2 2003-09-30 devnull }
92 b2cfc4e2 2003-09-30 devnull
93 b2cfc4e2 2003-09-30 devnull
94 b2cfc4e2 2003-09-30 devnull int
95 b2cfc4e2 2003-09-30 devnull Binit(Biobuf *bp, int f, int mode)
96 b2cfc4e2 2003-09-30 devnull {
97 b2cfc4e2 2003-09-30 devnull return Binits(bp, f, mode, bp->b, sizeof(bp->b));
98 b2cfc4e2 2003-09-30 devnull }
99 b2cfc4e2 2003-09-30 devnull
100 b2cfc4e2 2003-09-30 devnull Biobuf*
101 986b36bc 2003-11-23 devnull Bfdopen(int f, int mode)
102 986b36bc 2003-11-23 devnull {
103 986b36bc 2003-11-23 devnull Biobuf *bp;
104 986b36bc 2003-11-23 devnull
105 986b36bc 2003-11-23 devnull bp = malloc(sizeof(Biobuf));
106 986b36bc 2003-11-23 devnull if(bp == 0)
107 986b36bc 2003-11-23 devnull return 0;
108 986b36bc 2003-11-23 devnull Binits(bp, f, mode, bp->b, sizeof(bp->b));
109 986b36bc 2003-11-23 devnull bp->flag = Bmagic;
110 986b36bc 2003-11-23 devnull return bp;
111 986b36bc 2003-11-23 devnull }
112 986b36bc 2003-11-23 devnull
113 986b36bc 2003-11-23 devnull Biobuf*
114 b2cfc4e2 2003-09-30 devnull Bopen(char *name, int mode)
115 b2cfc4e2 2003-09-30 devnull {
116 b2cfc4e2 2003-09-30 devnull Biobuf *bp;
117 b2cfc4e2 2003-09-30 devnull int f;
118 b2cfc4e2 2003-09-30 devnull
119 4dd07e01 2004-12-28 devnull switch(mode&~(OCEXEC|ORCLOSE|OTRUNC)) {
120 b2cfc4e2 2003-09-30 devnull default:
121 b2cfc4e2 2003-09-30 devnull fprint(2, "Bopen: unknown mode %d\n", mode);
122 b2cfc4e2 2003-09-30 devnull return 0;
123 b2cfc4e2 2003-09-30 devnull
124 b2cfc4e2 2003-09-30 devnull case OREAD:
125 5f6612ba 2008-05-31 rsc f = open(name, mode);
126 b2cfc4e2 2003-09-30 devnull if(f < 0)
127 b2cfc4e2 2003-09-30 devnull return 0;
128 b2cfc4e2 2003-09-30 devnull break;
129 b2cfc4e2 2003-09-30 devnull
130 b2cfc4e2 2003-09-30 devnull case OWRITE:
131 5f6612ba 2008-05-31 rsc f = create(name, mode, 0666);
132 b2cfc4e2 2003-09-30 devnull if(f < 0)
133 b2cfc4e2 2003-09-30 devnull return 0;
134 b2cfc4e2 2003-09-30 devnull }
135 986b36bc 2003-11-23 devnull bp = Bfdopen(f, mode);
136 b2cfc4e2 2003-09-30 devnull if(bp == 0)
137 986b36bc 2003-11-23 devnull close(f);
138 b2cfc4e2 2003-09-30 devnull return bp;
139 b2cfc4e2 2003-09-30 devnull }
140 b2cfc4e2 2003-09-30 devnull
141 b2cfc4e2 2003-09-30 devnull int
142 b2cfc4e2 2003-09-30 devnull Bterm(Biobuf *bp)
143 b2cfc4e2 2003-09-30 devnull {
144 4af8158b 2019-12-19 rsc int ret;
145 b2cfc4e2 2003-09-30 devnull
146 b2cfc4e2 2003-09-30 devnull deinstall(bp);
147 4af8158b 2019-12-19 rsc ret = Bflush(bp);
148 b2cfc4e2 2003-09-30 devnull if(bp->flag == Bmagic) {
149 b2cfc4e2 2003-09-30 devnull bp->flag = 0;
150 4af8158b 2019-12-19 rsc if(close(bp->fid) < 0)
151 4af8158b 2019-12-19 rsc ret = -1;
152 b2cfc4e2 2003-09-30 devnull free(bp);
153 b2cfc4e2 2003-09-30 devnull }
154 4af8158b 2019-12-19 rsc return ret;
155 b2cfc4e2 2003-09-30 devnull }