]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/fsc.c
0a5ba229cbfaefbc4f5726524d188c72f52130e9
[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 int emufs_fsc_agregar(EMUFS *emu, int num_bloque, int fs)
42 {
43         FILE *f_fsc;
44         EMUFS_FSC reg;
45         char name_f_fsc[255];
46         
47         strcpy(name_f_fsc,emu->nombre);
48         strcat(name_f_fsc, EMUFS_FSC_EXT);
49         
50         /*cargo el registro*/
51         reg.block = num_bloque; 
52         reg.free_space = fs;
53         /*lo guardo en el archivo al final  "a+"*/
54         if ( (f_fsc = fopen(name_f_fsc,"a+"))==NULL ) return -1;
55         fwrite(&reg,sizeof(EMUFS_FSC),1,f_fsc);
56         fclose(f_fsc);
57         return 0;
58 }
59
60 /* busca el bloque y le resta fs de espacio libre */
61 int emufs_fsc_actualizar(EMUFS *emu, int num_bloque, int fs)
62 {
63         FILE *f_fsc;
64         EMUFS_FSC reg;
65         char name_f_fsc[255];
66         
67         strcpy(name_f_fsc,emu->nombre);
68         strcat(name_f_fsc, EMUFS_FSC_EXT);
69
70         /*busco el bloque que modifique*/
71         if ( (f_fsc = fopen(name_f_fsc,"r+")) == NULL) return -1; 
72         while ( !feof(f_fsc) ){
73                 if ( fread(&reg,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue;
74                 if ( reg.block == num_bloque ){
75                         reg.free_space = fs;
76                         fseek(f_fsc,-sizeof(EMUFS_FSC),SEEK_CUR);
77                         fwrite(&reg,sizeof(EMUFS_FSC),1,f_fsc);
78                         break;
79                 }
80         }
81         fclose(f_fsc);
82         return 0;
83 }
84
85 /* me devuelve el ID del bloque donde quepa un registro, y guarda en fs el espacio libre que queda en el bloque */
86 int emufs_fsc_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs)
87 {
88         FILE *f_fsc;
89         EMUFS_FSC reg;
90         char name_f_fsc[255];
91         
92         strcpy(name_f_fsc,emu->nombre);
93         strcat(name_f_fsc, EMUFS_FSC_EXT);
94
95         if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
96
97         /* Inicializo la estructura para evitar que si el archivo esta vacio
98          * el resultado sea correcto
99          */
100         reg.block = -1;
101         *fs = emu->tam_bloque;
102         while( !feof(f_fsc) ){
103                 if (fread(&reg,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue;
104                 if ( reg.free_space >= tam+sizeof(int)) 
105                         break;
106                 else {
107                         reg.block = -1;
108                         *fs = emu->tam_bloque;
109                 }
110         }
111         
112         fclose(f_fsc);
113         if (reg.block != -1)
114                 *fs = reg.free_space;
115         return reg.block;
116 }
117
118 int emufs_fsc_get_fs(EMUFS *emu, int num_bloque)
119 {
120         FILE *f_fsc;
121         EMUFS_FSC reg;
122         char name_f_fsc[255];
123         
124         strcpy(name_f_fsc,emu->nombre);
125         strcat(name_f_fsc, EMUFS_FSC_EXT);
126
127         if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
128
129         while ( !feof(f_fsc) ){
130                 if ( fread(&reg,sizeof(EMUFS_FSC),1,f_fsc) != 1 ) continue;
131                 if ( reg.block == num_bloque )
132                         break;
133         }
134                 
135         fclose(f_fsc);
136         return reg.free_space;
137 }