*/
#include "tipo3.h"
+#include "error.h"
+#include "common.h"
#include <unistd.h>
-#include <sys/types.h>
#include <stdio.h>
#include <string.h>
registro = (char*) malloc(emu->tam_reg);
if (registro == NULL) {
- /* TODO Manejo de errores */
PERR("No hay memoria");
- *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */
+ *err = EMUFS_ERROR_OUT_OF_MEMORY;
return NULL;
}
if ((file = fopen(name_f, "r")) == NULL) {
PERR("No se pudo abrir el archivo de datos");
- *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
- return NULL; /* FIXME ERROR */
+ *err = EMUFS_ERROR_CANT_OPEN_FILE;
+ return NULL;
}
fseek(file,sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE),SEEK_SET);
/*FIXME: verificar que no se pase de fin de archivo*/
block = (char*) malloc(emu->tam_bloque);
if (block == NULL) {
- /* TODO Manejo de errores */
PERR("No hay memoria");
- *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */
+ *err = EMUFS_ERROR_OUT_OF_MEMORY;
return NULL;
}
if (fread(block, emu->tam_bloque, 1, file) != 1) {
/* TODO Manejo de errores */
free(block);
PERR("Error al leer bloque");
- *err = 3; /* EMUFS_ERROR_FILE_READ */
+ *err = EMUFS_ERROR_FILE_READ;
return NULL;
}
fseek(file, 0, SEEK_END);
/* grabo el bloque en el final del archivo */
fwrite(bloque,emu->tam_bloque,1,file);
- /*actualizo el archivo de espacios libres*/
/*tengo que buscar la cantidad de bloques que existen*/
fseek(file, 0, SEEK_END); /* Me paro al final */
cant = (ftell(file)-(sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE))) / emu->tam_bloque;
free(bloque);
return -1;
}
-
}
fclose(file);
} else {
EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu)
{
- FILE *f;
+ int err = 0,err1 = 0, err2 = 0, err3 = 0;
EMUFS_Estadisticas stats;
- EMUFS_REG_ID *tmp;
- char name_f[255];
-
memset(&stats,0,sizeof(EMUFS_Estadisticas));
- strcpy(name_f,emu->nombre);
- strcat(name_f,".dat");
- if ( (f = fopen(name_f,"r")) == NULL){
- PERR("No se pudo abrir el archivo");
- return stats;
+
+ { /* obtengo tamaño del archivo en bytes */
+ char name_f[255];
+ strcpy(name_f, emu->nombre);
+ strcat(name_f, ".dat");
+ stats.tam_archivo = emufs_common_get_file_size(name_f, &err);
+ if (err) {
+ PERR("no se pudo obtener el tamaño del archivo");
+ return stats;
+ }
}
- fseek(f,0,SEEK_END);
- stats.tam_archivo_bytes = ftell(f);
- stats.cant_bloques =(stats.tam_archivo_bytes-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE)-sizeof(EMUFS_REG_SIZE))/
- emu->tam_bloque;
- tmp = emufs_idx_get(emu, &stats.tam_archivo);
- if (tmp) free(tmp);
- stats.info_control=stats.tam_archivo*sizeof(EMUFS_REG_ID)+sizeof(EMUFS_Tipo)+
- sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE);
+ /* obtengo la cantidad de bloques en el archivo */
+ stats.cant_bloques = (stats.tam_archivo-sizeof(EMUFS_Tipo)-sizeof(EMUFS_BLOCK_SIZE)-sizeof(EMUFS_REG_SIZE))/
+ emu->tam_bloque;
+
+ /* obtengo la cantidad de registros en el archivo */
+ {
+ EMUFS_REG_ID *tmp = emufs_idx_get(emu, &stats.cant_registros);
+ if (tmp) free(tmp); /* libera memoria innecesaria */
+ }
+
+ /* obtengo información de control que guarda el archivo .dat */
+ stats.tam_info_control_dat = stats.cant_registros*sizeof(EMUFS_REG_ID)+sizeof(EMUFS_Tipo)+
+ sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE);
+
/* Obtengo las stats de FSC */
stats.total_fs = emufs_fsc_get_total_fs(emu);
stats.media_fs = emufs_fsc_get_media_fs(emu);
emufs_fsc_get_max_min_fs(emu,&stats.min_fs,&stats.max_fs);
+
+ /* obtengo informacion de control guardada por los archivos auxiliares */
+ 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");
+ return stats;
+ }
- fclose(f);
return stats;
}
strcpy(name, emu->nombre);
strcat(name, ".dat");
-
- /* si el bloque es mas chico que el registro no hace falta compactar */
- /*if( emu->tam_reg-sizeof(EMUFS_REG_ID) > emu->tam_bloque ) return; */
tmp = emufs_idx_get(emu, &max_id);
if (tmp) free(tmp);