+ efs->grabar_registro = emufs_tipo2_grabar_registro;
+ efs->borrar_registro = emufs_tipo2_borrar_registro;
+ efs->leer_registro = emufs_tipo2_leer_registro;
+
+ return 0;
+}
+
+/* Lee y devuelve un registro de un archivo del Tipo 2. */
+void *emufs_tipo2_leer_registro(EMUFS* efs, EMUFS_REG_ID id_reg, EMUFS_REG_SIZE* reg_size, int *err)
+{
+ 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_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 */
+ }
+ fseek(f_data,reg_offset+sizeof(EMUFS_REG_ID),0);
+ fread(reg_size,sizeof(EMUFS_REG_SIZE),1,f_data);
+ registro = (char*)malloc(*reg_size);
+ fread(registro,*reg_size,1,f_data);
+ fclose(f_data);
+
+ return registro;
+}
+
+/* Grabar un registro en un archivo del Tipo 2. */
+EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *efs, void *ptr, EMUFS_REG_SIZE reg_size, int* err)
+{
+ EMUFS_REG_ID id_reg;
+ EMUFS_FREE freespace;
+ EMUFS_OFFSET wrt_offset,reg_offset;
+ unsigned long int fisic_size;