Exemple #1
0
/*
** 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;
}
Exemple #2
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;
}
Exemple #3
0
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);
}
Exemple #4
0
/*
** 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;
}
Exemple #5
0
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);
    }
}