]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/did.c
* Termino Ver bloques para :
[z.facultad/75.06/emufs.git] / emufs / did.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:  jue abr  8 18:07:57 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  * Manejo de archivos de índices de registros borrados (reutilizables).
33  * 
34  * Implementación del manejo de archivos de índices de registros borrados
35  * (reutilizables).
36  *
37  */
38
39 #include "did.h"
40 #include <unistd.h>
41 #include <sys/types.h>
42 #include <string.h>
43
44 int emufs_did_crear(EMUFS* efs)
45 {
46         return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_DID_EXT);
47 }
48
49 EMUFS_REG_ID emufs_did_get_last(EMUFS *efs, int* err)
50 {
51         FILE *f_did;
52         EMUFS_REG_ID n_regid;
53         EMUFS_OFFSET n_offset;
54         char name_f_did[255];
55         long pos;
56         
57         strcpy(name_f_did, efs->nombre);
58         strcat(name_f_did, EMUFS_DID_EXT);
59         
60         if ((f_did = fopen(name_f_did, "rb")) == NULL) {
61                 PERR("No se puede abrir archivo");
62                 *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
63                 return EMUFS_NOT_FOUND;
64         }
65         if (fseek(f_did, 0l, SEEK_END)) {
66                 PERR("No se pudo hacer fseek()");
67                 fclose(f_did);
68                 *err = 8; /* EMUFS_ERROR_SEEK_FILE */
69                 return EMUFS_NOT_FOUND;
70         }
71         
72         if ((pos = ftell(f_did)) > 0){
73                 /* si el archivo no esta vacio es porque hay un nro disponible*/
74                 if (fseek(f_did, -sizeof(EMUFS_REG_ID), SEEK_END)) {
75                         PERR("No se pudo hacer fseek()");
76                         fclose(f_did);
77                         *err = 8; /* EMUFS_ERROR_SEEK_FILE */
78                         return EMUFS_NOT_FOUND;
79                 }
80                 /* leo el ultimo numero */
81                 if (fread(&n_regid, sizeof(EMUFS_REG_ID), 1, f_did) != 1) {
82                         fclose(f_did);
83                         PERR("Error al leer did");
84                         *err = 3; /* EMUFS_ERROR_FILE_READ */
85                         return EMUFS_NOT_FOUND;
86                 }
87                 /* voy al final */
88                 if (fseek(f_did, 0l, SEEK_END)) {
89                         PERR("No se pudo hacer fseek()");
90                         fclose(f_did);
91                         *err = 8; /* EMUFS_ERROR_SEEK_FILE */
92                         return EMUFS_NOT_FOUND;
93                 }
94                 /* mido el tamaño del archivo */
95                 if ((n_offset = ftell(f_did)) == -1) {
96                         PERR("No se pudo hacer ftell()");
97                         fclose(f_did);
98                         *err = 9; /* EMUFS_ERROR_TELL_FILE */
99                         return EMUFS_NOT_FOUND;
100                 }
101                 fclose(f_did);
102                 /* lo trunco */
103                 if (truncate(name_f_did, n_offset - sizeof(EMUFS_REG_ID))) {
104                         PERR("No se pudo truncar el archivo did");
105                         *err = 10; /* EMUFS_ERROR_TRUNCATE_FILE */
106                         return EMUFS_NOT_FOUND;
107                 }
108         } else if (!pos) {
109                 fclose(f_did);
110                 /* si el archivo esta vacio */
111                 n_regid = EMUFS_NOT_FOUND;
112         } else {
113                 PERR("No se pudo hacer ftell()");
114                 fclose(f_did);
115                 *err = 9; /* EMUFS_ERROR_TELL_FILE */
116                 return EMUFS_NOT_FOUND;
117         }
118         return n_regid;
119 }
120
121 int emufs_did_agregar(EMUFS *efs, EMUFS_REG_ID n_regid)
122 {
123         FILE *f_did;
124         char name_f_did[255];
125         
126         strcpy(name_f_did, efs->nombre);
127         strcat(name_f_did,  EMUFS_DID_EXT);
128         
129         if ( (f_did = fopen(name_f_did,"a+")) == NULL) return -1;
130         fwrite(&n_regid, sizeof(EMUFS_REG_ID), 1, f_did);
131         fclose(f_did);
132         
133         return 0;
134 }
135