Ejemplo n.º 1
0
Archivo: fs.c Proyecto: alex-pat/labs
file_info_t* get_file_info_by_node(node_t* f_node)
{
    printf("%s\n", __func__);
    file_info_t* result = (file_info_t*)malloc(sizeof(file_info_t));
    result->f_node = f_node;
    result->need_update = 0;
    fs_read_file( result->f_data, f_node->sectors );
    return result;
}
Ejemplo n.º 2
0
int32_t mk_ReadFileResponse(FileServerMessage** fsm){
	ReadFileRequest* rfRequest = (ReadFileRequest*)((*fsm)->payload);
	ReadFileResponse* rfResponse = calloc(1, sizeof(ReadFileResponse));

	rfResponse->size = rfRequest->length;
	rfResponse->data = calloc(1,rfRequest->length);
	fs_read_file(rfRequest->handle, rfRequest->offset, rfRequest->length, rfResponse->data);

	(*fsm)->payload_type = READ_FILE_RESPONSE;
	(*fsm)->payload = (uint8_t*)rfResponse;

	return 4+rfResponse->size;
}
Ejemplo n.º 3
0
/* Reads the content of the file descriptor and stores it in the buffer.*/
int fd_read (int fd, char * buffer, int block_size) {
	switch(files[fd].type) {
		case _FD_TTY:
			return tty_read(buffer, block_size);
		break;
		case _FD_FIFO:
			return fifo_read((int)files[fd].data, buffer, block_size);
		break;
		case _FD_FILE:
			return fs_read_file((int)files[fd].data, buffer, block_size, &files[fd].offset);
		break;
		default:
		return -1;
	}
}
Ejemplo n.º 4
0
ssize_t fs_load_file(const char *path, void *ptr, size_t maxlen)
{
    filehandle *handle;

    /* open the file */
    status_t err = fs_open_file(path, &handle);
    if (err < 0)
        return err;

    /* stat it for size, see how much we need to read */
    struct file_stat stat;
    fs_stat_file(handle, &stat);

    ssize_t read_bytes = fs_read_file(handle, ptr, 0, MIN(maxlen, stat.size));

    fs_close_file(handle);

    return read_bytes;
}
Ejemplo n.º 5
0
// Used to copy a file
unsigned int fs_cp(char * name, char * newname, int from_inode, int to_inode) {
	int i1 = fs_open_file(name, from_inode, O_RD, EXT2_S_IFREG);
	if(i1 < 0)	{
		return i1; // If there's an error with the first name then there's nothing to do actually.
	}
	inode_read(i1, &n);	
	int i2;
	if(!(n.mode & EXT2_S_IFDIR))
	{
		i2 = fs_open_file(newname, to_inode, O_WR, n.mode & (~EXT2_S_IFDIR)); 
		inode_read(i1, &n);	
		if(i2 < 0) { 
			i2 = fs_open_file(newname, to_inode, O_WR | O_NEW , n.mode & (~EXT2_S_IFDIR));
		}
		
		if(i2 < 0) { 
			return ERR_EXISTS;
		}
	} else {
		i2 = fs_mkdir(newname, to_inode);
		if(i2 < 0) { 
			return ERR_EXISTS;
		}
	}

	inode_read(i1, &n);
	block data;
	unsigned long offset = 0;
	
	while(fs_read_file(i1, (void *) &data, sizeof(block), &offset) > 0) {
		if(n.mode & EXT2_S_IFDIR)
		{
			int off = 0;
			dir_op_offset = 0;
			dir_entry * old_dot = NULL;
			dir_entry * dot = iterate_dir_entry(&data);
			// Iterates dir entries
			while (dot != NULL) {
				if (dot == NULL) {
					break;
				} else {
					if (dot->name_len > 0 && dot->inode != i1 && dot->inode != n._dir_inode && i2 != 0) {
						int _cp = fs_cp(dot->name, dot->name, i1, i2);

						if(_cp < 0)
						{
							return _cp;
						}
						off = dir_op_offset;
						dot->name_len = 0;
						dir_op_offset = off;
					}
				}
				old_dot = dot;
				dot = iterate_dir_entry(&data);
			}
			inode_read(i1, &n);
		} else {
			fs_write_file(i2, (void *)&data, sizeof(block));		
		}
	}

	return i2;
}
Ejemplo n.º 6
0
int main (int argc, char **argv) {
	
	srand(time(NULL));
	unsigned char test_data[TEST_DATA_SIZE] = {0};
	unsigned char cmp_test_data[TEST_DATA_SIZE] = {0};
	createRandomData(test_data,TEST_DATA_SIZE);
	memcpy(&cmp_test_data, &test_data,TEST_DATA_SIZE);
	
	int PASSES = 0;

	assert (fs_mount() >= 0);
	assert (fs_create_file("/testDir", DIR_FILE) >= 0);
	assert (fs_unmount() >= 0);

PASS_OK

	assert (fs_mount() >= 0);
	assert (fs_create_file("/testDir", DIR_FILE) >= 0);
	assert (fs_create_file("/testDir/checkMe.txt", REG_FILE) >= 0);
	assert (fs_unmount() >= 0);
	
PASS_OK


	assert (fs_mount() >= 0);
	assert (fs_create_file("/testDir", DIR_FILE) >= 0);
	assert (fs_create_file("/testDir/checkMe.txt", REG_FILE) >= 0);
	assert (fs_write_file("/testDir/checkMe.txt", test_data, TEST_DATA_SIZE) >= 0);
	assert (fs_unmount() >= 0);
	
PASS_OK

	unsigned char readResults[TEST_DATA_SIZE] = {0};
	
	assert (fs_mount() >= 0);
	assert (fs_create_file("/testDir", DIR_FILE) >= 0);
	assert (fs_create_file("/testDir/checkMe.txt", REG_FILE) >= 0);
	assert (fs_write_file("/testDir/checkMe.txt", test_data, TEST_DATA_SIZE) >= 0);
	assert (fs_read_file("/testDir/checkMe.txt", readResults, TEST_DATA_SIZE) >= 0);
	int i = 0;
	for (;i < TEST_DATA_SIZE; ++i) {
		assert(readResults[i] == cmp_test_data[i]);
	}
	assert (fs_unmount() >= 0);
	
PASS_OK
	
	assert (fs_mount() >= 0);
	assert (fs_create_file("/testDir", DIR_FILE) >= 0);
	assert (fs_create_file("/testDir/checkMe.txt", REG_FILE) >= 0);
	assert (fs_create_file("/testDir/secondMe.txt", REG_FILE) >= 0);
	assert (fs_create_file("/testDir/thirdMe.txt", REG_FILE) >= 0);
	
	Directory_t dir;
	assert (fs_get_directory("/testDir/", &dir) >= 0);
	assert (dir.size == 3);
	assert(strncmp(dir.entries[0].filename,"checkMe.txt",strlen("checkMe.txt")) == 0);
	assert(strncmp(dir.entries[1].filename,"secondMe.txt",strlen("secondMe.txt")) == 0);
	assert(strncmp(dir.entries[2].filename,"thirdMe.txt",strlen("thirdMe.txt")) == 0);
	assert (fs_unmount() >= 0);
	
PASS_OK
	/*NEW TEST ADDED */
	assert (fs_mount() >= 0);
	assert (fs_create_file("/testDir", DIR_FILE) >= 0);
	assert (fs_create_file("/testDir/checkMe.txt", REG_FILE) >= 0);
	assert (fs_create_file("/testDir/secondMe.txt", REG_FILE) >= 0);
	assert (fs_create_file("/testDir/thirdMe.txt", REG_FILE) >= 0);
	assert (fs_remove_file("/testDir/thirdMe.txt") >= 0);
	
	assert (fs_get_directory("/testDir/", &dir) >= 0);
	assert (dir.size == 2);
	assert(strncmp(dir.entries[0].filename,"checkMe.txt",strlen("checkMe.txt")) == 0);
	assert(strncmp(dir.entries[1].filename,"secondMe.txt",strlen("secondMe.txt")) == 0);
	assert (fs_unmount() >= 0);
	

	return 0;
}