예제 #1
0
파일: open_close.c 프로젝트: WareX97/K2
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;
}
예제 #2
0
파일: syscalls.cpp 프로젝트: dvorka/rfs
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;
}