# HG changeset patch # User Shinji KONO # Date 1531814889 -32400 # Node ID 7a83a6a1685acc14a2f268af39a8bedc23ec4d57 # Parent 5978348b68f908e18cc1fe3b20153bf4764099fc vdisk start diff -r 5978348b68f9 -r 7a83a6a1685a vdisk.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vdisk.c Tue Jul 17 17:08:09 2018 +0900 @@ -0,0 +1,346 @@ +/******************************************************************** +* Virtual RBF - Random Block File Manager +* +* Shinji KONO (kono@ie.u-ryukyu.ac.jp) 2018/7/17 +* GPL v1 license +*/ + +#include +#include +#include +#include +#include + + +/**************************** +* +* Main entry point for RBF +* + lbra Open + lbra MakDir + lbra ChgDir + lbra Delete + lbra Seek + lbra Read + lbra Write + lbra ReadLn + lbra WriteLn + lbra GetStat + lbra SetStat + lbra Close + */ + + +/* +* I$Create Entry Point +* +* Entry: A = access mode desired +* B = file attributes +* X = address of the pathlist +* +* Exit: A = pathnum +* X = last byte of pathlist address +* +* Error: CC Carry set +* B = errcode +*/ + +#define MAXPAHTLEN 256 + +char * checkFileName(char *path, PathDesc *pd) { + char *p = path; + int maxlen = MAXPAHTLEN; + pd->lastChar = p; + while(*p!=0 && (*p&80)==0 && maxlen-->0) p++; + if (maxlen==MAXPAHTLEN) return 0; + pd->lastChar = p; + if (*p!=0) { + p = (char *)malloc(len+1); + strncpy(path,p, MAXPAHTLEN-maxlen); + } + return p; +} + +int os9toUnixAttr(Byte attr) { + return "r+"; +} + +int vrbf_create(byte mode,Byte attr,char *path,PathDesc *pd) { + char *p = pd->unixName = checkFileName(path,pd); + if (p==0) return -1; + p->dir = 0; + p->fp = fopen(p->unixName,"w+"); // os9toUnixAttr(attr)); + if (fd) return 0; + return -1; +} + + +/* +* I$Open Entry Point +* +* Entry: A = access mode desired +* X = address of the pathlist +* +* Exit: A = pathnum +* X = last byte of pathlist address +* +* Error: CC Carry set +* B = errcode +*/ + +int vrbf_open(byte mode,char *path, PathDesc *pd) { + char *p = pd->unixName = checkFileName(path,pd); + if (p==0) return -1; + struct stat buf; + if (stat(p,&buf)!=0) return -1; + if ((buf.st_mode & S_IFMT) == S_IFDIR) { + pd->dir = 1; + return 0; + } + pd->dir = 0; + pd->fp = fopen(p->unixName,"r"); // os9toUnixAttr(attr)); + if (fp) return 0; + return -1; +} + + +/* +* I$MakDir Entry Point +* +* Entry: X = address of the pathlist +* +* Exit: X = last byte of pathlist address +* +* Error: CC Carry set +* B = errcode +*/ + +int vrbf_mkdir(char **path,PathDesc *pd) { + char *p = checkFileName(path,pd); + if (p==0) return -1; + return mkdir(p,0); +} + +/* +* I$ChgDir Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +*/ + +char * vrbf_chdir(char *path) { + cahr *p = checkFileName(path); + if (p==0) return -1; + struct stat buf; + if (stat(p,&buf)!=0) return -1; + if ((buf.st_mode & S_IFMT) == S_IFDIR) { + chdir(p); + return p; + } + return -1; +} + + +/* +* I$Delete Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +*/ + +int vrbf_delete(char *path) { + cahr *p = checkFileName(path); + if (p==0) return -1; + return rmdir(p); +} + + +/* +* I$Seek Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +*/ + +int vrbf_seek(PathDesc *p, int seek) { + return fseek(p->fp,(off_t)seek,SEEK_SET); +} + + +* +* I$ReadLn Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +* +* +int vrbf_readln(PathDesc *p, byte *buf, int len) { + if (p->dir) return -1; + if (fgets(buf,len,p->fp)) { + int i; + for(i=0;i0 && buf[i-1]=='\n') { + buf[i-1] = '\r'; + return i; + } + } + return -1; +} + +/* +* I$Read Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +*/ + +int vrbf_read(PathDesc *p, byte *buf, int len) { + if (p->dir) return dirread(p,buf,len); + return fread(buf,len,1,p->fp); +} + +/* +* I$WritLn Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +*/ + +int vrbf_writeln(PathDesc *p, byte *buf, int len) { + if (p->dir) return -1; + int = 0; + while(len>0 && *buf !='\r) { + fputc(buf[i++],p->fp); + len--; + } + if (buf[i]=='\r') { + fputc('\n',p->fp); + i++; + } + return i; +} + +/* +* I$Write Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +*/ + +int vrbf_write(PathDesc *p, byte *buf, int len) { + if (p->dir) return -1; + return fwrite(buf,len,1,p->fp); +} + +/* I$Close Entry Point +* +* Entry: A = path number +* +* Exit: +* +* Error: CC Carry set +* B = errcode +* +*/ + +int vrbf_close(PathDesc *p, byte *buf) { + return fclose(p->fp); +} + +/* +* I$GetStat Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +*/ + +int vrbf_getstat(int code,OPathDesc *p, O9Stat *s) { + struct stat st; + + switch (code) { + case 01: // SS.Ready + fstat(fileno(p->fp),&st); + if (pos = ftell(fp)) { + return st.size - pos; + } + break; + case 02: // SS.SIZ + fstat(fileno(p->fp),&st); + return st.size ; + break; + case 05: // SS.Pos + return ftell(s->fp); + break; + case 15: // SS.FD + break; + case 0x20: // Pos.FDInf + break; + default: return -1; + } + return -1; +} + +/* +* I$SetStat Entry Point +* +* Entry: +* +* Exit: +* +* Error: CC Carry set +* B = errcode +*/ + +int vrbf_getstat(int code,OPathDesc *p, O9Stat *s) { + switch (code) { + case 0: // SS.Opt + break; + case 02: // SS.SIZ + break; + case 15: // SS.FD + break; + case 0x11: // SS.Lock + break; + case 0x10: // SS.Ticks + break; + case 0x20: // SS.RsBit + break; + case 0x1c: // SS.Attr + break; + default: return -1; + } +} + +