static fs_node_t* create(char* filename, unsigned int type) { fs_node_t* curdir = 0; if(filename[0] == '/') { curdir = fs_root; filename++; if(filename[0] == 0) return 0; } else curdir = current_task->cwd; char* s = str_dup(filename); int ret = 0; while(s) { if(chr(s, '/')) { char* p = chr(s, '/'); *p = 0; p++; if(strcmp(s, ".") == 0) curdir = curdir; else if(strcmp(s, "..") == 0) curdir = curdir->parent == 0 ? curdir : curdir->parent; else { fs_node_t* search = fs_finddir(curdir, s); if(!search) { ret = 0; break; } curdir = search; } s = p; }else { ret = fs_creat(curdir, s, type); break; } } kfree(s); return ret; }
int fs_open(byte *path, word mode, word rights) { int i,j,MySystemIndex; TaskUArea *Task = GetCurrentTaskUArea(); word CallResult, MyIndex; MNODE *MyNode; // word CacheFlag; SyscallActive = 1; if ((mode & IO_CREAT) || (mode & IO_TRUNC) ) return fs_creat(path, mode, rights); Task->ErrorLevel = ERR_FS_NO_ERROR; // CacheFlag = (mode & IO_CACHE_THROUGH) ? FPACK_NOTHING : FPACK_ADD; MyIndex = BitmapGetFirstHole(Task->Bmp,MaxOpenedFiles); if (MyIndex == 0xffff) { Task->ErrorLevel = ERR_TOO_MANY_OPENED_FILES; SyscallActive = 0; return -1; } CallResult = NAMEN(path, MyNode, FPACK_ADD); if ( CallResult != ERR_FS_NO_ERROR) { Task->ErrorLevel = CallResult; SyscallActive = 0; return -1; } MyNode->Locked.Release(); // MyNode je v tabulce aktivnich nodu odemceny // pristup k systemove tabulce, zjisti prvni volnou diru SystemTableSem->Down(); Task->OpenFiles[MyIndex].SystemTabIndex = BitmapGetFirstHole(SystemOpenFilesBmp, MaxOpenedFiles); if (Task->OpenFiles[MyIndex].SystemTabIndex == 0xffff) { SystemTableSem->Up(); MyNode->Locked.Release(); Task->ErrorLevel = ERR_TOO_MANY_OPENED_FILES; SyscallActive = 0; return -1; } BitmapSetBit(SystemOpenFilesBmp, Task->OpenFiles[MyIndex].SystemTabIndex); SystemTableSem->Up(); MySystemIndex = Task->OpenFiles[MyIndex].SystemTabIndex; OpenFiles[MySystemIndex].Used = 1; OpenFiles[MySystemIndex].Access = mode; if (mode & IO_APPEND) OpenFiles[MySystemIndex].Position = MyNode->Size; OpenFiles[MySystemIndex].Position = 0; OpenFiles[MySystemIndex].DirtyBuffer = 1; OpenFiles[MySystemIndex].BufferPos = 0; OpenFiles[MySystemIndex].Buffer = new byte[512]; OpenFiles[MySystemIndex].LastPreload = 0; OpenFiles[MySystemIndex].MemNODE = MyNode; Task->OpenFiles[MyIndex].Bitmap = new byte[(MaxOpenedFiles>>3)+1]; memset(Task->OpenFiles[MyIndex].Bitmap,0,(MaxOpenedFiles>>3)+1); // podiva se jestli uz proces neotevrel stejny soubor, // pokud ano do bitmapy si zanese jeho indexy a svuj index // zanese do jeho bitmapy (pokud nejakou ma) for (i=5,j=Task->NrOpenedFiles-5; i<MaxOpenedFiles; ++i) { if (!j) break; if ((i != MyIndex) && (Task->OpenFiles[i].Used)) { if (MyNode == OpenFiles[Task->OpenFiles[i].SystemTabIndex].MemNODE) { if (Task->OpenFiles[i].Bitmap) BitmapSetBit(Task->OpenFiles[i].Bitmap, MyIndex); BitmapSetBit(Task->OpenFiles[MyIndex].Bitmap, i); } j--; } } Task->OpenFiles[MyIndex].Used = 1; Task->NrOpenedFiles++; BitmapSetBit(Task->Bmp,MyIndex); SyscallActive = 0; return MyIndex; }