diff --git a/src/libpspp/ext-array.c b/src/libpspp/ext-array.c index 57ff8e4..682e677 100644 --- a/src/libpspp/ext-array.c +++ b/src/libpspp/ext-array.c @@ -36,6 +36,7 @@ #include "gettext.h" #define _(msgid) gettext (msgid) + struct ext_array { FILE *file; /* Underlying file. */ @@ -56,6 +57,7 @@ ext_array_create (void) if (ea->file == NULL) error (0, errno, _("failed to create temporary file")); ea->position = 0; + fprintf (stderr, "%s:%d Sizeof off_t: %d\n", __FILE__, __LINE__, sizeof (off_t)); return ea; } @@ -107,6 +109,7 @@ do_seek (const struct ext_array *ea_, off_t offset) static bool do_read (const struct ext_array *ea_, void *buffer, size_t bytes) { + off_t old_pos ; struct ext_array *ea = CONST_CAST (struct ext_array *, ea_); assert (!ext_array_error (ea)); @@ -120,7 +123,10 @@ do_read (const struct ext_array *ea_, void *buffer, size_t bytes) NOT_REACHED (); return false; } + old_pos = ea->position; ea->position += bytes; + if (ea->position < old_pos) + fprintf (stderr, "%s:%d ea->position has overflowed\n", __FILE__, __LINE__); return true; } @@ -131,13 +137,20 @@ do_read (const struct ext_array *ea_, void *buffer, size_t bytes) static bool do_write (struct ext_array *ea, const void *buffer, size_t bytes) { + off_t old_pos; + int r = 0; assert (!ext_array_error (ea)); - if (bytes > 0 && fwrite (buffer, bytes, 1, ea->file) != 1) + + if (bytes > 0 && (r = fwrite (buffer, bytes, 1, ea->file)) != 1) { - error (0, errno, _("writing to temporary file")); + error (0, errno, _("writing to temporary file (Stream %p, %d items written)"), ea->file, r); return false; } + old_pos = ea->position; ea->position += bytes; + if (ea->position < old_pos) + fprintf (stderr, "%s:%d ea->position has overflowed\n", __FILE__, __LINE__); + return true; } diff --git a/src/libpspp/temp-file.c b/src/libpspp/temp-file.c index d121cb9..adae44e 100644 --- a/src/libpspp/temp-file.c +++ b/src/libpspp/temp-file.c @@ -105,11 +105,16 @@ create_temp_file (void) file_name = xasprintf ("%s/%d", temp_dir->dir_name, idx++); register_temp_file (temp_dir, file_name); + stream = fopen_temp (file_name, "wb+"); + fprintf (stderr, "%s:%d Tmpfile \"%s\"; Stream %p\n", __FILE__, __LINE__, file_name, stream); if (stream == NULL) unregister_temp_file (temp_dir, file_name); else - setvbuf (stream, NULL, _IOFBF, 65536); + { + int x = setvbuf (stream, NULL, _IOFBF, 65536); + fprintf (stderr, "%s:%d setvbuf result %d\n", __FILE__, __LINE__, x); + } hmapx_insert (&map, file_name, hash_pointer (stream, 0)); @@ -124,6 +129,7 @@ close_temp_file (FILE *file) { struct hmapx_node *node = hmapx_first_with_hash (&map, hash_pointer (file, 0)); char *fn = node->data; + fprintf (stderr, "%s:%d Closing and removing tempfile %s %p\n", __FILE__, __LINE__, fn, file); fclose_temp (file); cleanup_temp_file (temp_dir, fn); hmapx_delete (&map, node);