Example #1
0
void ram(void){
	int menu = 0;

	while(true) {
		lcdClear();
		printHeader();

		switch(menu)
		{
			case MENU_DISK:
				printDisk();
				break;

			default:
				break;
		}

		lcdDisplay();

		getInputWait();
		return;
		/*
		switch(getInputWaitRelease()){
			case BTN_UP:
			case BTN_DOWN:
				return;

			case BTN_LEFT:
				menu = --menu < 0 ? MENU_MAX : menu;
				break;
			case BTN_RIGHT:
				menu = ++menu > MENU_MAX ? 0 : menu;
				break;

			case BTN_ENTER:
				return;
		}
		*/
	}
}
Example #2
0
int main(){
    FileSystem fs;
    size_type size = 0x7FFFFFF;
    printf("system size set to: %ld\n", size);
    initFS(size, 20, &fs);
    loadFS(&fs);
    printFileSystem(&fs);
//    printDisk(&(fs.disk_emulator), 0);

    Inode inode;
    size_type inode_id = ROOT_INODE_ID;
    if(getInode(&fs, &inode_id, &inode)!=Success){
        printf("[Potato mount] Error: root directory not exist.\n");
        //return Err_GetInode;
        return -1;
    }

    //allocate a block to root directory
    size_type block_id;
    allocBlock(&fs, &block_id);
    inode.fileType = Directory;
    size_type i = 0;
    for(i=0; i<DIRECT_BLOCK_NUM; i++){
        inode.directBlock[i] = -1;
    }
    inode.singleBlock = -1;
    inode.doubleBlock = -1;
    inode.tripleBlock = -1;
    
    inode.directBlock[0] = block_id;
    inode.used = true;
    strcpy(inode.fileOwner, "NULL");
    inode.fileModifiedTime = time(NULL);
    inode.fileAccessTime = time(NULL);
    inode.inodeModifiedTime = time(NULL);
    inode.Permission = S_IFDIR | 0755;

    DirEntry dir_entry[2];
    strcpy(dir_entry[0].key, ".");
    dir_entry[0].inodeId = ROOT_INODE_ID;
    strcpy(dir_entry[1].key, "..");
    dir_entry[1].inodeId = ROOT_INODE_ID;

    BYTE* buf = malloc(BLOCK_SIZE);
    memcpy(buf, dir_entry, sizeof(dir_entry));
    put(&fs, block_id + fs.super_block.firstDataBlockId, buf);
    
    inode.fileSize = sizeof(dir_entry);
    
    //for . and ..
    inode.numOfLinks = 2;
    ErrorCode err = putInode(&fs, &inode_id, &inode);
    if(err != Success){
        printf("put root failed: Error %d", err);
    }

    Inode cur_inode;
    getInode(&fs, &inode_id, &cur_inode);
    printf("inode links: %ld\n", cur_inode.numOfLinks);
    printDisk(&(fs.disk_emulator), 1);
    //put free list buf into disk
    put(&fs, fs.super_block.pDataFreeListHead + fs.super_block.firstDataBlockId, &(fs.dataBlockFreeListHeadBuf));
    put(&fs, fs.super_block.pDataFreeListTail + fs.super_block.firstDataBlockId, &(fs.dataBlockFreeListTailBuf));

    
    SuperBlockonDisk super_block_on_disk;
    mapSuperBlockonDisk(&(fs.super_block), &(super_block_on_disk));
    memcpy(buf, &super_block_on_disk, sizeof(SuperBlockonDisk));
    put(&fs, SUPER_BLOCK_OFFSET, buf);
    //set root acess time

    free(buf);
    closefs(&fs);

    FileSystem new_fs;
    loadFS(&new_fs);
//    printFileSystem(&new_fs);
    getInode(&new_fs, &inode_id, &cur_inode);
    printf("inode links: %ld\n", cur_inode.numOfLinks);

    closefs(&fs);   
    return 0;
}
Example #3
0
int serverInit(char * MFS_image){
  //this binds the server to port 100000
  //sd = UDP_Open(10000);
  // assert(sd > -1);

  int sentinel, i = 0;

  //first open disk
  diskFD = open(MFS_image,O_RDWR);
    
  //if disk doesn't exist, create it
  if((int)diskFD < 0){
    diskFD = open(MFS_image, O_RDWR| O_CREAT| O_TRUNC, S_IRWXU);
 
    
    //create checkpoint region and write it
    //MFS_Ckpt ckptregion;
      
    //this ideally needs to be done with lseek at the end, but this is the easiest way to do it
    ckptregion.endLog = sizeof(ckptregion)+ sizeof(MFS_Imap_Piece) +sizeof(MFS_Inode)+sizeof(MFS_Dir_Block);
    for(i = 0; i < 256; i++ ){
      //may need this calculation later
      ckptregion.imapPiecePtrs[i] = -1;
    }
      
    /* Disk Image implemented as:                                                      
       | CR | Imap p1 | Inode1| Data1 | Inode2 | Data2 | ...| Imap p2 | Inode1 | Data1 |... |<-endLog
    */
      
    //point the first piece of the imap to the end of the log
    ckptregion.imapPiecePtrs[0] = sizeof(ckptregion);  
    
    lseek(diskFD, 0, 0);
    write(diskFD, &ckptregion, sizeof(ckptregion));
       
    //create and write root data, inode, imap
    MFS_Imap_Piece imapP1;
    for(i = 0; i < 16; i++)
      imapP1.imapPtrs[i] = -1; 
       
       
    imapP1.imapPtrs[0] = sizeof(ckptregion)+sizeof(imapP1); 
        
    //check all good before write
    if(DEBUG){
      printf("imap1.imapPtrs[0]: %d\n", imapP1.imapPtrs[0]);
      printf("imap1.imapPtrs[1]: %d\n", imapP1.imapPtrs[1]);
    }
       
    write(diskFD, &imapP1, sizeof(imapP1));
       
    MFS_Inode root_inode;
    root_inode.stats.type = 0;
    for(i = 0; i < 14; i++)
      root_inode.blockPtrs[i] = -1;
       
    //point this to the first datablock, right next to the inode
    root_inode.blockPtrs[0] = sizeof(ckptregion)+sizeof(imapP1)+sizeof(root_inode) ; 
    //root_inode.stats.size = MFS_BLOCK_SIZE; 
    root_inode.stats.size = 2*MFS_BLOCK_SIZE; 
       
       
    write(diskFD, &root_inode, sizeof(root_inode));
       
    // This is the first Directory Block
    MFS_Dir_Block rootDirBlock;      
   
    //prepare rootDirBlock
    sentinel = sizeof(rootDirBlock)/sizeof(rootDirBlock.dirEntries[0]);
    for(i = 0; i < sentinel; i ++){
      rootDirBlock.dirEntries[i].inum= -1;
      memcpy(rootDirBlock.dirEntries[i].name, "\0", sizeof("\0"));
    }
    
    //these are the first two directory entries into the rootDirBlock
   
    memcpy(rootDirBlock.dirEntries[0].name, ".\0", sizeof(".\0"));
    rootDirBlock.dirEntries[0].inum= 0;
    
    memcpy(rootDirBlock.dirEntries[1].name, "..\0", sizeof("..\0"));
    rootDirBlock.dirEntries[1].inum=0;

    
    //write rootDirBlock
    write(diskFD, &rootDirBlock, sizeof(rootDirBlock));   
  }
  else{
    //to check all set up okay
    if(DEBUG)
      printDisk();

    //disk image exists
    //load checkpoint region into memory
    (void) read(diskFD,&ckptregion, sizeof(ckptregion));
   
    //check if this is right
    if(DEBUG){
      printf("printing ckptregion\n");
      printf("printing  ckptregion.endLog: %d \n", ckptregion.endLog);
      for(i = 0; i < 5; i++){
	printf("printing ckptregion.imapPiecePtrs[%d]: %d \n",i, ckptregion.imapPiecePtrs[i]);
      }
    }
  
  }
  //load inodeMap into memory
  for(i = 0; i < 4096; i++){
    inodeMap.inodes[i] = -1;
  }
  i =0;
  sentinel = 0;
  int j = 0; 
  MFS_Imap_Piece imapPiece;
  while(ckptregion.imapPiecePtrs[i] >= 0){
    lseek(diskFD,ckptregion.imapPiecePtrs[i], 0);
    read(diskFD,&imapPiece, sizeof(imapPiece));
    while(imapPiece.imapPtrs[sentinel] >= 0){
      inodeMap.inodes[j] = imapPiece.imapPtrs[sentinel];
      j++;sentinel++;
    }
    i++;
  }

  //check inodeMap, etc  
  if(DEBUG){
    printf("diskFD: |%d|", (int)diskFD);     
    for(i = 0; i < 10; i++){
      printf("inodeMap.inodes[%d]: %d\n",i, inodeMap.inodes[i]);
    }  
  }
  memLoad();
  //make sure you flush
  /************************************************************************/
  //fsync(diskFD); 
  /************************************************************************/
  return 0;
}