]> git.llucax.com Git - z.facultad/75.06/jacu.git/blobdiff - src/vfile/vfile.c
Bugfixes.
[z.facultad/75.06/jacu.git] / src / vfile / vfile.c
index 1ca56074a211cbf8bac00dd2d665c8868c36585a..aafb8514715b07632dd4a979d66e314eab0e742f 100644 (file)
@@ -77,6 +77,7 @@ VFILE* vfopen(const char* path, const char* mode, long volsize)
        }
        /* Abrimos primer archivo de los volumenes. */
        vfp->currvol = -1;
        }
        /* Abrimos primer archivo de los volumenes. */
        vfp->currvol = -1;
+       vfp->lastvol = 0;
        if (vfvol_open_next(vfp)) /* no se pudo abrir el primer volumen. */
        {
                PERR("vfopen: no se pudo abrir archivo inicial!");
        if (vfvol_open_next(vfp)) /* no se pudo abrir el primer volumen. */
        {
                PERR("vfopen: no se pudo abrir archivo inicial!");
@@ -136,15 +137,23 @@ size_t vfwrite(const void *ptr, size_t size, size_t nmemb, VFILE* vfp)
 
 int vfvol_close(VFILE* vfp)
 {
 
 int vfvol_close(VFILE* vfp)
 {
-       /* Si es de escritura tengo que guardar la cabecera. */
-       if (vfp->mode == VFWRITE)
+       /* Si es de escritura y el último guardo la cabecera. */
+       if (vfp->mode == VFWRITE && vfp->lastvol)
        {
                int ret;
                PERR("vfvol_close: modo == VFWRITE");
                /* Me posiciono al principio del archivo. */
        {
                int ret;
                PERR("vfvol_close: modo == VFWRITE");
                /* Me posiciono al principio del archivo. */
-               if ((ret = fseek(vfp->fp, 0l, SEEK_SET))) return ret; /* fseek error. */
+               if ((ret = fseek(vfp->fp, 0l, SEEK_SET)))
+               {
+                       PERR("vfvol_close: fseek error");
+                       return ret; /* fseek error. */
+               }
                /* Guardo cabecera para indicar si es el último volumen o no. */
                /* Guardo cabecera para indicar si es el último volumen o no. */
-               if ((ret = fputc(vfp->lastvol, vfp->fp))) return ret; /* fputc error. */
+               if ((ret = fputc(vfp->lastvol, vfp->fp)) == EOF)
+               {
+                       PERR("vfvol_close: fputc error");
+                       return ret; /* fputc error. */
+               }
        }
        return fclose(vfp->fp);
 }
        }
        return fclose(vfp->fp);
 }
@@ -175,11 +184,11 @@ int vfvol_open_next(VFILE* vfp)
        if (volname) free(volname);
        /* Si es para lectura, me fijo si es el últio a leer. */
        if (vfp->mode == VFREAD) vfp->lastvol = fgetc(vfp->fp);
        if (volname) free(volname);
        /* Si es para lectura, me fijo si es el últio a leer. */
        if (vfp->mode == VFREAD) vfp->lastvol = fgetc(vfp->fp);
-       /* Si es para escritura, guardo header dummy (supongo que es el último). */
+       /* Si es para escritura, guardo header por default (hay más volúmenes). */
        if (vfp->mode == VFWRITE)
        {
        if (vfp->mode == VFWRITE)
        {
-               vfp->room = vfp->volsize;
-               return !fputc(1, vfp->fp);
+               vfp->room = vfp->volsize; /* tengo todo el espacio disponible. */
+               return fputc(vfp->lastvol, vfp->fp) == EOF;
        }
        return 0;
 }
        }
        return 0;
 }