[gobject-introspection] Bug 577534 - Use rename to write new typelibs, instead of in-place overwrite
- From: Colin Walters <walters src gnome org>
- To: svn-commits-list gnome org
- Subject: [gobject-introspection] Bug 577534 - Use rename to write new typelibs, instead of in-place overwrite
- Date: Tue, 9 Jun 2009 14:03:37 -0400 (EDT)
commit 87db94d98c133998f4f8156719256bbeedfdd5c0
Author: Colin Walters <walters verbum org>
Date: Tue Jun 9 14:03:47 2009 -0400
Bug 577534 - Use rename to write new typelibs, instead of in-place overwrite
This avoids having processes with the typelibs currently open exploding
immediately.
---
tools/compiler.c | 38 +++++++++++++++++++++++++++-----------
1 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/tools/compiler.c b/tools/compiler.c
index 6c6bae6..7e0a600 100644
--- a/tools/compiler.c
+++ b/tools/compiler.c
@@ -23,6 +23,7 @@
#include <glib.h>
#include <glib/gstdio.h>
+#include <gio/gio.h>
#ifdef G_OS_WIN32
#include <io.h>
@@ -97,34 +98,38 @@ write_out_typelib (gchar *prefix,
{
FILE *file;
gsize written;
+ GFile *file_obj;
+ gchar *filename;
+ GFile *tmp_file_obj;
+ gchar *tmp_filename;
+ GError *error = NULL;
if (output == NULL)
{
file = stdout;
+ filename = NULL;
+ tmp_filename = NULL;
#ifdef G_OS_WIN32
setmode (fileno (file), _O_BINARY);
#endif
}
else
{
- gchar *filename;
-
if (prefix)
filename = g_strdup_printf ("%s-%s", prefix, output);
else
filename = g_strdup (output);
- file = g_fopen (filename, "wb");
+ file_obj = g_file_new_for_path (filename);
+ tmp_filename = g_strdup_printf ("%s.tmp", filename);
+ tmp_file_obj = g_file_new_for_path (tmp_filename);
+ file = g_fopen (tmp_filename, "wb");
if (file == NULL)
{
g_fprintf (stderr, "failed to open '%s': %s\n",
- filename, g_strerror (errno));
- g_free (filename);
-
- return;
+ tmp_filename, g_strerror (errno));
+ goto out;
}
-
- g_free (filename);
}
if (!code)
@@ -133,7 +138,7 @@ write_out_typelib (gchar *prefix,
if (written < typelib->len) {
g_error ("ERROR: Could not write the whole output: %s",
strerror(errno));
- return;
+ goto out;
}
}
else
@@ -146,7 +151,18 @@ write_out_typelib (gchar *prefix,
}
if (output != NULL)
- fclose (file);
+ fclose (file);
+ if (tmp_filename != NULL)
+ {
+ if (!g_file_move (tmp_file_obj, file_obj, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error))
+ {
+ g_error ("ERROR: failed to rename %s to %s: %s", tmp_filename, filename, error->message);
+ g_clear_error (&error);
+ }
+ }
+out:
+ g_free (filename);
+ g_free (tmp_filename);
}
GLogLevelFlags logged_levels;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]