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); }
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; }
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; }