X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Foutput%2Fjournal.c;h=5c84a5f84ee5b1fffa5e37d67a8667d6199076f5;hb=0343d5554074609ed2907035febd9f49f809b6a8;hp=6b7332771c0f5e7727ffe631c04d11e1ab63a5ac;hpb=ddb7b52128d8f1f54d9632dc3a15c7869e0fbcce;p=pspp diff --git a/src/output/journal.c b/src/output/journal.c index 6b7332771c..5c84a5f84e 100644 --- a/src/output/journal.c +++ b/src/output/journal.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2007, 2010 Free Software Foundation, Inc. + Copyright (C) 2007, 2010, 2012 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,12 +24,12 @@ #include "data/file-name.h" #include "libpspp/cast.h" +#include "libpspp/message.h" #include "libpspp/str.h" #include "output/driver-provider.h" #include "output/message-item.h" #include "output/text-item.h" -#include "gl/error.h" #include "gl/fwriteerror.h" #include "gl/xalloc.h" @@ -64,7 +64,8 @@ journal_close (void) if (journal != NULL && journal->file != NULL) { if (fwriteerror (journal->file)) - error (0, errno, _("error writing \"%s\""), journal_file_name); + msg_error (errno, _("error writing output file `%s'"), + journal_file_name); journal->file = NULL; } } @@ -86,16 +87,22 @@ journal_output (struct journal_driver *j, const char *s) { if (j->file == NULL) { - j->file = fopen (journal_file_name, "a"); + j->file = fopen (journal_get_file_name (), "a"); if (j->file == NULL) { - error (0, errno, _("%s: open failed"), journal_file_name); + msg_error (errno, _("error opening output file `%s'"), + journal_get_file_name ()); output_driver_destroy (&j->driver); return; } } fprintf (j->file, "%s\n", s); + + /* Flush the journal in case the syntax we're about to write + causes a crash. Having the syntax already written to disk + makes postmortem analysis of the problem possible. */ + fflush (j->file); } static void @@ -137,13 +144,6 @@ journal_enable (void) { if (journal == NULL) { - /* If no journal file name is configured, use the default. */ - if (journal_file_name == NULL) - { - const char *output_path = default_output_path (); - journal_file_name = xasprintf ("%s%s", output_path, "pspp.jnl"); - } - /* Create journal driver. */ journal = xzalloc (sizeof *journal); output_driver_init (&journal->driver, &journal_class, "journal", @@ -164,6 +164,13 @@ journal_disable (void) output_driver_destroy (&journal->driver); } +/* Returns true if journaling is enabled, false otherwise. */ +bool +journal_is_enabled (void) +{ + return journal != NULL; +} + /* Sets the name of the journal file to FILE_NAME. */ void journal_set_file_name (const char *file_name) @@ -172,3 +179,16 @@ journal_set_file_name (const char *file_name) free (journal_file_name); journal_file_name = xstrdup (file_name); } + +/* Returns the name of the journal file. The caller must not modify or free + the returned string. */ +const char * +journal_get_file_name (void) +{ + if (journal_file_name == NULL) + { + const char *output_path = default_output_path (); + journal_file_name = xasprintf ("%s%s", output_path, "pspp.jnl"); + } + return journal_file_name; +}