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