*/
#include "did.h"
+#include "error.h"
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
if ((f_did = fopen(name_f_did, "rb")) == NULL) {
PERR("No se puede abrir archivo");
- *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
+ *err = EMUFS_ERROR_CANT_OPEN_FILE;
return EMUFS_NOT_FOUND;
}
if (fseek(f_did, 0l, SEEK_END)) {
PERR("No se pudo hacer fseek()");
fclose(f_did);
- *err = 8; /* EMUFS_ERROR_SEEK_FILE */
+ *err = EMUFS_ERROR_SEEK_FILE;
return EMUFS_NOT_FOUND;
}
if (fseek(f_did, -sizeof(EMUFS_REG_ID), SEEK_END)) {
PERR("No se pudo hacer fseek()");
fclose(f_did);
- *err = 8; /* EMUFS_ERROR_SEEK_FILE */
+ *err = EMUFS_ERROR_SEEK_FILE;
return EMUFS_NOT_FOUND;
}
/* leo el ultimo numero */
if (fread(&n_regid, sizeof(EMUFS_REG_ID), 1, f_did) != 1) {
fclose(f_did);
PERR("Error al leer did");
- *err = 3; /* EMUFS_ERROR_FILE_READ */
+ *err = EMUFS_ERROR_FILE_READ;
return EMUFS_NOT_FOUND;
}
/* voy al final */
if (fseek(f_did, 0l, SEEK_END)) {
PERR("No se pudo hacer fseek()");
fclose(f_did);
- *err = 8; /* EMUFS_ERROR_SEEK_FILE */
+ *err = EMUFS_ERROR_SEEK_FILE;
return EMUFS_NOT_FOUND;
}
/* mido el tamaño del archivo */
if ((n_offset = ftell(f_did)) == -1) {
PERR("No se pudo hacer ftell()");
fclose(f_did);
- *err = 9; /* EMUFS_ERROR_TELL_FILE */
+ *err = EMUFS_ERROR_TELL_FILE;
return EMUFS_NOT_FOUND;
}
fclose(f_did);
/* lo trunco */
if (truncate(name_f_did, n_offset - sizeof(EMUFS_REG_ID))) {
PERR("No se pudo truncar el archivo did");
- *err = 10; /* EMUFS_ERROR_TRUNCATE_FILE */
+ *err = EMUFS_ERROR_TRUNCATE_FILE;
return EMUFS_NOT_FOUND;
}
} else if (!pos) {
} else {
PERR("No se pudo hacer ftell()");
fclose(f_did);
- *err = 9; /* EMUFS_ERROR_TELL_FILE */
+ *err = EMUFS_ERROR_TELL_FILE;
return EMUFS_NOT_FOUND;
}
return n_regid;
--- /dev/null
+/* vim: set noexpandtab tabstop=4 shiftwidth=4 wrap:
+ *----------------------------------------------------------------------------
+ * emufs
+ *----------------------------------------------------------------------------
+ * This file is part of emufs.
+ *
+ * emufs is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * emufs is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with emufs; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA 02111-1307 USA
+ *----------------------------------------------------------------------------
+ * Creado: dom abr 18 00:33:47 ART 2004
+ * Autores: Nicolás Dimov <sagardua@uolsinectis.com.ar>
+ * Ricardo Markiewicz <rmarkie@fi.uba.ar>
+ * Leandro Lucarella <llucare@fi.uba.ar>
+ *----------------------------------------------------------------------------
+ *
+ * $Id$
+ *
+ */
+
+/** \file
+ *
+ * Utilidades para el manejo de errores.
+ *
+ * En este archivo se encuentran definidas las constantes de error y otras
+ * utilidades destinadas a facilitar el manejo de errores en EMUFS.
+ *
+ */
+
+#ifndef _EMUFS_ERROR_H_
+#define _EMUFS_ERROR_H_
+
+/** Códigos de error. */
+typedef enum {
+ EMUFS_OK = 0, /**< Operación exitosa. */
+ EMUFS_ERROR_WRONG_ARGUMENT, /**< Se recibió un parámetro incorrecto. */
+ EMUFS_ERROR_OUT_OF_MEMORY, /**< No se pudo reservar memoria. */
+ EMUFS_ERROR_CANT_OPEN_FILE, /**< No se puede abrir un archivo. */
+ EMUFS_ERROR_FILE_READ, /**< Error al leer un archivo. */
+ EMUFS_ERROR_WRITE_FILE, /**< Error al escribir un archivo. */
+ EMUFS_ERROR_SEEK_FILE, /**< Error al posicionarse en un archivo. */
+ EMUFS_ERROR_TELL_FILE, /**< Error al obtener posición de un archivo. */
+ EMUFS_ERROR_TRUNCATE_FILE, /**< Error al truncar un archvio. */
+ EMUFS_ERROR_BLOCK_TOO_SMALL /**< El tamaño de bloque es muy pequeño. */
+} EMUFS_ERROR;
+
+#endif /* _EMUFS_ERROR_H_ */
*/
#include "fsc.h"
+#include "error.h"
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
/* chequeo que al menos se busque un lugar */
if (!n) {
PERR("Se debe buscar al menos un lugar");
- *err = 13; /* EMUFS_ERROR_WRONG_ARGUMENT */
+ *err = EMUFS_ERROR_WRONG_ARGUMENT;
return EMUFS_NOT_FOUND;
}
strcat(name_f_fsc, EMUFS_FSC_EXT);
if (!(f_fsc = fopen(name_f_fsc, "rb"))) {
PERR("No se puede abrir archivo");
- *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
+ *err = EMUFS_ERROR_CANT_OPEN_FILE;
return EMUFS_NOT_FOUND;
}
if ((fread(®, sizeof(EMUFS_FSC), 1, f_fsc) != 1)) {
if (feof(f_fsc)) break;
PERR("No se puede leer el archivo");
- *err = 3; /* EMUFS_ERROR_FILE_READ */
+ *err = EMUFS_ERROR_FILE_READ;
return EMUFS_NOT_FOUND;
}
if (reg.freespace >= reg_size) {
if (fread(®, sizeof(EMUFS_FSC), 1, f_fsc) != 1) {
if (feof(f_fsc)) break;
PERR("No se puede leer el archivo");
- *err = 3; /* EMUFS_ERROR_FILE_READ */
+ *err = EMUFS_ERROR_FILE_READ;
return EMUFS_NOT_FOUND;
}
/* no hay otro lugar consecutivo */
#include "idx.h"
#include "did.h"
+#include "error.h"
#include <stdlib.h>
#include <strings.h>
#include <unistd.h>
if ((f_idx = fopen(name_f_idx, "rb")) == NULL) {
PERR("No se puede abrir archivo");
- *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
+ *err = EMUFS_ERROR_CANT_OPEN_FILE;
return EMUFS_NOT_FOUND;
}
if ((f_idx = fopen(name_f_idx, "rb")) == NULL) {
PERR("No se puede abrir archivo");
- /* *err = 4; * EMUFS_ERROR_CANT_OPEN_FILE */
+ /* *err = EMUFS_ERROR_CANT_OPEN_FILE; */
return EMUFS_NOT_FOUND;
}
#include "idx.h"
#include "fsc.h"
#include "did.h"
+#include "error.h"
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
* mala */
if (efs->tam_bloque < (sizeof(EMUFS_TIPO1_REG_HEADER) * 2)) {
PERR("bloque demasiado chico");
- return 1000; /* EMUFS_ERROR_BLOCK_SIZE_TOO_SMALL */
+ return EMUFS_ERROR_BLOCK_TOO_SMALL;
}
/* Asigna punteros a funciones. */
efs->leer_bloque = emufs_tipo1_leer_bloque;
if (!(block = (char*) emufs_tipo1_leer_bloque(efs, block_id, err))) {
/* TODO Manejo de errores */
PERR("no se pudo reservar memoria");
- *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */
+ *err = EMUFS_ERROR_OUT_OF_MEMORY;
return NULL;
}
/* TODO Manejo de errores */
free(block);
PERR("No hay memoria");
- *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */
+ *err = EMUFS_ERROR_OUT_OF_MEMORY;
return NULL;
}
while (1) {
/* TODO Manejo de errores */
free(registro);
PERR("no se pudo reservar memoria");
- *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */
+ *err = EMUFS_ERROR_OUT_OF_MEMORY;
return NULL;
}
} else { /* se terminó de leer */
return registro;
}
-void* emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, int *err)
+void* emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, int* err)
{
FILE* file;
char* block; /* bloque leido (en donde está el registro a leer) */
if ((file = fopen(name_f, "r")) == NULL) {
PERR("No se puede abrir archivo");
- *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
- return NULL; /* FIXME ERROR */
+ *err = EMUFS_ERROR_CANT_OPEN_FILE;
+ return NULL;
}
emufs_tipo1_header_jump(file); /* salta cabeceras */
emufs_tipo1_block_jump(efs, file, block_id); /* salta bloques */
- /* FIXME: verificar que no se pase de fin de archivo*/
block = (char*) malloc(efs->tam_bloque);
if (block == NULL) {
- /* TODO Manejo de errores */
PERR("No hay memoria");
- *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */
+ *err = EMUFS_ERROR_OUT_OF_MEMORY;
return NULL;
}
if (fread(block, efs->tam_bloque, 1, file) != 1) {
- /* TODO Manejo de errores */
free(block);
PERR("Error al leer bloque");
- *err = 3; /* EMUFS_ERROR_FILE_READ */
+ *err = EMUFS_ERROR_FILE_READ;
return NULL;
}
fclose(file);
if (block == NULL) {
/* TODO Manejo de errores */
PERR("No hay memoria");
- *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */
+ *err = EMUFS_ERROR_OUT_OF_MEMORY;
return EMUFS_NOT_FOUND;
}
memset(block, 0, efs->tam_bloque); /* inicializa bloque */
if ((file = fopen(name_f, "r+b")) == NULL) {
/* TODO Manejo de errores */
PERR("Error al abrir archivo");
- *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
+ *err = EMUFS_ERROR_CANT_OPEN_FILE;
return EMUFS_NOT_FOUND;
}
/* Si es NOT_FOUND o mayor a la cantidad de bloques presentes,
/* TODO Manejo de errores */
PERR("No se pudo hacer fseek()");
fclose(file);
- *err = 8; /* EMUFS_ERROR_SEEK_FILE */
+ *err = EMUFS_ERROR_SEEK_FILE;
return EMUFS_NOT_FOUND;
}
/* Obtengo ID del bloque nuevo */
if (fwrite(block, efs->tam_bloque, 1, file) != 1) {
PERR("No se pudo escribir el archivo");
fclose(file);
- *err = 6; /* EMUFS_ERROR_WRITE_FILE */
+ *err = EMUFS_ERROR_WRITE_FILE;
return EMUFS_NOT_FOUND;
}
return block_id;
}
-EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID id,
- void *data, EMUFS_REG_SIZE size, int *error)
+EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS* efs, EMUFS_REG_ID id,
+ void *data, EMUFS_REG_SIZE size, int* err)
{
- emufs_tipo1_borrar_registro(emu, id);
- return emufs_tipo1_grabar_registro(emu, data, size, error);
+ emufs_tipo1_borrar_registro(efs, id);
+ return emufs_tipo1_grabar_registro(efs, data, size, err);
}
size_t emufs_tipo1_header_size(void)
{
if (fseek(fp, emufs_tipo1_header_size(), SEEK_CUR)) {
PERR("No se pudo hacer fseek()");
- return 8; /* EMUFS_ERROR_SEEK_FILE */
+ return EMUFS_ERROR_SEEK_FILE;
}
- return 0; /* EMUFS_OK */
+ return EMUFS_OK;
}
int emufs_tipo1_block_jump(EMUFS* efs, FILE* fp, EMUFS_BLOCK_ID block_count)
{
if (fseek(fp, block_count * efs->tam_bloque, SEEK_CUR)) {
PERR("No se pudo hacer fseek()");
- return 8; /* EMUFS_ERROR_SEEK_FILE */
+ return EMUFS_ERROR_SEEK_FILE;
}
- return 0; /* EMUFS_OK */
+ return EMUFS_OK;
}
void emufs_tipo1_escribir_reg_chunk_en_memoria(char* dst,
strcpy(name_f, efs->nombre);
strcat(name_f, ".dat");
if ((file = fopen(name_f, "ab")) == NULL) {
- /* TODO Manejo de errores */
PERR("Error al abrir archivo");
- *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
+ *err = EMUFS_ERROR_CANT_OPEN_FILE;
return 0;
}
file_size = ftell(file);
void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, char **anterior, char **siguiente, EMUFS_BLOCK_SIZE *size1, EMUFS_BLOCK_SIZE *size2, EMUFS_BLOCK_SIZE *size3)
{
- int err;
+ int err = 0;
(*actual) = emufs_tipo1_leer_bloque(efs, id, &err);
(*anterior) = emufs_tipo1_leer_bloque(efs, id-1, &err);
(*siguiente) = emufs_tipo1_leer_bloque(efs, id+1, &err);
#include "emufs.h"
-/** Inicializa un EMUFS para poder ser utilizada como un archivo tipo1. */
-int emufs_tipo1_inicializar(EMUFS*);
+/** Inicializa un EMUFS para poder ser utilizado como un archivo tipo1.
+ *
+ * \param efs Estructura a inicializar.
+ * \return Código de error o EMUFS_OK si no hubo error.
+ */
+int emufs_tipo1_inicializar(EMUFS* efs);
/** Lee el registro \c reg_id y devolviendo su contenido. */
void* emufs_tipo1_leer_registro(EMUFS*, EMUFS_REG_ID, EMUFS_REG_SIZE*, int*);
/** Método para compactar el archivo reorganizándolo físicamente */
void emufs_tipo1_compactar(EMUFS*);
-void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, char **anterior, char **siguiente, EMUFS_BLOCK_SIZE *size1, EMUFS_BLOCK_SIZE *size2, EMUFS_BLOCK_SIZE *size3);
+/** Lee un bloque y su contexto, en bruto (con cabeceras). */
+void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual,
+ char **anterior, char **siguiente, EMUFS_BLOCK_SIZE *size1,
+ EMUFS_BLOCK_SIZE *size2, EMUFS_BLOCK_SIZE *size3);
#endif /* _EMUFS_TIPO1_H_ */
#include "idx.h"
#include "fsc.h"
#include "did.h"
+#include "error.h"
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
/* Obtenemos la posicion del registro en el .dat */
reg_offset = emufs_idx_buscar_registro(efs, id_reg);
if (reg_offset == EMUFS_NOT_FOUND) {
- /* TODO Manejo de errores */
PERR("Registro no encontrado");
*err = EMUFS_NOT_FOUND;
return NULL;
/* Levantamos el registro */
if ((f_data = fopen(name_f, "rb")) == NULL) {
PERR("No se puede abrir archivo");
- *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
- return NULL; /* FIXME ERROR */
+ *err = EMUFS_ERROR_CANT_OPEN_FILE;
+ return NULL;
}
fseek(f_data,reg_offset+sizeof(EMUFS_REG_ID),0);
fread(reg_size,sizeof(EMUFS_REG_SIZE),1,f_data);
*/
#include "tipo3.h"
+#include "error.h"
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
registro = (char*) malloc(emu->tam_reg);
if (registro == NULL) {
- /* TODO Manejo de errores */
PERR("No hay memoria");
- *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */
+ *err = EMUFS_ERROR_OUT_OF_MEMORY;
return NULL;
}
if ((file = fopen(name_f, "r")) == NULL) {
PERR("No se pudo abrir el archivo de datos");
- *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */
- return NULL; /* FIXME ERROR */
+ *err = EMUFS_ERROR_CANT_OPEN_FILE;
+ return NULL;
}
fseek(file,sizeof(EMUFS_Tipo)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE),SEEK_SET);
/*FIXME: verificar que no se pase de fin de archivo*/
block = (char*) malloc(emu->tam_bloque);
if (block == NULL) {
- /* TODO Manejo de errores */
PERR("No hay memoria");
- *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */
+ *err = EMUFS_ERROR_OUT_OF_MEMORY;
return NULL;
}
if (fread(block, emu->tam_bloque, 1, file) != 1) {
/* TODO Manejo de errores */
free(block);
PERR("Error al leer bloque");
- *err = 3; /* EMUFS_ERROR_FILE_READ */
+ *err = EMUFS_ERROR_FILE_READ;
return NULL;
}