int liberar_inodo(unsigned int ninodo) { struct superbloque sb; struct inodo inodoAux; unsigned int blogico = 0; if (bread(posSB, &sb) == -1) { printf("Error: ficheros_basico.c > liberar_inodo > al intentar leer el superbloque \n"); return -1; } inodoAux = leer_inodo(ninodo); liberar_bloques_inodo(ninodo, blogico); inodoAux.tipo = 'l'; inodoAux.ctime = time(NULL); // Enlazamos el primer inodo libre inodoAux.punterosDirectos[0] = sb.posPrimerInodoLibre; sb.posPrimerInodoLibre = ninodo; sb.cantInodosLibres++; if (escribir_inodo(inodoAux, ninodo) == -1) { printf("Error: ficheros_basico.c > liberar_inodo > al intentar liberar inodo \n"); return -1; } if (bwrite(posSB, &sb) == -1) { printf("Error: ficheros_basico.c > reservar_inodo > al intentar actualizar el superbloque \n"); return -1; } return ninodo; }
/*Trunca (corta) un fichero/directorio (ninodo) pasado por argumento a los bytes (nbytes) pasados por argumento, liberando los bloques que no hagan falta * si nbytes = 0 lo liberamos TODO */ int mi_truncar_f(unsigned int ninodo, unsigned int nbytes) { struct inodo inode; inode = leer_inodo(ninodo); if ((inode.permisos & 2) != 2) { //Si no tenemos permisos de lectura devolvemos un error return -1; } if (nbytes == 0) {//liberamos todo el inodo liberar_inodo(ninodo); } else { //liberamos a partir del bloque correspondiente del nbyte if (liberar_bloques_inodo(ninodo, nbytes) < 0) { printf("ERROR: ficheros_basic.c -> (metodo) -> descripcion error.\n"); return -1; } } //actualizamos el inodo inode.mtime = time(NULL); inode.ctime = time(NULL); inode.tamEnBytesLog = nbytes; escribir_inodo(inode, ninodo); //guardamos el inodo mi_signalSem(); return 0; }