EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE tam, int* err)
{
EMUFS_REG_ID ID_aux;
- EMUFS_FREE fs;
+ EMUFS_FREE fs, new_fs;
EMUFS_BLOCK_ID num_bloque;
EMUFS_BLOCK_SIZE cant;
FILE *file;
}
/* grabo el nuevo registro en el archivo de espacios libres */
- if ( emu->tam_bloque > emu->tam_reg ) resto = emu->tam_reg;
- if ( emufs_fsc_agregar(emu, num_bloque+i, emu->tam_bloque - resto - sizeof(EMUFS_REG_ID)) != 0 ) {
+ if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) >= emu->tam_reg )
+ new_fs = emu->tam_bloque - emu->tam_reg - sizeof(EMUFS_REG_ID);
+ else new_fs = emu->tam_bloque - resto - sizeof(EMUFS_REG_ID);
+ if ( emufs_fsc_agregar(emu, num_bloque+i, new_fs) ) {
fclose(file);
free(bloque);
return -1;
return -1;
}
} else {
+ resto += sizeof(EMUFS_REG_ID);
if ( cant_bloques-1 == i )
- resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID));
+ resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID))+sizeof(EMUFS_REG_ID);
if ( emufs_fsc_agregar(emu, num_bloque+i, fs-resto) !=0 ){
fclose(file);
if (bloque) free(bloque);
EMUFS_BLOCK_SIZE ptr_elim;
EMUFS_BLOCK_SIZE ptr_mov;
EMUFS_REG_ID ID_aux;
- EMUFS_FREE fs;
+ EMUFS_FREE fs, new_fs;
char *bloque;
- int err = 0, i;
+ int err = 0, i, cant_bloques;
+ /*cantidad de bloques que ocupa un registro*/
+ cant_bloques = emu->tam_reg/(emu->tam_bloque-sizeof(EMUFS_REG_ID))+1;
+
num_bloque = emufs_idx_buscar_registro(emu, ID);
if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, &err))) {
/* TODO Manejo de errores */
PERR("No se pudo grabar el bloque");
return -1;
}
-
+
/*actualizo archivo .fsc*/
- if ( emu->tam_bloque < emu->tam_reg ) {
- for (i=0; i<emu->tam_reg/(emu->tam_bloque-sizeof(EMUFS_REG_ID))+1; i++)
+ if ( emu->tam_bloque-sizeof(EMUFS_REG_ID) < emu->tam_reg ) {
+ for (i=0; i<cant_bloques; i++)
if (emufs_fsc_agregar(emu, num_bloque+i, emu->tam_bloque)) {
PERR("no se pudo agregar fsc");
free(bloque);
emufs_fsc_get_max_min_fs(emu,&stats.min_fs,&stats.max_fs);
/* obtengo informacion de control guardada por los archivos auxiliares */
- stats.tam_archivo_aux = emufs_idx_get_file_size(emu,&err1) + emufs_fsc_get_file_size(emu,&err2)
+ stats.tam_archivos_aux = emufs_idx_get_file_size(emu,&err1) + emufs_fsc_get_file_size(emu,&err2)
+ emufs_did_get_file_size(emu,&err3);
if (err1 || err2 || err3) {
PERR("Hubo problemas en lectura de filesize archivos auxiliares");
tmp = emufs_idx_get(emu, &max_id);
if (tmp) free(tmp);
- for( i=0; i<=max_id; i++){
+ for( i=0; i<max_id; i++){
/* si el id no existe paso al siguiente*/
if ( emufs_idx_existe_id(emu, i) != 0 ) continue;
reg = emufs_tipo3_leer_registro(emu, i, &size, &err);
if (err){
- PERR("No se pudo leer el registro");
+ PERR("No se pudo leer el registro para reacomodar");
return;
}
emufs_tipo3_borrar_registro(emu, i);