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