1 /* vim: set noexpandtab tabstop=4 shiftwidth=4:
2 *----------------------------------------------------------------------------
4 *----------------------------------------------------------------------------
5 * This file is part of emufs.
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
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
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 *----------------------------------------------------------------------------
32 * Archivo para administrar el espacio libre disponible.
34 * Implementación del archivo para administrar el espacio libre disponible.
42 /* Crea un archivo de Gaps o Espacio Libre en Bloque */
43 int emufs_fsc_crear(EMUFS* efs)
45 return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_FSC_EXT);
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)
55 strcpy(name_f_fsc,emu->nombre);
56 strcat(name_f_fsc, EMUFS_FSC_EXT);
58 /* Cargo el registro */
59 reg.n_marker = n_marker;
60 reg.n_freespace = n_freespace;
62 /* Lo guardo en el archivo al final "a+"*/
63 if ( (f_fsc = fopen(name_f_fsc,"a+"))==NULL ) return -1;
64 fwrite(®,sizeof(EMUFS_FSC),1,f_fsc);
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)
76 strcpy(name_f_fsc,emu->nombre);
77 strcat(name_f_fsc, EMUFS_FSC_EXT);
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(®,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(®,sizeof(EMUFS_FSC),1,f_fsc);
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)
100 unsigned short int b_Found = 0;
102 strcpy(name_f_fsc,emu->nombre);
103 strcat(name_f_fsc, EMUFS_FSC_EXT);
105 if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1;
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(®,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue;
111 if (reg.n_freespace >= n_RegSize) b_Found = 1;
114 /* Si salio por error o por fin de archivo y no encontro space... */
117 *n_freespace = emu->tam_bloque;
119 else *n_freespace = reg.n_freespace;
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)
130 char name_f_fsc[255];
132 strcpy(name_f_fsc,emu->nombre);
133 strcat(name_f_fsc, EMUFS_FSC_EXT);
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(®,sizeof(EMUFS_FSC),1,f_fsc) != 1 ) continue;
139 if ( reg.n_marker == n_marker )
144 return reg.n_freespace;