Exemplo n.º 1
0
void cp(char * filename, char * path)
{
	int i, name_length, type, ret, j;
	filename[str_len(filename) - 1] = 0;
	iNode * path_inode = current;
	path_inode = parser_path(path, path_inode);
	iNode * filename_inode = current;
	filename_inode = parser_path(filename, filename_inode);

	if(filename_inode->gid < currentUsr.group)
	{
		printf("\nCan not copy '%s'. Permission denied.", filename);
		return ;
	}

	if(filename_inode == NULL)
	{
		printf("\nCan not copy '%s'. File doesn't exist.", filename);
		return ;
	}

	if(path_inode == NULL)
	{
		name_length = str_len(path);
		for(i = 0; i < name_length; i++)
			if(path[i] == '/')
			{
				printf("\nCan not copy '%s' to '%s'. Directory doesn't exist.", filename, path);
				return;
			}
		rename_file(filename_inode->iNode_number, path);
		return ;
	}

	int init_block = current->data.direct_blocks[0];
	directoryEntry * dr = (directoryEntry*)calloc(64 * 96, 1);
	read_disk(0, init_block, dr, (BLOCK_SIZE * 12), 0);
	for(i = 1; i < 96; i++){
		if( strcmp(filename, dr[i].name) == 1){
			type = dr[i].type;
			break;
		}
	}

	if(type == FILE)
	{
		cp_file(filename, filename_inode, path_inode);
	}
	else if(type == DIRECTORY)
	{
		recursive_cp(filename, filename_inode, path_inode);
	}

	return ;
}
Exemplo n.º 2
0
void links(char * path1, char * path2) {

	int path1_len = str_len(path1);
	path1[path1_len - 1] = '\0';

	int path2_len, i, index_file_name, quant_chars;
	char * directory_path;
	char * name;
	iNode * path1_inode = current;
	path1_inode = parser_path(path1, path1_inode);

	if (path1_inode == NULL) {
		printf("Wrong name or path\n");
	}

	// Search for the first / from right to left, to get the path and the
	//filename.
	path2_len = str_len(path2);
	for (i = path2_len; i >= 0; i--) {
		if (path2[i] == '/') {
			index_file_name = i;
			break;
		}
	}
	//if I find one
	if (i >= 0) {
		quant_chars = path2_len - (path2_len - index_file_name) + 1;
		directory_path = malloc(quant_chars);
		name = malloc(path2_len - quant_chars);
		memcpy(directory_path, path2, quant_chars);
		memcpy(name, path2 + quant_chars, path2_len - quant_chars);
		name[path2_len - quant_chars] = '\0';
		directory_path[quant_chars - 1] = '\0';

		iNode * path2_inode = current;
		path2_inode = parser_path(directory_path, path2_inode);

		iNode * link_node = insert_file(name, 777, path2_inode);
		copy_link_inode(path1_inode, link_node);
	} else {

		/*printf("ENTRO");*/
		iNode * path2_inode = current;
		iNode * link_node = insert_file(path2, 2, path2_inode);

		copy_link_inode(path1_inode, link_node);
		/*printf("ID:%d\n",link_node->identifier);*/
		fs_insert_inode(link_node);
	}

	return;
}
Exemplo n.º 3
0
void cd(char * path){
	
	iNode * posible_inode = current;
	posible_inode = parser_path(path, posible_inode);

	if ( posible_inode == NULL )
	{
		printf("Wrong name or path\n");
	}else
	{
		current = posible_inode;
	}
	return;

}
Exemplo n.º 4
0
//DONE!
void ls(char * path){
	
	int i;
	iNode * posible_inode = current;
	posible_inode = parser_path(path, posible_inode);

	if ( posible_inode == NULL )
	{
		printf("Wrong name or path\n");
	} 
	else 
	{
		print_directories(posible_inode);
	}
	return;
	
}
Exemplo n.º 5
0
int					convert_tilde(char **path)
{
	char			*home;

	if (!(*path))
		return (0);
	if (*path[0] != '~')
		return (0);
	if ((*path)[1] && (*path)[1] != '/')
		return (0);
	home = get_env_val("HOME");
	if (home == NULL)
		return (int_error(ENVH));
	if (parser_path(home, 'd', S_IXUSR) == -1)
		return (-1);
	if ((*path = ft_strjoin(home, (*path) + 1)) == NULL)
		return (int_error(EALLOC));
	return (0);
}
Exemplo n.º 6
0
void cd_in_kernel(char * path) {

	path[str_len(path)] = 0;
	iNode * posible_inode = current;
	posible_inode = parser_path(path, posible_inode);

	if (posible_inode->gid < currentUsr.group && posible_inode->iNode_number != superblock->root->iNode_number) {
		printf("\nCan not acces directory %s. Admin permissions required.", path);
		return;
	}

	if (posible_inode->identifier == FILE) {
		printf("\nDirectories Only");
		return;
	}
	if (posible_inode == NULL) {
		printf("\nWrong name or path");
		return;
	} else {
		current = posible_inode;
	}
	return;

}
Exemplo n.º 7
0
void rmDir(char * path) {

	int i, j, ret;
	iNode * posible_inode = current;
	posible_inode = parser_path(path, posible_inode);

	if (posible_inode == NULL) {
		printf("Wrong name or path\n");
		return;
	}

	if (posible_inode->gid < currentUsr.group) {
		printf("\nCan not remove %s. Permission denied.", path);
		return;
	}
	if (posible_inode->identifier != DIRECTORY) {

		int inode_number = posible_inode->iNode_number;
		int init_block = current->data.direct_blocks[0];
		directoryEntry * dr = (directoryEntry*) calloc(sizeof(directoryEntry),
				96);
		read_disk(0, init_block, dr, BLOCK_SIZE * 12, 0);
		for (i = 2; i < 96; i++) {
			if (dr[i].inode == inode_number) {
				char * empty_name = "\0";
				dr[i].type = 0;
				dr[i].inode = 0;
				dr[i].lenght = 0;
				strcopy(dr[i].name, empty_name, 1);
				break;
			}
		}
		write_disk(0, init_block, dr, BLOCK_SIZE * 12, 0);
	} else {
		//BORRADO RECURSIVO.
		ret = recursive_remove(posible_inode);

		if (ret)
			return;
		int inode_number = posible_inode->iNode_number;
		int init_block = current->data.direct_blocks[0];
		directoryEntry * dr = (directoryEntry*) calloc(sizeof(directoryEntry),
				96);
		read_disk(0, init_block, dr, BLOCK_SIZE * 12, 0);
		iNode * parent = fs_get_inode(dr[1].inode);
		int father_init_block = current->data.direct_blocks[0];
		directoryEntry * father_dr = (directoryEntry*) calloc(
				sizeof(directoryEntry), 96);
		read_disk(0, father_init_block, father_dr, BLOCK_SIZE * 12, 0);

		for (i = 2; i < 96; i++) {
			if (father_dr[i].inode == inode_number) {
				char * empty_name = "\0";
				dr[i].type = 0;
				dr[i].inode = 0;
				dr[i].lenght = 0;
				strcopy(dr[i].name, empty_name, 1);
				break;
			}
		}
		write_disk(0, init_block, dr, BLOCK_SIZE * 12, 0);
	}
	return;
}
Exemplo n.º 8
0
void mv(char * filename, char * path)
{
	int i, name_length, type;
	filename[str_len(filename) - 1] = 0;
	iNode * path_inode = current;
	path_inode = parser_path(path, path_inode);
	iNode * filename_inode = current;
	filename_inode = parser_path(filename, filename_inode);

	if(filename_inode->gid < currentUsr.group)
	{
		printf("\nCan not move '%s'. Permission denied.", filename);
		return ;
	}

	if(filename_inode == NULL)
	{
		printf("\nCan not move '%s'. File doesn't exist.", filename);
		return ;
	}

	if(path_inode == NULL)
	{
		name_length = str_len(path);
		for(i = 0; i < name_length; i++)
			if(path[i] == '/')
			{
				printf("\nCan not move '%s' to '%s'. Directory doesn't exist.", filename, path);
				return;
			}
		rename_file(filename_inode->iNode_number, path);
		return ;
	}

	int init_block = current->data.direct_blocks[0];
	directoryEntry * dr = (directoryEntry*)calloc(64 * 96, 1);
	read_disk(0, init_block, dr, (BLOCK_SIZE * 12), 0);
	for(i = 1; i < 96; i++){
		if( strcmp(filename, dr[i].name) == 1){
			type = dr[i].type;
			break;
		}
	}

	if(type == DIRECTORY)
	{
		insert_directory_entry(filename_inode, path_inode, filename);

		int inode_number = filename_inode->iNode_number;
		init_block = current->data.direct_blocks[0];
		directoryEntry * dr = (directoryEntry*)calloc(sizeof(directoryEntry),96);
		read_disk(0,init_block,dr,BLOCK_SIZE*12,0);
		iNode * parent = fs_get_inode(dr[1].inode);
		int father_init_block = current->data.direct_blocks[0];
		directoryEntry * father_dr = (directoryEntry*)calloc(sizeof(directoryEntry),96);
		read_disk(0,father_init_block,father_dr,BLOCK_SIZE*12,0);

		for ( i = 2; i < 96; i++){
			if ( father_dr[i].inode == inode_number){
				dr[i].type = 0;
				dr[i].inode = 0;
				dr[i].lenght = 0;
				strcopy(dr[i].name,"\0",1 );
				break;
			}
		}
		write_disk(0,init_block,dr,BLOCK_SIZE*12,0);
	}
	else if( type == FILE)
	{
		insert_file(filename, 777, path_inode);
		rmDir(filename);
	}

	return ;
}