]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/fsc.c
f5d6d06b6af13b09ca62f91d0ce825b1a07cae56
[z.facultad/75.06/emufs.git] / emufs / fsc.c
1 #include "fsc.h"
2 #include "tipo3.h"
3
4 int emufs_fsc_agregar(EMUFS *emu, int num_bloque, int fs)
5 {
6         FILE *f_fsc;
7         BLOCK_FREE_T reg;
8         char name_f_fsc[255];
9         
10         strcpy(name_f_fsc,emu->nombre);
11         strcat(name_f_fsc,".fsc");
12         
13         /*cargo el registro*/
14         reg.block = num_bloque; 
15         reg.free_space = fs;
16         /*lo guardo en el archivo al final  "a+"*/
17         if ( (f_fsc = fopen(name_f_fsc,"a+"))==NULL ) return -1;
18         fwrite(&reg,sizeof(BLOCK_FREE_T),1,f_fsc);
19         fclose(f_fsc);
20         return 0;
21 }
22
23 /* busca el bloque y le resta fs de espacio libre */
24 int emufs_fsc_actualizar(EMUFS *emu, int num_bloque, int fs)
25 {
26         FILE *f_fsc;
27         BLOCK_FREE_T reg;
28         char name_f_fsc[255];
29         
30         strcpy(name_f_fsc,emu->nombre);
31         strcat(name_f_fsc,".fsc");
32
33         /*busco el bloque que modifique*/
34         if ( (f_fsc = fopen(name_f_fsc,"r+")) == NULL) return -1; 
35         while ( !feof(f_fsc) ){
36                 if ( fread(&reg,sizeof(BLOCK_FREE_T),1,f_fsc) != 1) continue;
37                 if ( reg.block == num_bloque ){
38                         reg.free_space = fs;
39                         fseek(f_fsc,-sizeof(BLOCK_FREE_T),SEEK_CUR);
40                         fwrite(&reg,sizeof(BLOCK_FREE_T),1,f_fsc);
41                         break;
42                 }
43         }
44         fclose(f_fsc);
45         return 0;
46 }
47
48 /* me devuelve el ID del bloque donde quepa un registro, y guarda en fs el espacio libre que queda en el bloque */
49 int emufs_fsc_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs)
50 {
51         FILE *f_fsc;
52         BLOCK_FREE_T reg;
53         char name_f_fsc[255];
54         
55         strcpy(name_f_fsc,emu->nombre);
56         strcat(name_f_fsc,".fsc");
57
58         if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
59
60         /* Inicializo la estructura para evitar que si el archivo esta vacio
61          * el resultado sea correcto
62          */
63         reg.block = -1;
64         *fs = emu->tam_bloque;
65         while( !feof(f_fsc) ){
66                 if (fread(&reg,sizeof(BLOCK_FREE_T),1,f_fsc) != 1) continue;
67                 if ( reg.free_space >= tam+sizeof(int)) 
68                         break;
69                 else {
70                         reg.block = -1;
71                         *fs = emu->tam_bloque;
72                 }
73         }
74         
75         fclose(f_fsc);
76         if (reg.block != -1)
77                 *fs = reg.free_space;
78         return reg.block;
79 }
80
81 int emufs_fsc_get_fs(EMUFS *emu, int num_bloque)
82 {
83         FILE *f_fsc;
84         BLOCK_FREE_T reg;
85         char name_f_fsc[255];
86         
87         strcpy(name_f_fsc,emu->nombre);
88         strcat(name_f_fsc,".fsc");
89
90         if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
91
92         while ( !feof(f_fsc) ){
93                 if ( fread(&reg,sizeof(BLOCK_FREE_T),1,f_fsc) != 1 ) continue;
94                 if ( reg.block == num_bloque )
95                         break;
96         }
97                 
98         fclose(f_fsc);
99         return reg.free_space;
100 }