]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/fsc.c
Cambios Realizados (son varios, read carefuly):
[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 /* Crea un archivo de Gaps o Espacio Libre en Bloque */
43 int emufs_fsc_crear(EMUFS* efs)
44 {
45         return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_FSC_EXT);
46 }
47
48 /* Agrega un registro al archivo de espacios libres. */
49 int emufs_fsc_agregar(EMUFS *emu, EMUFS_BLOCK_ID n_Marker, EMUFS_FREE n_FreeSpace)
50 {
51         FILE *f_fsc;
52         EMUFS_FSC reg;
53         char name_f_fsc[255];
54         
55         strcpy(name_f_fsc,emu->nombre);
56         strcat(name_f_fsc, EMUFS_FSC_EXT);
57         
58         /* Cargo el registro */
59         reg.n_Marker = n_Marker;
60         reg.n_FreeSpace = n_FreeSpace;
61
62         /* Lo guardo en el archivo al final "a+"*/
63         if ( (f_fsc = fopen(name_f_fsc,"a+"))==NULL ) return -1;
64         fwrite(&reg,sizeof(EMUFS_FSC),1,f_fsc);
65         fclose(f_fsc);
66         return 0;
67 }
68
69 /* Objetivo: Actualiza un registro de espacio libre de acorde al FType */
70 int emufs_fsc_actualizar(EMUFS *emu, EMUFS_BLOCK_ID n_Marker, EMUFS_FREE n_FreeSpace)
71 {
72         FILE *f_fsc;
73         EMUFS_FSC reg;
74         char name_f_fsc[255];
75         
76         strcpy(name_f_fsc,emu->nombre);
77         strcat(name_f_fsc, EMUFS_FSC_EXT);
78
79         /*busco el bloque o gap que modifique*/
80     if ( (f_fsc = fopen(name_f_fsc,"r+")) == NULL) return -1; 
81         while ( !feof(f_fsc) ){
82                 if ( fread(&reg,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue;
83                 if ( reg.n_Marker == n_Marker ){
84                         reg.n_FreeSpace = n_FreeSpace;
85                         fseek(f_fsc,-sizeof(EMUFS_FSC),SEEK_CUR);
86                         fwrite(&reg,sizeof(EMUFS_FSC),1,f_fsc);
87                         break;
88                 }
89         }
90         fclose(f_fsc);
91         return 0;
92 }
93
94 /* Me devuelve el ID del bloque u Offset del Gap donde quepa un registro, y guarda en n_FreeSpace el espacio libre actualizado */
95 EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *emu, EMUFS_FREE n_RegSize, EMUFS_FREE *n_FreeSpace)
96 {
97         FILE *f_fsc;
98         EMUFS_FSC reg;
99         char name_f_fsc[255];
100         unsigned short int b_Found = 0;
101         
102         strcpy(name_f_fsc,emu->nombre);
103         strcat(name_f_fsc, EMUFS_FSC_EXT);
104
105         if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
106
107         /* Inicializamos la estructura para devolver algun valor en concreto */
108         /* en caso de que no se halle un espacio libre apropiado */
109         while(!feof(f_fsc) && !b_Found){
110                 if (fread(&reg,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue;
111                 if (reg.n_FreeSpace >= n_RegSize) b_Found = 1;
112         }
113         
114         /* Si salio por error o por fin de archivo y no encontro space... */
115         if (!b_Found) {
116           reg.n_Marker = -1;
117           *n_FreeSpace = emu->tam_bloque; 
118         }
119         else *n_FreeSpace = reg.n_FreeSpace;
120         
121         fclose(f_fsc);
122         return reg.n_Marker;
123 }
124
125 /* Devuelve el espacio libre de un Bloque o Gap dado */
126 EMUFS_FREE emufs_fsc_get_fs(EMUFS *emu, EMUFS_BLOCK_ID n_Marker)
127 {
128         FILE *f_fsc;
129         EMUFS_FSC reg;
130         char name_f_fsc[255];
131         
132         strcpy(name_f_fsc,emu->nombre);
133         strcat(name_f_fsc, EMUFS_FSC_EXT);
134
135         /* Busco el Bloque o Gap pedido y obtengo su espacio libre */
136         if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
137         while ( !feof(f_fsc) ){
138                 if ( fread(&reg,sizeof(EMUFS_FSC),1,f_fsc) != 1 ) continue;
139                 if ( reg.n_Marker == n_Marker )
140                         break;
141         }
142                 
143         fclose(f_fsc);
144         return reg.n_FreeSpace;
145 }