From: Leandro Lucarella Date: Sun, 18 Apr 2004 04:14:52 +0000 (+0000) Subject: Se agrega un archivo con codigos de error. X-Git-Tag: svn_import_r684~389 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/d4f0853a534fc4283fa38cf4bb4a70cc614283ec?ds=sidebyside Se agrega un archivo con codigos de error. --- diff --git a/emufs/did.c b/emufs/did.c index 663feef..556f07b 100644 --- a/emufs/did.c +++ b/emufs/did.c @@ -37,6 +37,7 @@ */ #include "did.h" +#include "error.h" #include #include #include @@ -59,13 +60,13 @@ EMUFS_REG_ID emufs_did_get_last(EMUFS *efs, int* err) 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; } @@ -74,35 +75,35 @@ EMUFS_REG_ID emufs_did_get_last(EMUFS *efs, int* err) 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) { @@ -112,7 +113,7 @@ EMUFS_REG_ID emufs_did_get_last(EMUFS *efs, int* err) } 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; diff --git a/emufs/error.h b/emufs/error.h new file mode 100644 index 0000000..67f4394 --- /dev/null +++ b/emufs/error.h @@ -0,0 +1,57 @@ +/* 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 + * Ricardo Markiewicz + * Leandro Lucarella + *---------------------------------------------------------------------------- + * + * $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_ */ diff --git a/emufs/fsc.c b/emufs/fsc.c index 7e556bd..4aaaa17 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -36,6 +36,7 @@ */ #include "fsc.h" +#include "error.h" #include #include #include @@ -367,7 +368,7 @@ EMUFS_BLOCK_ID emufs_fsc_buscar_n_lugares(EMUFS* efs, size_t n, /* 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; } @@ -376,7 +377,7 @@ EMUFS_BLOCK_ID emufs_fsc_buscar_n_lugares(EMUFS* efs, size_t n, 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; } @@ -385,7 +386,7 @@ EMUFS_BLOCK_ID emufs_fsc_buscar_n_lugares(EMUFS* efs, size_t n, 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) { @@ -396,7 +397,7 @@ EMUFS_BLOCK_ID emufs_fsc_buscar_n_lugares(EMUFS* efs, size_t n, 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 */ diff --git a/emufs/idx.c b/emufs/idx.c index a8c76bb..bd20b63 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -37,6 +37,7 @@ #include "idx.h" #include "did.h" +#include "error.h" #include #include #include @@ -80,7 +81,7 @@ EMUFS_REG_ID emufs_idx_buscar_mayor_id_libre(EMUFS* emu, int* err) 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; } @@ -115,7 +116,7 @@ EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS *emu, EMUFS_REG_ID reg_id) 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; } diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 0db0f3a..f3fe8ee 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -39,6 +39,7 @@ #include "idx.h" #include "fsc.h" #include "did.h" +#include "error.h" #include #include #include @@ -86,7 +87,7 @@ int emufs_tipo1_inicializar(EMUFS* efs) * 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; @@ -119,7 +120,7 @@ void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, 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; } @@ -144,7 +145,7 @@ void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, /* 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) { @@ -161,7 +162,7 @@ void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, /* 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 */ @@ -255,7 +256,7 @@ void* emufs_tipo1_leer_registro_raw(EMUFS *efs, EMUFS_REG_ID id, EMUFS_REG_SIZE 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) */ @@ -266,24 +267,21 @@ void* emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, int *err) 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); @@ -327,7 +325,7 @@ EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* efs, void* reg, 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 */ @@ -615,7 +613,7 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block, 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, @@ -626,7 +624,7 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block, /* 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 */ @@ -668,7 +666,7 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block, 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; } @@ -676,11 +674,11 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block, 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) @@ -692,18 +690,18 @@ int emufs_tipo1_header_jump(FILE* fp) { 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, @@ -726,9 +724,8 @@ long emufs_tipo1_get_file_size(EMUFS* efs, int* err) 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); @@ -738,7 +735,7 @@ long emufs_tipo1_get_file_size(EMUFS* efs, int* err) 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); diff --git a/emufs/tipo1.h b/emufs/tipo1.h index 9297e86..946d36e 100644 --- a/emufs/tipo1.h +++ b/emufs/tipo1.h @@ -40,8 +40,12 @@ #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*); @@ -64,6 +68,9 @@ EMUFS_Estadisticas emufs_tipo1_leer_estadisticas(EMUFS*); /** 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_ */ diff --git a/emufs/tipo2.c b/emufs/tipo2.c index 87dd90e..92cb2a4 100644 --- a/emufs/tipo2.c +++ b/emufs/tipo2.c @@ -41,6 +41,7 @@ #include "idx.h" #include "fsc.h" #include "did.h" +#include "error.h" #include #include #include @@ -73,7 +74,6 @@ void *emufs_tipo2_leer_registro(EMUFS* efs, EMUFS_REG_ID id_reg, EMUFS_REG_SIZE* /* 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; @@ -82,8 +82,8 @@ void *emufs_tipo2_leer_registro(EMUFS* efs, EMUFS_REG_ID id_reg, EMUFS_REG_SIZE* /* 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); diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 0ba52bf..feb000f 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -36,6 +36,7 @@ */ #include "tipo3.h" +#include "error.h" #include #include #include @@ -64,9 +65,8 @@ void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, 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; } @@ -116,8 +116,8 @@ void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID ID, int* err) 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*/ @@ -129,16 +129,15 @@ void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID ID, int* err) 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; }