/* ** Supprime un bloc de la liste des blocs libres */ int remove_free_block(disk_id id, uint32_t id_description_block){ /* Mise en mémoire du block de description */ block description_block; description_block.block_block = malloc(1024); if(read_block(id,description_block,id_description_block).error_id==1){ fprintf(stderr, "Erreur lors de la lecture du block.\n"); return 1; } /* Mise en mémoire de l'id du block à remove */ uint32_t id_block_to_remove = get_first_free_block(id,id_description_block); /* Overwrite de la valeur de TTTFS_VOLUME_FREE_BLOCK_COUNT dans le block de description en mémoire */ write_inblock(description_block,3,read_inblock(3,description_block)-1); /* Overwrite de la valeur de TTTFS_VOLUME_FIRST_FREE_BLOCK dans le block de description en mémoire */ block remove_block; remove_block.block_block = malloc(1024); read_block(id,remove_block,id_description_block+id_block_to_remove); write_inblock(description_block,4,read_inblock(255,remove_block)); /* Overwrite du description_block en mémoire sur le disk */ write_block(id,description_block,id_description_block); /* Mise en mémoire du block_to_remove */ block block_to_remove; block_to_remove.block_block = malloc(1024); if(read_block(id,block_to_remove,id_block_to_remove).error_id==1){ fprintf(stderr, "Erreur lors de la lecture du block.\n"); return 1; } /* Overwrite de la valeur du next_free_block dans le last_free_block en mémoire */ write_inblock(block_to_remove,255,0); /* Overwrite du last_free_block sur le disk */ write_block(id,block_to_remove,id_block_to_remove); return 0; }
/* * Does the actual creation of a file. Mode and dev can be ignored. * */ static int cs1550_mknod(const char *path, mode_t mode, dev_t dev) { (void) mode; (void) dev; char directory[MAX_FILENAME + 1]; //name of directory we are looking for char filename[MAX_FILENAME + 1]; //name of file we are looking for char extension[MAX_EXTENSION + 1]; //file extension we are looking for int res = 0; meta_entry attribute = find_correct_directory(path); sscanf(path, "/%[^/]/%[^.].%s", directory, filename, extension); //tokenizes and stores the strings for the directory we are looking for if( attribute.slash_count == 1 ) //under root, do not give permission { res = -EPERM; } else if( strlen(filename) > 8 || strlen(extension) > 3 ) //name length is too long { res = -ENAMETOOLONG; } else if( attribute.file_index > -1) //is already a file { res = -EEXIST; } else //create file { cs1550_directory_entry directory_entry = get_directory_entry( attribute.index_of_directory ); strcpy(directory_entry.files[ directory_entry.nFiles ].fname, filename); //put filename in array index strcpy(directory_entry.files[ directory_entry.nFiles ].fext, extension); //put extension in array index // directory_entry.files[ directory_entry.nFiles ].fsize = 512; //size of block directory_entry.files[ directory_entry.nFiles ].fsize = 0; //size of block directory_entry.files[ directory_entry.nFiles ].nStartBlock = get_first_free_block(); //gets the first free block directory_entry.nFiles = directory_entry.nFiles++; //increment the amount of files write_directory_entry( directory_entry, attribute.index_of_directory ); //write the directory entry } return res; }
void add_default_directories(ino iNode, ino parentiNode) { int freeBlockNumber = get_first_free_block(); add_data_block_to_inode(iNode, freeBlockNumber); char directoryDataBlock[BLOCK_SIZE]; ReadBlock(6 + iNode - 1, directoryDataBlock); DirEntry *directory = (DirEntry *)directoryDataBlock; strcpy(directory[0].Filename, "."); directory[0].iNode = iNode; add_size_to_inode_size(sizeof(directory[0]), iNode); strcpy(directory[1].Filename, ".."); directory[1].iNode = parentiNode; add_size_to_inode_size(sizeof(directory[1]), iNode); WriteBlock(6 + iNode - 1, directoryDataBlock); }
/* ** Renvoie l'id du dernier block libre de la partition */ uint32_t get_last_free_block(disk_id id, uint32_t id_description_block){ uint32_t prev_free_block = get_first_free_block(id,id_description_block); uint32_t next_free_block = 0; block description_block; block tmp_block; description_block.block_block = malloc(1024); tmp_block.block_block = malloc(1024); read_block(id,description_block,id_description_block); read_block(id,tmp_block,prev_free_block); next_free_block = read_inblock(1023,tmp_block)+ id_description_block; while(next_free_block != prev_free_block){ prev_free_block = next_free_block; read_block(id,tmp_block,prev_free_block); next_free_block = read_inblock(1023,tmp_block)+ id_description_block; } free(description_block.block_block); free(tmp_block.block_block); return next_free_block; }
void assign_free_datablock(ino pFilenameiNode) { int freeDataBlockNumber = get_first_free_block(); char freeDataBlock[BLOCK_SIZE]; iNodeEntry *iNodes; if (pFilenameiNode < 16) { ReadBlock(4, freeDataBlock); iNodes = (iNodeEntry *)freeDataBlock; iNodes[pFilenameiNode].Block[0] = freeDataBlockNumber; iNodes[pFilenameiNode].iNodeStat.st_blocks = 1; WriteBlock(4, freeDataBlock); } else { ReadBlock(5, freeDataBlock); iNodes = (iNodeEntry *)freeDataBlock; iNodes[pFilenameiNode - 16].Block[0] = freeDataBlockNumber; iNodes[pFilenameiNode].iNodeStat.st_blocks = 1; WriteBlock(5, freeDataBlock); } }