X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/9b6d59d2a6f3ed7e0d2413c3730c29f1041dab2c..cf825e36413b03d62f9b537c82903224165a2d06:/emufs/fsc.c?ds=sidebyside diff --git a/emufs/fsc.c b/emufs/fsc.c index 044ef33..562ae32 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -374,20 +374,31 @@ int emufs_fsc_get_max_min_fs(EMUFS *emu, EMUFS_FREE *min, EMUFS_FREE *max) strcpy(name_f_fsc,emu->nombre); strcat(name_f_fsc, EMUFS_FSC_EXT); - *min = ULONG_MAX; - *max = 0; if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1; - - while ( !feof(f_fsc) ){ - fread(®, sizeof(EMUFS_FSC), 1, f_fsc); - if ( reg.freespace < *min ) - *min = reg.freespace; - if ( reg.freespace > *max ) - *max = reg.freespace; + + /* Si el file esta vacio, devuelvo valores nulos */ + fseek(f_fsc,0,SEEK_END); + if (ftell(f_fsc) == 0) { + *min = 0; + *max = 0; + return 0; + } + else + { + /* Busco Min y Max */ + *min = ULONG_MAX; + *max = 0; + fseek(f_fsc,0,SEEK_SET); + while ( !feof(f_fsc) ){ + if ( fread(®, sizeof(EMUFS_FSC), 1, f_fsc) != 1) continue; + if ( reg.freespace < *min ) + *min = reg.freespace; + if ( reg.freespace > *max ) + *max = reg.freespace; + } + fclose(f_fsc); + return 0; } - - fclose(f_fsc); - return 0; } EMUFS_FREE emufs_fsc_get_media_fs(EMUFS *emu) @@ -404,11 +415,43 @@ EMUFS_FREE emufs_fsc_get_media_fs(EMUFS *emu) if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1; while ( !feof(f_fsc) ){ - fread(®, sizeof(EMUFS_FSC), 1, f_fsc); + if ( fread(®, sizeof(EMUFS_FSC), 1, f_fsc) != 1) continue; total_fs += reg.freespace; ++gap_count; } fclose(f_fsc); - return total_fs/gap_count; + + if (gap_count > 0) return total_fs/gap_count; + else return 0; +} + +int emufs_fsc_get_cant_bloques_vacios(EMUFS *emu) +{ + FILE *f_fsc; + EMUFS_FSC reg; + char name_f_fsc[255]; + int cant=0; + + strcpy(name_f_fsc,emu->nombre); + strcat(name_f_fsc, EMUFS_FSC_EXT); + + if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1; + while ( !feof(f_fsc) ){ + fread(®, sizeof(EMUFS_FSC), 1, f_fsc); + if ( reg.freespace == emu->tam_bloque ) + cant++; + } + + fclose(f_fsc); + return cant; +} + +int emufs_fsc_truncate(EMUFS* efs, EMUFS_BLOCK_ID blocks) +{ + char name_f_fsc[255]; + + strcpy(name_f_fsc, efs->nombre); + strcat(name_f_fsc, EMUFS_FSC_EXT); + return truncate(name_f_fsc, blocks * sizeof(EMUFS_FSC)); }