summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2013-05-09 18:39:50 +0100
committerColin Walters <walters@verbum.org>2013-05-23 23:10:44 +0100
commit5e65cd4e5153b340a25a8ffb580cf5f23f54d649 (patch)
tree475e3ebf0933c1ecd1af9ff1a54ef6213416cc3d
parent49030c8797d5a415e2cb94a3c658f67206cb8bf5 (diff)
downloadglib-5e65cd4e5153b340a25a8ffb580cf5f23f54d649.tar.gz
GLocalFileOutputStream: Deduplicate stream creation code
Lots of copy/paste of the error handling path, let's deduplicate so I can sanely patch this code later. https://bugzilla.gnome.org/699959
-rw-r--r--gio/glocalfileoutputstream.c103
1 files changed, 31 insertions, 72 deletions
diff --git a/gio/glocalfileoutputstream.c b/gio/glocalfileoutputstream.c
index 22fefc4ba..520f771ab 100644
--- a/gio/glocalfileoutputstream.c
+++ b/gio/glocalfileoutputstream.c
@@ -544,26 +544,17 @@ _g_local_file_output_stream_new (int fd)
return G_FILE_OUTPUT_STREAM (stream);
}
-GFileOutputStream *
-_g_local_file_output_stream_open (const char *filename,
- gboolean readable,
- GCancellable *cancellable,
- GError **error)
+static GFileOutputStream *
+output_stream_open (const char *filename,
+ gint open_flags,
+ guint mode,
+ GCancellable *cancellable,
+ GError **error)
{
GLocalFileOutputStream *stream;
- int fd;
- int open_flags;
-
- if (g_cancellable_set_error_if_cancelled (cancellable, error))
- return NULL;
+ gint fd;
- open_flags = O_BINARY;
- if (readable)
- open_flags |= O_RDWR;
- else
- open_flags |= O_WRONLY;
-
- fd = g_open (filename, open_flags, 0666);
+ fd = g_open (filename, open_flags, mode);
if (fd == -1)
{
int errsv = errno;
@@ -591,15 +582,33 @@ _g_local_file_output_stream_open (const char *filename,
}
GFileOutputStream *
+_g_local_file_output_stream_open (const char *filename,
+ gboolean readable,
+ GCancellable *cancellable,
+ GError **error)
+{
+ int open_flags;
+
+ if (g_cancellable_set_error_if_cancelled (cancellable, error))
+ return NULL;
+
+ open_flags = O_BINARY;
+ if (readable)
+ open_flags |= O_RDWR;
+ else
+ open_flags |= O_WRONLY;
+
+ return output_stream_open (filename, open_flags, 0666, cancellable, error);
+}
+
+GFileOutputStream *
_g_local_file_output_stream_create (const char *filename,
gboolean readable,
GFileCreateFlags flags,
GCancellable *cancellable,
GError **error)
{
- GLocalFileOutputStream *stream;
int mode;
- int fd;
int open_flags;
if (g_cancellable_set_error_if_cancelled (cancellable, error))
@@ -616,31 +625,7 @@ _g_local_file_output_stream_create (const char *filename,
else
open_flags |= O_WRONLY;
- fd = g_open (filename, open_flags, mode);
- if (fd == -1)
- {
- int errsv = errno;
-
- if (errsv == EINVAL)
- /* This must be an invalid filename, on e.g. FAT */
- g_set_error_literal (error, G_IO_ERROR,
- G_IO_ERROR_INVALID_FILENAME,
- _("Invalid filename"));
- else
- {
- char *display_name = g_filename_display_name (filename);
- g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- _("Error opening file '%s': %s"),
- display_name, g_strerror (errsv));
- g_free (display_name);
- }
- return NULL;
- }
-
- stream = g_object_new (G_TYPE_LOCAL_FILE_OUTPUT_STREAM, NULL);
- stream->priv->fd = fd;
- return G_FILE_OUTPUT_STREAM (stream);
+ return output_stream_open (filename, open_flags, mode, cancellable, error);
}
GFileOutputStream *
@@ -649,9 +634,7 @@ _g_local_file_output_stream_append (const char *filename,
GCancellable *cancellable,
GError **error)
{
- GLocalFileOutputStream *stream;
int mode;
- int fd;
if (g_cancellable_set_error_if_cancelled (cancellable, error))
return NULL;
@@ -661,32 +644,8 @@ _g_local_file_output_stream_append (const char *filename,
else
mode = 0666;
- fd = g_open (filename, O_CREAT | O_APPEND | O_WRONLY | O_BINARY, mode);
- if (fd == -1)
- {
- int errsv = errno;
-
- if (errsv == EINVAL)
- /* This must be an invalid filename, on e.g. FAT */
- g_set_error_literal (error, G_IO_ERROR,
- G_IO_ERROR_INVALID_FILENAME,
- _("Invalid filename"));
- else
- {
- char *display_name = g_filename_display_name (filename);
- g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- _("Error opening file '%s': %s"),
- display_name, g_strerror (errsv));
- g_free (display_name);
- }
- return NULL;
- }
-
- stream = g_object_new (G_TYPE_LOCAL_FILE_OUTPUT_STREAM, NULL);
- stream->priv->fd = fd;
-
- return G_FILE_OUTPUT_STREAM (stream);
+ return output_stream_open (filename, O_CREAT | O_APPEND | O_WRONLY | O_BINARY, mode,
+ cancellable, error);
}
static char *