]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/fsc.c
c0c026f726e6977c16ff51b26983808aa41e0cac
[z.facultad/75.06/emufs.git] / emufs / fsc.c
1 /* vim: set noexpandtab tabstop=4 shiftwidth=4:
2  *----------------------------------------------------------------------------
3  *                                  emufs
4  *----------------------------------------------------------------------------
5  * This file is part of emufs.
6  *
7  * emufs is free software; you can redistribute it and/or modify it under the
8  * terms of the GNU General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option) any later
10  * version.
11  *
12  * emufs is distributed in the hope that it will be useful, but WITHOUT ANY
13  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15  * details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with emufs; if not, write to the Free Software Foundation, Inc., 59 Temple
19  * Place, Suite 330, Boston, MA  02111-1307  USA
20  *----------------------------------------------------------------------------
21  * Creado:  vie abr  9 16:17:50 ART 2004
22  * Autores: Nicolás Dimov <sagardua@uolsinectis.com.ar>
23  *----------------------------------------------------------------------------
24  *
25  * $Id$
26  *
27  */
28
29 /** \file
30  *
31  * Archivo para administrar el espacio libre disponible.
32  * 
33  * Implementación del archivo para administrar el espacio libre disponible.
34  *
35  */
36
37 #include "fsc.h"
38 #include <string.h>
39 #include <unistd.h>
40
41 #define EMUFS_FSC_EXT ".fsc"
42
43 typedef struct emufs_fsc_t {
44         int block;
45         int free_space;
46 } EMUFS_FSC;
47
48 int emufs_fsc_agregar(EMUFS *emu, int num_bloque, int fs)
49 {
50         FILE *f_fsc;
51         EMUFS_FSC reg;
52         char name_f_fsc[255];
53         
54         strcpy(name_f_fsc,emu->nombre);
55         strcat(name_f_fsc, EMUFS_FSC_EXT);
56         
57         /*cargo el registro*/
58         reg.block = num_bloque; 
59         reg.free_space = fs;
60         /*lo guardo en el archivo al final  "a+"*/
61         if ( (f_fsc = fopen(name_f_fsc,"a+"))==NULL ) return -1;
62         fwrite(&reg,sizeof(EMUFS_FSC),1,f_fsc);
63         fclose(f_fsc);
64         return 0;
65 }
66
67 /* busca el bloque y le resta fs de espacio libre */
68 int emufs_fsc_actualizar(EMUFS *emu, int num_bloque, int fs)
69 {
70         FILE *f_fsc;
71         EMUFS_FSC reg;
72         char name_f_fsc[255];
73         
74         strcpy(name_f_fsc,emu->nombre);
75         strcat(name_f_fsc, EMUFS_FSC_EXT);
76
77         /*busco el bloque que modifique*/
78         if ( (f_fsc = fopen(name_f_fsc,"r+")) == NULL) return -1; 
79         while ( !feof(f_fsc) ){
80                 if ( fread(&reg,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue;
81                 if ( reg.block == num_bloque ){
82                         reg.free_space = fs;
83                         fseek(f_fsc,-sizeof(EMUFS_FSC),SEEK_CUR);
84                         fwrite(&reg,sizeof(EMUFS_FSC),1,f_fsc);
85                         break;
86                 }
87         }
88         fclose(f_fsc);
89         return 0;
90 }
91
92 /* me devuelve el ID del bloque donde quepa un registro, y guarda en fs el espacio libre que queda en el bloque */
93 int emufs_fsc_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs)
94 {
95         FILE *f_fsc;
96         EMUFS_FSC reg;
97         char name_f_fsc[255];
98         
99         strcpy(name_f_fsc,emu->nombre);
100         strcat(name_f_fsc, EMUFS_FSC_EXT);
101
102         if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
103
104         /* Inicializo la estructura para evitar que si el archivo esta vacio
105          * el resultado sea correcto
106          */
107         reg.block = -1;
108         *fs = emu->tam_bloque;
109         while( !feof(f_fsc) ){
110                 if (fread(&reg,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue;
111                 if ( reg.free_space >= tam+sizeof(int)) 
112                         break;
113                 else {
114                         reg.block = -1;
115                         *fs = emu->tam_bloque;
116                 }
117         }
118         
119         fclose(f_fsc);
120         if (reg.block != -1)
121                 *fs = reg.free_space;
122         return reg.block;
123 }
124
125 int emufs_fsc_get_fs(EMUFS *emu, int num_bloque)
126 {
127         FILE *f_fsc;
128         EMUFS_FSC reg;
129         char name_f_fsc[255];
130         
131         strcpy(name_f_fsc,emu->nombre);
132         strcat(name_f_fsc, EMUFS_FSC_EXT);
133
134         if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
135
136         while ( !feof(f_fsc) ){
137                 if ( fread(&reg,sizeof(EMUFS_FSC),1,f_fsc) != 1 ) continue;
138                 if ( reg.block == num_bloque )
139                         break;
140         }
141                 
142         fclose(f_fsc);
143         return reg.free_space;
144 }