/*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; }
int main(int argc, char **argv){ unsigned int a, descriptor, b; descriptor = bmount(argv[1]); b = atoi(argv[2]); a = liberar_inodo(b); printf("El inodo liberado es: %d\n", a); if(bumount(descriptor)<0) exit(1); }
int mi_truncar_f(unsigned int ninodo, unsigned int nbytes) { // Creamos una estructura inodo. struct inodo Inodo; // Leemos el inodo indicado por parámetro. Inodo = leer_inodo(ninodo); if (nbytes > Inodo.tamEnBytesLog) { printf("ERROR -> No se ha podido truncar el fichero por sobrepasar su tamaño.\n"); return -1; } // Si el número de bytes es 0, vaciamos el fichero. if (nbytes == 0) { liberar_inodo(ninodo); Inodo.tamEnBytesLog = nbytes; if (escribir_inodo(Inodo, ninodo) == -1) { return -1; } }// Si no... else if (nbytes > 0) { // Calculamos el último bloque a truncar. int ultimoblogico = Inodo.tamEnBytesLog / BLOCKSIZE; // Si el tamaño en bytes lógicos del inodo es múltiplo del tamaño de bloque // decrementamos la variable ultimoblogico. if ((Inodo.tamEnBytesLog % BLOCKSIZE) == 0) { ultimoblogico--; } // Calculamos el último bloque que conservamos. int bloq_queda = nbytes / BLOCKSIZE; // Si el número de bytes es múltiplo de tamaño de bloque, decrementamos // la variable bloq_queda. if (nbytes % BLOCKSIZE == 0) { bloq_queda--; } unsigned int bfisico; int i = 0; char reservar = '0'; // Iteramos para todos los bloques que queremos liberar. for (i = bloq_queda + 1; i <= ultimoblogico; i++) { // Obtenemos el bloque físico. bfisico = traducir_bloque_inodo(ninodo, i, reservar); // Si no es el bloque raíz (SUPERBLOQUE)... if (bfisico > 0) { if (liberar_bloque(bfisico) == -1) { printf("ERROR -> No se ha liberado el bloque.\n"); return -1; } // Decrementamos los bloques ocupados. Inodo.numBloquesOcupados--; } // Si estamos en el último bloque y no ocupa el bloque entero... if ((i == ultimoblogico) && (Inodo.tamEnBytesLog % BLOCKSIZE != 0)) { // Truncamos el trozo del bloque. Inodo.tamEnBytesLog = Inodo.tamEnBytesLog - (Inodo.tamEnBytesLog % BLOCKSIZE); } else { // Truncamos todo el bloque. Inodo.tamEnBytesLog = Inodo.tamEnBytesLog - BLOCKSIZE; } } Inodo.tamEnBytesLog = nbytes; if (escribir_inodo(Inodo, ninodo) == -1) { return -1; } } return 0; }