Mercurial > hg > Members > kono > os9 > sbc09
comparison vdisk.c @ 43:7a83a6a1685a
vdisk start
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 17 Jul 2018 17:08:09 +0900 |
parents | |
children | b26c23331d02 |
comparison
equal
deleted
inserted
replaced
42:5978348b68f9 | 43:7a83a6a1685a |
---|---|
1 /******************************************************************** | |
2 * Virtual RBF - Random Block File Manager | |
3 * | |
4 * Shinji KONO (kono@ie.u-ryukyu.ac.jp) 2018/7/17 | |
5 * GPL v1 license | |
6 */ | |
7 | |
8 #include <stdio.h> | |
9 #include <stdlib.h> | |
10 #include <unistd.h> | |
11 #include <sys/stat.h> | |
12 #include <sys/select.h> | |
13 | |
14 | |
15 /**************************** | |
16 * | |
17 * Main entry point for RBF | |
18 * | |
19 lbra Open | |
20 lbra MakDir | |
21 lbra ChgDir | |
22 lbra Delete | |
23 lbra Seek | |
24 lbra Read | |
25 lbra Write | |
26 lbra ReadLn | |
27 lbra WriteLn | |
28 lbra GetStat | |
29 lbra SetStat | |
30 lbra Close | |
31 */ | |
32 | |
33 | |
34 /* | |
35 * I$Create Entry Point | |
36 * | |
37 * Entry: A = access mode desired | |
38 * B = file attributes | |
39 * X = address of the pathlist | |
40 * | |
41 * Exit: A = pathnum | |
42 * X = last byte of pathlist address | |
43 * | |
44 * Error: CC Carry set | |
45 * B = errcode | |
46 */ | |
47 | |
48 #define MAXPAHTLEN 256 | |
49 | |
50 char * checkFileName(char *path, PathDesc *pd) { | |
51 char *p = path; | |
52 int maxlen = MAXPAHTLEN; | |
53 pd->lastChar = p; | |
54 while(*p!=0 && (*p&80)==0 && maxlen-->0) p++; | |
55 if (maxlen==MAXPAHTLEN) return 0; | |
56 pd->lastChar = p; | |
57 if (*p!=0) { | |
58 p = (char *)malloc(len+1); | |
59 strncpy(path,p, MAXPAHTLEN-maxlen); | |
60 } | |
61 return p; | |
62 } | |
63 | |
64 int os9toUnixAttr(Byte attr) { | |
65 return "r+"; | |
66 } | |
67 | |
68 int vrbf_create(byte mode,Byte attr,char *path,PathDesc *pd) { | |
69 char *p = pd->unixName = checkFileName(path,pd); | |
70 if (p==0) return -1; | |
71 p->dir = 0; | |
72 p->fp = fopen(p->unixName,"w+"); // os9toUnixAttr(attr)); | |
73 if (fd) return 0; | |
74 return -1; | |
75 } | |
76 | |
77 | |
78 /* | |
79 * I$Open Entry Point | |
80 * | |
81 * Entry: A = access mode desired | |
82 * X = address of the pathlist | |
83 * | |
84 * Exit: A = pathnum | |
85 * X = last byte of pathlist address | |
86 * | |
87 * Error: CC Carry set | |
88 * B = errcode | |
89 */ | |
90 | |
91 int vrbf_open(byte mode,char *path, PathDesc *pd) { | |
92 char *p = pd->unixName = checkFileName(path,pd); | |
93 if (p==0) return -1; | |
94 struct stat buf; | |
95 if (stat(p,&buf)!=0) return -1; | |
96 if ((buf.st_mode & S_IFMT) == S_IFDIR) { | |
97 pd->dir = 1; | |
98 return 0; | |
99 } | |
100 pd->dir = 0; | |
101 pd->fp = fopen(p->unixName,"r"); // os9toUnixAttr(attr)); | |
102 if (fp) return 0; | |
103 return -1; | |
104 } | |
105 | |
106 | |
107 /* | |
108 * I$MakDir Entry Point | |
109 * | |
110 * Entry: X = address of the pathlist | |
111 * | |
112 * Exit: X = last byte of pathlist address | |
113 * | |
114 * Error: CC Carry set | |
115 * B = errcode | |
116 */ | |
117 | |
118 int vrbf_mkdir(char **path,PathDesc *pd) { | |
119 char *p = checkFileName(path,pd); | |
120 if (p==0) return -1; | |
121 return mkdir(p,0); | |
122 } | |
123 | |
124 /* | |
125 * I$ChgDir Entry Point | |
126 * | |
127 * Entry: | |
128 * | |
129 * Exit: | |
130 * | |
131 * Error: CC Carry set | |
132 * B = errcode | |
133 */ | |
134 | |
135 char * vrbf_chdir(char *path) { | |
136 cahr *p = checkFileName(path); | |
137 if (p==0) return -1; | |
138 struct stat buf; | |
139 if (stat(p,&buf)!=0) return -1; | |
140 if ((buf.st_mode & S_IFMT) == S_IFDIR) { | |
141 chdir(p); | |
142 return p; | |
143 } | |
144 return -1; | |
145 } | |
146 | |
147 | |
148 /* | |
149 * I$Delete Entry Point | |
150 * | |
151 * Entry: | |
152 * | |
153 * Exit: | |
154 * | |
155 * Error: CC Carry set | |
156 * B = errcode | |
157 */ | |
158 | |
159 int vrbf_delete(char *path) { | |
160 cahr *p = checkFileName(path); | |
161 if (p==0) return -1; | |
162 return rmdir(p); | |
163 } | |
164 | |
165 | |
166 /* | |
167 * I$Seek Entry Point | |
168 * | |
169 * Entry: | |
170 * | |
171 * Exit: | |
172 * | |
173 * Error: CC Carry set | |
174 * B = errcode | |
175 */ | |
176 | |
177 int vrbf_seek(PathDesc *p, int seek) { | |
178 return fseek(p->fp,(off_t)seek,SEEK_SET); | |
179 } | |
180 | |
181 | |
182 * | |
183 * I$ReadLn Entry Point | |
184 * | |
185 * Entry: | |
186 * | |
187 * Exit: | |
188 * | |
189 * Error: CC Carry set | |
190 * B = errcode | |
191 * | |
192 * | |
193 int vrbf_readln(PathDesc *p, byte *buf, int len) { | |
194 if (p->dir) return -1; | |
195 if (fgets(buf,len,p->fp)) { | |
196 int i; | |
197 for(i=0;i<len && buf[i];i++); | |
198 if (i>0 && buf[i-1]=='\n') { | |
199 buf[i-1] = '\r'; | |
200 return i; | |
201 } | |
202 } | |
203 return -1; | |
204 } | |
205 | |
206 /* | |
207 * I$Read Entry Point | |
208 * | |
209 * Entry: | |
210 * | |
211 * Exit: | |
212 * | |
213 * Error: CC Carry set | |
214 * B = errcode | |
215 */ | |
216 | |
217 int vrbf_read(PathDesc *p, byte *buf, int len) { | |
218 if (p->dir) return dirread(p,buf,len); | |
219 return fread(buf,len,1,p->fp); | |
220 } | |
221 | |
222 /* | |
223 * I$WritLn Entry Point | |
224 * | |
225 * Entry: | |
226 * | |
227 * Exit: | |
228 * | |
229 * Error: CC Carry set | |
230 * B = errcode | |
231 */ | |
232 | |
233 int vrbf_writeln(PathDesc *p, byte *buf, int len) { | |
234 if (p->dir) return -1; | |
235 int = 0; | |
236 while(len>0 && *buf !='\r) { | |
237 fputc(buf[i++],p->fp); | |
238 len--; | |
239 } | |
240 if (buf[i]=='\r') { | |
241 fputc('\n',p->fp); | |
242 i++; | |
243 } | |
244 return i; | |
245 } | |
246 | |
247 /* | |
248 * I$Write Entry Point | |
249 * | |
250 * Entry: | |
251 * | |
252 * Exit: | |
253 * | |
254 * Error: CC Carry set | |
255 * B = errcode | |
256 */ | |
257 | |
258 int vrbf_write(PathDesc *p, byte *buf, int len) { | |
259 if (p->dir) return -1; | |
260 return fwrite(buf,len,1,p->fp); | |
261 } | |
262 | |
263 /* I$Close Entry Point | |
264 * | |
265 * Entry: A = path number | |
266 * | |
267 * Exit: | |
268 * | |
269 * Error: CC Carry set | |
270 * B = errcode | |
271 * | |
272 */ | |
273 | |
274 int vrbf_close(PathDesc *p, byte *buf) { | |
275 return fclose(p->fp); | |
276 } | |
277 | |
278 /* | |
279 * I$GetStat Entry Point | |
280 * | |
281 * Entry: | |
282 * | |
283 * Exit: | |
284 * | |
285 * Error: CC Carry set | |
286 * B = errcode | |
287 */ | |
288 | |
289 int vrbf_getstat(int code,OPathDesc *p, O9Stat *s) { | |
290 struct stat st; | |
291 | |
292 switch (code) { | |
293 case 01: // SS.Ready | |
294 fstat(fileno(p->fp),&st); | |
295 if (pos = ftell(fp)) { | |
296 return st.size - pos; | |
297 } | |
298 break; | |
299 case 02: // SS.SIZ | |
300 fstat(fileno(p->fp),&st); | |
301 return st.size ; | |
302 break; | |
303 case 05: // SS.Pos | |
304 return ftell(s->fp); | |
305 break; | |
306 case 15: // SS.FD | |
307 break; | |
308 case 0x20: // Pos.FDInf | |
309 break; | |
310 default: return -1; | |
311 } | |
312 return -1; | |
313 } | |
314 | |
315 /* | |
316 * I$SetStat Entry Point | |
317 * | |
318 * Entry: | |
319 * | |
320 * Exit: | |
321 * | |
322 * Error: CC Carry set | |
323 * B = errcode | |
324 */ | |
325 | |
326 int vrbf_getstat(int code,OPathDesc *p, O9Stat *s) { | |
327 switch (code) { | |
328 case 0: // SS.Opt | |
329 break; | |
330 case 02: // SS.SIZ | |
331 break; | |
332 case 15: // SS.FD | |
333 break; | |
334 case 0x11: // SS.Lock | |
335 break; | |
336 case 0x10: // SS.Ticks | |
337 break; | |
338 case 0x20: // SS.RsBit | |
339 break; | |
340 case 0x1c: // SS.Attr | |
341 break; | |
342 default: return -1; | |
343 } | |
344 } | |
345 | |
346 |