[telepathy-mission-control/master] Use g_file_set_contents
Alberto Mardegan
alberto.mardegan at nokia.com
Wed Jul 1 05:05:48 PDT 2009
Our implementation was buggy anyway, because it was not doing fflush()
before calling fsync().
Recent versions of glib have a g_file_set_contents() that does all the right
things, so let's use it.
---
src/mcd-misc.c | 241 +-------------------------------------------------------
1 files changed, 1 insertions(+), 240 deletions(-)
diff --git a/src/mcd-misc.c b/src/mcd-misc.c
index bef3a95..2151755 100644
--- a/src/mcd-misc.c
+++ b/src/mcd-misc.c
@@ -190,229 +190,10 @@ _mcd_object_ready (gpointer object, GQuark quark, const GError *error)
g_object_unref (object);
}
-
-static gint
-create_temp_file (gchar *tmpl,
- int permissions)
-{
- char *XXXXXX;
- int count, fd;
- static const char letters[] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
- static const int NLETTERS = sizeof (letters) - 1;
- glong value;
- GTimeVal tv;
- static int counter = 0;
-
- /* find the last occurrence of "XXXXXX" */
- XXXXXX = g_strrstr (tmpl, "XXXXXX");
-
- if (!XXXXXX || strncmp (XXXXXX, "XXXXXX", 6))
- {
- errno = EINVAL;
- return -1;
- }
-
- /* Get some more or less random data. */
- g_get_current_time (&tv);
- value = (tv.tv_usec ^ tv.tv_sec) + counter++;
-
- for (count = 0; count < 100; value += 7777, ++count)
- {
- glong v = value;
-
- /* Fill in the random bits. */
- XXXXXX[0] = letters[v % NLETTERS];
- v /= NLETTERS;
- XXXXXX[1] = letters[v % NLETTERS];
- v /= NLETTERS;
- XXXXXX[2] = letters[v % NLETTERS];
- v /= NLETTERS;
- XXXXXX[3] = letters[v % NLETTERS];
- v /= NLETTERS;
- XXXXXX[4] = letters[v % NLETTERS];
- v /= NLETTERS;
- XXXXXX[5] = letters[v % NLETTERS];
-
-#ifndef O_BINARY
-#define O_BINARY 0
-#endif
-
- /* tmpl is in UTF-8 on Windows, thus use g_open() */
- fd = g_open (tmpl, O_RDWR | O_CREAT | O_EXCL | O_BINARY, permissions);
-
- if (fd >= 0)
- return fd;
- else if (errno != EEXIST)
- /* Any other error will apply also to other names we might
- * try, and there are 2^32 or so of them, so give up now.
- */
- return -1;
- }
-
- /* We got out of the loop because we ran out of combinations to try. */
- errno = EEXIST;
- return -1;
-}
-
-static gboolean
-rename_file (const char *old_name,
- const char *new_name,
- GError **err)
-{
- errno = 0;
- if (g_rename (old_name, new_name) == -1)
- {
- int save_errno = errno;
- gchar *display_old_name = g_filename_display_name (old_name);
- gchar *display_new_name = g_filename_display_name (new_name);
-
- g_set_error (err,
- G_FILE_ERROR,
- g_file_error_from_errno (save_errno),
- "Failed to rename file '%s' to '%s': g_rename() failed: %s",
- display_old_name,
- display_new_name,
- g_strerror (save_errno));
-
- g_free (display_old_name);
- g_free (display_new_name);
-
- return FALSE;
- }
-
- return TRUE;
-}
-
-static gchar *
-write_to_temp_file (const gchar *contents,
- gsize length,
- const gchar *template,
- GError **err)
-{
- gchar *tmp_name;
- gchar *display_name;
- gchar *retval;
- FILE *file;
- gint fd;
- int save_errno;
-
- retval = NULL;
-
- tmp_name = g_strdup_printf ("%s.XXXXXX", template);
-
- errno = 0;
- fd = create_temp_file (tmp_name, 0666);
- save_errno = errno;
-
- display_name = g_filename_display_name (tmp_name);
-
- if (fd == -1)
- {
- g_set_error (err,
- G_FILE_ERROR,
- g_file_error_from_errno (save_errno),
- "Failed to create file '%s': %s",
- display_name, g_strerror (save_errno));
-
- goto out;
- }
-
- errno = 0;
- file = fdopen (fd, "wb");
- if (!file)
- {
- save_errno = errno;
- g_set_error (err,
- G_FILE_ERROR,
- g_file_error_from_errno (save_errno),
- "Failed to open file '%s' for writing: fdopen() failed: %s",
- display_name,
- g_strerror (save_errno));
-
- close (fd);
- g_unlink (tmp_name);
-
- goto out;
- }
-
- if (length > 0)
- {
- gsize n_written;
-
- errno = 0;
-
- n_written = fwrite (contents, 1, length, file);
-
- if (n_written < length)
- {
- save_errno = errno;
-
- g_set_error (err,
- G_FILE_ERROR,
- g_file_error_from_errno (save_errno),
- "Failed to write file '%s': fwrite() failed: %s",
- display_name,
- g_strerror (save_errno));
-
- fclose (file);
- g_unlink (tmp_name);
-
- goto out;
- }
- }
-
- errno = 0;
- if (fsync (fd) == -1)
- {
- save_errno = 0;
-
- g_set_error (err,
- G_FILE_ERROR,
- g_file_error_from_errno (save_errno),
- "Failed to sync file '%s': fsync() failed: %s",
- display_name,
- g_strerror (save_errno));
-
- fclose (file);
- g_unlink (tmp_name);
-
- goto out;
- }
-
- errno = 0;
- if (fclose (file) == EOF)
- {
- save_errno = 0;
-
- g_set_error (err,
- G_FILE_ERROR,
- g_file_error_from_errno (save_errno),
- "Failed to close file '%s': fclose() failed: %s",
- display_name,
- g_strerror (save_errno));
-
- g_unlink (tmp_name);
-
- goto out;
- }
-
- retval = g_strdup (tmp_name);
-
-out:
- g_free (tmp_name);
- g_free (display_name);
-
- return retval;
-}
-
gboolean
_mcd_file_set_contents (const gchar *filename, const gchar *contents,
gssize length, GError **error)
{
- gchar *tmp_filename;
- gboolean retval;
- GError *rename_error = NULL;
gchar *old_contents = NULL;
gsize old_length = 0;
@@ -440,25 +221,5 @@ _mcd_file_set_contents (const gchar *filename, const gchar *contents,
}
}
- tmp_filename = write_to_temp_file (contents, length, filename, error);
-
- if (!tmp_filename)
- {
- retval = FALSE;
- goto out;
- }
-
- if (!rename_file (tmp_filename, filename, &rename_error))
- {
- g_unlink (tmp_filename);
- g_propagate_error (error, rename_error);
- retval = FALSE;
- goto out;
- }
-
- retval = TRUE;
-
-out:
- g_free (tmp_filename);
- return retval;
+ return g_file_set_contents (filename, contents, length, error);
}
--
1.5.6.5
More information about the telepathy-commits
mailing list