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