#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;
+ efs->leer_bloque_raw = emufs_tipo1_leer_bloque_raw;
efs->grabar_registro = emufs_tipo1_grabar_registro;
efs->borrar_registro = emufs_tipo1_borrar_registro;
efs->leer_registro = emufs_tipo1_leer_registro;
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);
return file_size;
}
+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 = 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);
+ (*size1) = (*size2) = (*size3) = efs->tam_bloque;
+}
+