- /*grabo el id en el bloque*/
- memcpy(bloque,&ID_aux,sizeof(EMUFS_REG_ID));
- /*grabo el registro en el bloque*/
- memcpy(bloque+sizeof(EMUFS_REG_ID),ptr,emu->tam_reg);
- /* me paro al final del archivo */
- fseek(file, 0, SEEK_END);
- /* grabo el bloque en el final del archivo */
- fwrite(bloque,emu->tam_bloque,1,file);
- /*actualizo el archivo de espacios libres*/
- /*tengo que buscar la cantidad de bloques que existen*/
- /*me paro al principio salteando el encabezado del archivo*/
- fseek(file, 0, SEEK_END); /* Me paro al final */
- cant = (ftell(file)-(sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE))) / emu->tam_bloque;
- cant--; /* Resto uno porque el numero de bloque debe empezar en 0 */
- fclose(file);
- num_bloque = cant;
- /* grabo el nuevo registro en el archivo de espacios libres */
- if ( emufs_fsc_agregar(emu, num_bloque, emu->tam_bloque - emu->tam_reg - sizeof(EMUFS_REG_ID)) != 0 ) {
- free(bloque);
- return -1;
+ /* El free esta al final de la funcion! */
+ bloque = (char*)malloc(emu->tam_bloque);
+ for (i=0; i<cant_bloques; i++) {
+ /*crear un nuevo bloque en memoria */
+ memset(bloque, 0, emu->tam_bloque);
+ /* grabar el registro al principio del bloque */
+ /*grabo el id en el bloque*/
+ memcpy(bloque,&ID_aux,sizeof(EMUFS_REG_ID));
+ /*grabo el registro en el bloque*/
+ if ( cant_bloques == 1 ){
+ memcpy(bloque+sizeof(EMUFS_REG_ID),ptr,emu->tam_reg);
+ } else {
+ if ( cant_bloques-1 == i )
+ resto = emu->tam_reg - i*(emu->tam_bloque - sizeof(EMUFS_REG_ID));
+ memcpy(bloque+sizeof(EMUFS_REG_ID),((char*)ptr)+i*(emu->tam_bloque-sizeof(EMUFS_REG_ID)),resto);
+ }
+ /* me paro al final del archivo */
+ fseek(file, 0, SEEK_END);
+ /* grabo el bloque en el final del archivo */
+ fwrite(bloque,emu->tam_bloque,1,file);
+ /*actualizo el archivo de espacios libres*/
+ /*tengo que buscar la cantidad de bloques que existen*/
+ fseek(file, 0, SEEK_END); /* Me paro al final */
+ cant = (ftell(file)-(sizeof(EMUFS_Tipo)+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_BLOCK_SIZE))) / emu->tam_bloque;
+ cant--; /* Resto uno porque el numero de bloque debe empezar en 0 */
+ num_bloque = cant;
+
+ if (i == 0) {
+ /* Tengo que agregar el primer bloque en IDX */
+ if ( emufs_idx_existe_id(emu,ID_aux) != 0){
+ emufs_idx_actualizar(emu,ID_aux,num_bloque);
+ } else {
+ if ( emufs_idx_agregar(emu, ID_aux, num_bloque) != 0 ){
+ free(bloque);
+ return -1;
+ }
+ }
+ }
+ /* grabo el nuevo registro en el archivo de espacios libres */
+ if ( emu->tam_bloque > emu->tam_reg ) resto = emu->tam_reg;
+ if ( emufs_fsc_agregar(emu, num_bloque, emu->tam_bloque - resto - sizeof(EMUFS_REG_ID)) != 0 ) {
+ fclose(file);
+ free(bloque);
+ return -1;
+ }