X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fpor-file-reader.c;h=8e6099f5d8ec5bed03ed9d19aca7b2ce32ac6b34;hb=4e30d33a680cceb0ac2ee3e78c94fdeb46ab2fcd;hp=e82e136167b9a06c006be699dd2929a03ddaf4b0;hpb=577c6ac9b93c494efdabc324365ec70a43f6d742;p=pspp-builds.git diff --git a/src/data/por-file-reader.c b/src/data/por-file-reader.c index e82e1361..8e6099f5 100644 --- a/src/data/por-file-reader.c +++ b/src/data/por-file-reader.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -136,12 +137,42 @@ warning (struct pfm_reader *r, const char *msg, ...) msg_emit (&m); } +/* Close and destroy R. + Returns false if an error was detected on R, true otherwise. */ +static bool +close_reader (struct pfm_reader *r) +{ + bool ok; + if (r == NULL) + return true; + + if (r->file) + { + if (fn_close (fh_get_file_name (r->fh), r->file) == EOF) + { + msg (ME, _("Error closing portable file \"%s\": %s."), + fh_get_file_name (r->fh), strerror (errno)); + r->ok = false; + } + r->file = NULL; + } + + if (r->fh != NULL) + fh_close (r->fh, "portable file", "rs"); + + ok = r->ok; + pool_destroy (r->pool); + + return ok; +} + /* Closes portable file reader R, after we're done with it. */ static void -por_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) +por_file_casereader_destroy (struct casereader *reader, void *r_) { struct pfm_reader *r = r_; - pool_destroy (r->pool); + if (!close_reader (r)) + casereader_force_error (reader); } /* Read a single character into cur_char. */ @@ -217,10 +248,8 @@ pfm_open_reader (struct file_handle *fh, struct dictionary **dict, pool = pool_create (); r = pool_alloc (pool, sizeof *r); r->pool = pool; - if (setjmp (r->bail_out)) - goto error; r->fh = fh; - r->file = pool_fopen (r->pool, fh_get_file_name (r->fh), "rb"); + r->file = fn_open (fh_get_file_name (r->fh), "rb"); r->line_length = 0; r->weight_index = -1; r->trans = NULL; @@ -229,7 +258,10 @@ pfm_open_reader (struct file_handle *fh, struct dictionary **dict, r->value_cnt = 0; r->ok = true; - /* Check that file open succeeded, prime reading. */ + if (setjmp (r->bail_out)) + goto error; + + /* Check that file open succeeded. */ if (r->file == NULL) { msg (ME, _("An error occurred while opening \"%s\" for reading " @@ -260,7 +292,7 @@ pfm_open_reader (struct file_handle *fh, struct dictionary **dict, &por_file_casereader_class, r); error: - pool_destroy (r->pool); + close_reader (r); dict_destroy (*dict); *dict = NULL; return NULL;