示例#1
0
int sfs_open(char *name){
	int i;
	int blocksFree;
	int FATfree;
        int freeFdt;
	int DirFree;
        int DIRIndex;
	int exists = 0;

	for(i=0; i< MAX_myfileS;i++){
		if(strcmp(directory[i].name, name)==0){
			myfile = directory[i];
			DIRIndex = i;
			exists = 1;
		}
	}

	if(exists != 1){ //create and open new myfile

		blocksFree = searchBlockSpace();
		FATfree = searchFAT();
		DirFree = findDirectory();
		freeFdt = findFDT();
		strcpy(directory[DirFree].name, name);
		directory[DirFree].size = 0;
		directory[DirFree].date = time(NULL);
		directory[DirFree].indFAT = FATfree;
		FAT[FATfree][0] = blocksFree;
		FAT[FATfree][1] = EOF;
		FDT[freeFdt].read= 0;
		FDT[freeFdt].write= 0;
		FDT[freeFdt].dirIndex= DirFree;
		free_list[blocksFree] = '1';
		updateDisk();
		printf("%s <--Creation successfull\n", name);

	}

	else{ // open existing myfile
            freeFdt = findFDT();
            FDT[freeFdt].read= 0;
            FDT[freeFdt].write= myfile.size;
            FDT[freeFdt].dirIndex= DIRIndex;
            printf("%s <--Successfully Opened\n", name);

	}

	return freeFdt;
}
示例#2
0
文件: cfs.c 项目: aduraj/CFS
static int cfs_mknod(const char *path, mode_t mode, dev_t rdev)
{   
   if (checkPath(path))
      return -EACCES;
      
   struct fileInfo fi;
   
   int fd = open(cfsFile, O_RDWR);
   COLA = (struct fileInfo*)mmap(0, colaSize, PROT_READ, MAP_SHARED, fd, 0);
   
   if (find(path + 1,COLA) != EMPTY)
   {
      munmap(COLA,colaSize);
      close(fd);
      return -EEXIST;
   }
   
   munmap(COLA,colaSize);
   
   //
   strcpy((char*)&fi.name,path + 1);
   fi.size = 0;   
   FAT = (int*)mmap(0, FATSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, OFFC);
   fi.blockNum = searchFAT(FAT);
   
   if (fi.blockNum == EMPTY)
   {
      munmap(FAT,FATSize);
      close (fd);
      return -ENOMEM;
   }
   
   FAT[fi.blockNum] = END;
   munmap(FAT,FATSize);
   //
   
   COLA = (struct fileInfo*)mmap(0, colaSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
   if (insert(fi,COLA) == 0)
   {
      munmap(COLA,colaSize);
      close(fd);
      return -ENOSPC;
   }
   
   munmap(COLA,colaSize);
   close(fd);
   return 0;
}
示例#3
0
文件: cfs.c 项目: aduraj/CFS
static int cfs_write(const char *path, const char *buf, size_t size, off_t offset,
                      struct fuse_file_info *fi)
{
   if (checkPath(path))
      return -EACCES;
      
   int index = 0, blockNum = 0, tempOff = 0, left = 0, written = 0;
   
   int fd = open(cfsFile, O_RDWR);
   
   COLA = (struct fileInfo*)mmap(0, colaSize, PROT_READ, MAP_SHARED, fd, 0);
   index = find(path+1,COLA);
      
   if (index == EMPTY)
   {
      munmap(COLA,colaSize);
      close(fd);
      return -ENOENT;
   }
   
   blockNum = COLA[index].blockNum;
   munmap(COLA,colaSize);   
   
   tempOff = offset;
   
   if (tempOff > block)
   {
      FAT = (int*)mmap(0, FATSize, PROT_READ, MAP_SHARED, fd, OFFC);
      
      while (tempOff > block)
      {
         blockNum = FAT[blockNum];
         tempOff = tempOff - block;
      }      
      munmap(FAT,FATSize);
   }   
   
   if (tempOff + size > block)
   {
      data = (char*)mmap(0,block,PROT_READ | PROT_WRITE,MAP_SHARED,fd,OFFF + blockNum*block);      
      memcpy(data + tempOff, buf, block - tempOff);      
      munmap(data,block);
      
      written = block - tempOff;
      
      left = size - (block - tempOff);
      
      FAT = (int*)mmap(0, FATSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, OFFC);
      
      //if (FAT[blockNum] == EMPTY)
      FAT[blockNum] = searchFAT(FAT);
      
      if (FAT[blockNum] == EMPTY)
      {
         FAT[blockNum] = END;
         munmap(FAT,FATSize);
         return -ENOMEM;
      }
      
      blockNum = FAT[blockNum];
      munmap(FAT,FATSize);
      
      while (left > 0)
      {
         if (left > block)
         {
            data = (char*)mmap(0,block,PROT_READ | PROT_WRITE,MAP_SHARED,fd,OFFF + blockNum*block);      
            memcpy(data, buf + written, block);      
            munmap(data,block);
            
            FAT = (int*)mmap(0, FATSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, OFFC);
            
            //if (FAT[blockNum] == EMPTY)
            FAT[blockNum] = searchFAT(FAT);
            
            if (FAT[blockNum] == EMPTY)
            {
               FAT[blockNum] = END;
               munmap(FAT,FATSize);
               return -ENOMEM;
            }
            
            blockNum = FAT[blockNum];
            munmap(FAT,FATSize);
            
            left = left - block;
            written += block;
         }
         else
         {
            data = (char*)mmap(0,block,PROT_READ | PROT_WRITE,MAP_SHARED,fd,OFFF + blockNum*block);      
            memcpy(data, buf + written, left);      
            munmap(data,block);
            
            FAT = (int*)mmap(0, FATSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, OFFC);
            
            int cur = FAT[blockNum];
            int temp = 0;
            
            while (FAT[cur] != EMPTY && FAT[cur] != END)
            {
               temp = FAT[cur];
               FAT[cur] = EMPTY;
               cur = temp;
            }
            FAT[cur] = EMPTY;   
            
            FAT[blockNum] = END;
            munmap(FAT,FATSize);
            
            written += left;
            left = 0;
         }
      }
      
   }
   else
   {
      data = (char*)mmap(0,block,PROT_READ | PROT_WRITE,MAP_SHARED,fd,OFFF + blockNum*block);      
      memcpy(data + tempOff, buf, size);      
      munmap(data,block);
      
      written += size;
   }
   
   COLA = (struct fileInfo*)mmap(0, colaSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
   COLA[index].size = written + offset;
   munmap(COLA,colaSize);
   
   close(fd);
   return size;
}
示例#4
0
void sfs_write(int fd, char *buf, int length){
	int i;
        int position = 0;
        int maxLength;
	int apendLength;
        int FATi;
	int currFATi;
	int newBlock;

	writeLength = length;
	currmyfile = fd;
	writeBuff = (char *) malloc(length);
	appendBuff = (char *) malloc(1024 + length);
        for(i=0; i < writeLength; i++){
		writeBuff[i] = buf[i];
	}
	writeBuff[writeLength] = 0;
        myfile = directory[FDT[currmyfile].dirIndex];
	rootFAT = myfile.indFAT;
	currFATi = rootFAT;
        for(i=0; i < 1024; i++){//get last block in myfile
            if(FDT[currmyfile].write - position > 1024){
		position = position + 1024;
		currFATi = FAT[currFATi][1];
            }

	}
	read_blocks(FAT[currFATi][0], 1, appendBuff);
	appendBuff[FDT[currmyfile].write - position] = 0;
	maxLength = FDT[currmyfile].write + writeLength;
	strcat(appendBuff, writeBuff);
	apendLength = FDT[currmyfile].write - position + writeLength;
	appendBuff[apendLength] = 0; 

	for(i=0; i < apendLength;i++){
            if(apendLength - 1024 <= 0){
		write_blocks(FAT[currFATi][0],1,appendBuff);
		FAT[currFATi][1] = EOF; 
            }
            else{
                write_blocks(FAT[currFATi][0],1,appendBuff);
		appendBuff = appendBuff + 1024;
		apendLength = apendLength - 1024;
		newBlock = searchBlockSpace();
		FATi = searchFAT();
		if(newBlock > 0){
                    FAT[currFATi][1] = FATi;
                    FAT[FATi][0] = newBlock;
                    FAT[FATi][1] = EOF;
                    free_list[newBlock] = '1';
                    currFATi = FATi;
                }
		else{
                    error = 1;
		}
            }
	}
	if(error != 1){
            FDT[currmyfile].write = maxLength;
            directory[FDT[fd].dirIndex].date = time(NULL);
            directory[FDT[fd].dirIndex].size = directory[FDT[fd].dirIndex].size + length;
            updateDisk();
            free(writeBuff);
            free(appendBuff);
            printf("Data writing successfull\n");
	}
	else{
            printf("ERROR!!!--end of free blocks\n");
        }

}