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