+_g_local_file_output_stream_new (int fd)
+{
+ GLocalFileOutputStream *stream;
+
+ stream = g_object_new (G_TYPE_LOCAL_FILE_OUTPUT_STREAM, NULL);
+ stream->priv->fd = fd;
+ return G_FILE_OUTPUT_STREAM (stream);
+}
+
+static void
+set_error_from_open_errno (const char *filename,
+ GError **error)
+{
+ 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);
+ }
+}
+
+static GFileOutputStream *
+output_stream_open (const char *filename,
+ gint open_flags,
+ guint mode,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GLocalFileOutputStream *stream;
+ gint fd;
+
+ fd = g_open (filename, open_flags, mode);
+ if (fd == -1)
+ {
+ set_error_from_open_errno (filename, error);
+ return NULL;
+ }
+
+ stream = g_object_new (G_TYPE_LOCAL_FILE_OUTPUT_STREAM, NULL);
+ stream->priv->fd = fd;
+ return G_FILE_OUTPUT_STREAM (stream);
+}
+
+GFileOutputStream *