Ejemplo n.º 1
0
void deleteInode(disk_t disk, Inode* inode){
	char * databuf = malloc(sizeof(char) * disk->block_size);
	readblock(disk,inode->block,databuf);
	int i;
	bool gotsize = false;
	bool gotpointers = false;
	bool gotlink = false;
	bool gotname = false;
	int numberbufIndex = 0;
	char * numberbuf = malloc(sizeof(char) * 16);
	for(i = 0; databuf[i] != '\0' && i < disk->block_size;i+=1){
		if(!gotsize){
			if(databuf[i] == '\n'){
				gotsize = true;
			}
		}else if(!gotpointers){
			if(databuf[i] == '\n'){
				gotpointers = true; 
			}
		}else if(!gotname){
			if(databuf[i] == '\n'){
				gotname = true; 
			}
		}else{
			gotlink = true;
			numberbuf[numberbufIndex] = databuf[i];
			numberbufIndex +=1;
		}
	}
	int link;
	if(gotlink){
		numberbuf[numberbufIndex] = '\0';
		link = str2int(numberbuf);
		Inode * newinode = readInode(disk,link);
		deleteInode(disk,newinode);
		freeInode(newinode);
	}
	int * blockmap = read_block_map(disk);
	blockmap[inode->block] = 0;
	write_block_map(disk,blockmap);
	free(blockmap);
	free(databuf);
	free(numberbuf);
}
Ejemplo n.º 2
0
Inode * rewriteInode(disk_t disk, Inode* inode){
	deleteInode(disk,inode);
	Inode* newinode = writeInode(disk,inode->block,inode->pointers,inode->isDirectory,inode->name);
	freeInode(inode);
	return newinode;
}
Ejemplo n.º 3
0
int serverUnlink(int pinum, char * name){
  int i, k;
  memLoad();
  //take care of error cases
  if(pinum < 0 || pinum > 4095)
    return -1;
  
  if(strlen(name) > 28 || strlen(name) < 0)
    return -1;


  if(inodeMap.inodes[pinum] == -1 )
    return -1;  
  
  if(strcmp(name, "..\0") == 0 || strcmp(name, ".\0") == 0 )
    return -1;

  
  //get pinum address
  int pinumLocation = inodeMap.inodes[pinum];

  //lseek to this location
  lseek(diskFD, pinumLocation, 0);
  
  //we have just lseeked to the inode, we need to read the inode
  MFS_Inode pInode;
  int bytesRead =  read(diskFD,&pInode, sizeof(pInode));
  if(DEBUG){
    printf("bytesRead: |%d|\n", bytesRead);
    
  }

  /*************************************************************************/
  /*
  close(diskFD);printDisk();exit(0);
  if(pInode.stats.type == MFS_REGULAR_FILE){
    printInode(&pInode);
    exit(0);
  }
  */
  /*************************************************************************/
  //check if this is a directory or not
   if(pInode.stats.type != MFS_DIRECTORY)
     return -1;
  
  int found = -1, deleteDirBlockLoc, deleteIndex, deleteInodeLocation;
  MFS_Dir_Block dirBlock;
  for(i = 0; i < 14; i++){
    if(pInode.blockPtrs[i] >= 0 ){
      lseek(diskFD,pInode.blockPtrs[i],0);
      read(diskFD, &dirBlock, sizeof(dirBlock));
      for(k = 0; k < 128; k++){
	if(strcmp(dirBlock.dirEntries[k].name, name) ==0){
	  //printf("dirBlock.dirEntries[k].name, name: %s, %s\n",dirBlock.dirEntries[k].name, name );
	  //printf(" dirBlock.dirEntries[k].inum:%d\n", dirBlock.dirEntries[k].inum);
	  //exit(0);
	  found = 1;
	  deleteInodeLocation = inodeMap.inodes[dirBlock.dirEntries[k].inum];
	  deleteIndex = k;
	  deleteDirBlockLoc = pInode.blockPtrs[i];
	  i = 5000;
	 
	}
      }
    }
  } 
 
  if(found < 0)
    return 0;
  
  /**************************************ERROR***********************************/
  //there is something wrong here with the inodeLocation that you are passing to delete
  /**************************************ERROR***********************************/
  MFS_Inode inodeToDelete;
  lseek(diskFD, deleteInodeLocation,0);
  read(diskFD, &inodeToDelete, sizeof(inodeToDelete));
  //printf("SIZE: %d\n", inodeToDelete.stats.size);exit(0);  

 

  if(inodeToDelete.stats.type == MFS_DIRECTORY){  
    if(inodeToDelete.stats.size > 2*(MFS_BLOCK_SIZE)){
      return -1;
    }


   
    /* else{
      dirBlock.dirEntries[deleteIndex].inum = -1;
      memcpy(dirBlock.dirEntries[deleteIndex].name, "\0", sizeof("\0"));
      //write out the directory block
      lseek(diskFD, pInode.blockPtrs[i],0);
      write(diskFD, &dirBlock, sizeof(dirBlock));
      
       }
      */
   }
  
  deleteInode(deleteInodeLocation);

  
  dirBlock.dirEntries[deleteIndex].inum = -1;
  memcpy(dirBlock.dirEntries[deleteIndex].name, "\0", sizeof("\0"));
  //write out the directory block
  lseek(diskFD, deleteDirBlockLoc,0);
  write(diskFD, &dirBlock, sizeof(dirBlock));
      
  //update pInode
  int sizeIndex = 0;
  for(i =0; i < 14; i++)
    if(pInode.blockPtrs[i] != -1)
      sizeIndex =i;
	
  //if(sizeIndex > 3)
  pInode.stats.size = (sizeIndex+1)*MFS_BLOCK_SIZE;
  //pInode.stats.size -=MFS_BLOCK_SIZE;
  //write out the pInode
  lseek(diskFD, pinumLocation,0);
  write(diskFD, &pInode, sizeof(pInode));
  memLoad();
  //delete the directory file, update pInode
  //close(diskFD);
  //printDisk();
  //diskFD = open(file, O_RDWR);
  return 0;


  //TODO
  //get to the directory block, search for name
  //if the index is 3 AND no other files exist, delete(update Imap, ckpt, etc) pInode from the whole disk
  //if last piece in Imappiece, then remove the Imap, update ckpt
 
  // return 0;
}