return TRUE;
}
+/* format string must have two '%s':
+ *
+ * - the place for the filename
+ * - the place for the strerror
+ */
+static void
+format_error_message (GError **error,
+ const gchar *filename,
+ const gchar *format_string)
+{
+ gint saved_errno = errno;
+ gchar *display_name;
+
+ display_name = g_filename_display_name (filename);
+
+ g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (saved_errno),
+ format_string, display_name, g_strerror (saved_errno));
+
+ g_free (display_name);
+}
+
static gchar *
write_to_temp_file (const gchar *contents,
gssize length,
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", dest_file);
errno = 0;
fd = g_mkstemp_full (tmp_name, O_RDWR | O_BINARY, 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));
-
+ format_error_message (err, tmp_name, _("Failed to create file '%s': %s"));
goto out;
}
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));
-
+ format_error_message (err, tmp_name, _("Failed to open file '%s' for writing: fdopen() failed: %s"));
close (fd);
g_unlink (tmp_name);
-
+
goto out;
}
*/
(void) posix_fallocate (fd, 0, length);
#endif
-
+
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;
- }
+ {
+ format_error_message (err, tmp_name, _("Failed to write file '%s': fwrite() failed: %s"));
+ fclose (file);
+ g_unlink (tmp_name);
+ goto out;
+ }
}
errno = 0;
if (fflush (file) != 0)
- {
- save_errno = errno;
-
- g_set_error (err,
- G_FILE_ERROR,
- g_file_error_from_errno (save_errno),
- _("Failed to write file '%s': fflush() failed: %s"),
- display_name,
- g_strerror (save_errno));
-
+ {
+ format_error_message (err, tmp_name, _("Failed to write file '%s': fflush() failed: %s"));
fclose (file);
g_unlink (tmp_name);
-
+
goto out;
}
goto no_fsync;
}
#endif
-
+
#ifdef HAVE_FSYNC
{
struct stat statbuf;
* the new and the old file on some filesystems. (I.E. those that don't
* guarantee the data is written to the disk before the metadata.)
*/
- if (g_lstat (dest_file, &statbuf) == 0 &&
- statbuf.st_size > 0 &&
- fsync (fileno (file)) != 0)
+ if (g_lstat (dest_file, &statbuf) == 0 && statbuf.st_size > 0 && fsync (fileno (file)) != 0)
{
- save_errno = errno;
-
- g_set_error (err,
- G_FILE_ERROR,
- g_file_error_from_errno (save_errno),
- _("Failed to write file '%s': fsync() failed: %s"),
- display_name,
- g_strerror (save_errno));
-
+ format_error_message (err, tmp_name, _("Failed to write file '%s': fsync() failed: %s"));
fclose (file);
- g_unlink (tmp_name);
+ g_unlink (tmp_name);
- goto out;
+ goto out;
}
}
#endif
#ifdef BTRFS_SUPER_MAGIC
no_fsync:
#endif
-
+
errno = 0;
if (fclose (file) == EOF)
- {
- save_errno = errno;
-
- 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));
-
+ {
+ format_error_message (err, tmp_name, _("Failed to close file '%s': fclose() failed: %s"));
g_unlink (tmp_name);
-
+
goto out;
}
retval = g_strdup (tmp_name);
-
+
out:
g_free (tmp_name);
- g_free (display_name);
-
+
return retval;
}