X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/19dd8c73f1c094909dfe57cb607cc39d13779bf2..baf79a90e2addd39a342fcb910bbfdb6ee6623cf:/emufs/tipo2.c diff --git a/emufs/tipo2.c b/emufs/tipo2.c index 2e70d12..b2724e9 100644 --- a/emufs/tipo2.c +++ b/emufs/tipo2.c @@ -86,7 +86,7 @@ void *emufs_tipo2_leer_registro(EMUFS* efs, EMUFS_REG_ID id_reg, EMUFS_REG_SIZE* *err = EMUFS_ERROR_CANT_OPEN_FILE; return NULL; } - fseek(f_data,reg_offset+sizeof(EMUFS_REG_ID),0); + fseek(f_data,reg_offset+sizeof(EMUFS_REG_ID),SEEK_SET); fread(reg_size,sizeof(EMUFS_REG_SIZE),1,f_data); registro = (char*)malloc(*reg_size); fread(registro,*reg_size,1,f_data); @@ -318,6 +318,7 @@ void emufs_tipo2_compactar(EMUFS *efs) /* Obtengo la cantidad de gaps */ if ( (fscfile = fopen(name_ffsc,"rb")) == NULL){ PERR("No se pudo abrir el archivo"); + fclose(datfile); return; } fseek(fscfile,0,SEEK_END); @@ -453,10 +454,42 @@ int emufs_tipo2_updateidx(EMUFS *efs) return 0; } -void* emufs_tipo2_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID id, EMUFS_REG_SIZE *size, int *pos) +void* emufs_tipo2_leer_registro_raw(EMUFS *efs, EMUFS_REG_ID id, EMUFS_REG_SIZE *size, int *pos) { - (*size) = 0; - (*pos) = 0; - PERR("IMPLEMENTAME CABRON"); - return NULL; + FILE* f_data; + char *registro; /* registro a leer */ + char name_f[255]; + EMUFS_OFFSET reg_offset; /* offset donde se encuentra el registro */ + + strcpy(name_f,efs->nombre); + strcat(name_f,".dat"); + + /* Obtenemos la posicion del registro en el .dat */ + reg_offset = emufs_idx_buscar_registro(efs, id); + if (reg_offset == EMUFS_NOT_FOUND) { + PERR("Registro no encontrado"); + return NULL; + } + + /* Levantamos el registro */ + if ((f_data = fopen(name_f, "rb")) == NULL) { + PERR("No se puede abrir archivo"); + return NULL; + } + fseek(f_data,reg_offset+sizeof(EMUFS_REG_ID), SEEK_SET); + fread(size,sizeof(EMUFS_REG_SIZE),1,f_data); + registro = (char*)malloc(*size+sizeof(EMUFS_REG_ID)+sizeof(EMUFS_REG_SIZE)+100); + if (reg_offset >= 50) { + fseek(f_data, reg_offset - 50, SEEK_SET); + (*pos) = 50; + } else { + /* Si no hay 50 antes mio, estoy cerca del 0! */ + (*pos) = reg_offset; + fseek(f_data, 0, SEEK_SET); + } + (*size) += sizeof(EMUFS_REG_ID)+sizeof(EMUFS_REG_SIZE)+100; + fread(registro,*size, 1,f_data); + fclose(f_data); + + return registro; }