| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | /* GIO - GLib Input, Output and Streaming Library
 | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Copyright (C) 2006-2007 Red Hat, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |  * version 2 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General | 
					
						
							|  |  |  |  * Public License along with this library; if not, write to the | 
					
						
							|  |  |  |  * Free Software Foundation, Inc., 59 Temple Place, Suite 330, | 
					
						
							|  |  |  |  * Boston, MA 02111-1307, USA. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Author: Alexander Larsson <alexl@redhat.com> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 15:10:51 +00:00
										 |  |  | #include "config.h"
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <sys/types.h>
 | 
					
						
							|  |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #include <errno.h>
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <fcntl.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <glib.h>
 | 
					
						
							|  |  |  | #include <glib/gstdio.h>
 | 
					
						
							|  |  |  | #include "gioerror.h"
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | #include "gunixoutputstream.h"
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | #include "gcancellable.h"
 | 
					
						
							|  |  |  | #include "gsimpleasyncresult.h"
 | 
					
						
							|  |  |  | #include "gasynchelper.h"
 | 
					
						
							| 
									
										
										
										
											2011-09-03 09:03:17 -04:00
										 |  |  | #include "gfiledescriptorbased.h"
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | #include "glibintl.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-28 12:39:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-27 14:00:13 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |  * SECTION:gunixoutputstream | 
					
						
							| 
									
										
										
										
											2010-05-08 23:28:17 -04:00
										 |  |  |  * @short_description: Streaming output operations for UNIX file descriptors | 
					
						
							| 
									
										
										
										
											2007-12-18 02:52:11 +00:00
										 |  |  |  * @include: gio/gunixoutputstream.h | 
					
						
							| 
									
										
										
										
											2007-11-28 06:43:33 +00:00
										 |  |  |  * @see_also: #GOutputStream | 
					
						
							| 
									
										
										
										
											2007-11-27 14:00:13 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-04-27 16:54:18 -04:00
										 |  |  |  * #GUnixOutputStream implements #GOutputStream for writing to a UNIX | 
					
						
							|  |  |  |  * file descriptor, including asynchronous operations. (If the file | 
					
						
							|  |  |  |  * descriptor refers to a socket or pipe, this will use poll() to do | 
					
						
							|  |  |  |  * asynchronous I/O. If it refers to a regular file, it will fall back | 
					
						
							| 
									
										
										
										
											2011-11-13 16:39:45 -05:00
										 |  |  |  * to doing asynchronous I/O in another thread.) | 
					
						
							| 
									
										
										
										
											2008-12-31 07:47:19 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-05-08 23:28:17 -04:00
										 |  |  |  * Note that <filename><gio/gunixoutputstream.h></filename> belongs | 
					
						
							| 
									
										
										
										
											2008-12-31 07:47:19 +00:00
										 |  |  |  * to the UNIX-specific GIO interfaces, thus you have to use the | 
					
						
							|  |  |  |  * <filename>gio-unix-2.0.pc</filename> pkg-config file when using it. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2007-11-27 14:00:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | enum { | 
					
						
							|  |  |  |   PROP_0, | 
					
						
							|  |  |  |   PROP_FD, | 
					
						
							|  |  |  |   PROP_CLOSE_FD | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | static void g_unix_output_stream_pollable_iface_init (GPollableOutputStreamInterface *iface); | 
					
						
							| 
									
										
										
										
											2011-09-03 09:03:17 -04:00
										 |  |  | static void g_unix_output_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | G_DEFINE_TYPE_WITH_CODE (GUnixOutputStream, g_unix_output_stream, G_TYPE_OUTPUT_STREAM, | 
					
						
							|  |  |  | 			 G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_OUTPUT_STREAM, | 
					
						
							|  |  |  | 						g_unix_output_stream_pollable_iface_init) | 
					
						
							| 
									
										
										
										
											2011-09-03 09:03:17 -04:00
										 |  |  | 			 G_IMPLEMENT_INTERFACE (G_TYPE_FILE_DESCRIPTOR_BASED, | 
					
						
							|  |  |  | 						g_unix_output_stream_file_descriptor_based_iface_init) | 
					
						
							|  |  |  | 			 ) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | struct _GUnixOutputStreamPrivate { | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   int fd; | 
					
						
							| 
									
										
										
										
											2010-04-27 16:54:18 -04:00
										 |  |  |   guint close_fd : 1; | 
					
						
							|  |  |  |   guint is_pipe_or_socket : 1; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | static void     g_unix_output_stream_set_property (GObject              *object, | 
					
						
							|  |  |  | 						   guint                 prop_id, | 
					
						
							|  |  |  | 						   const GValue         *value, | 
					
						
							|  |  |  | 						   GParamSpec           *pspec); | 
					
						
							|  |  |  | static void     g_unix_output_stream_get_property (GObject              *object, | 
					
						
							|  |  |  | 						   guint                 prop_id, | 
					
						
							|  |  |  | 						   GValue               *value, | 
					
						
							|  |  |  | 						   GParamSpec           *pspec); | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | static gssize   g_unix_output_stream_write        (GOutputStream        *stream, | 
					
						
							|  |  |  | 						   const void           *buffer, | 
					
						
							|  |  |  | 						   gsize                 count, | 
					
						
							|  |  |  | 						   GCancellable         *cancellable, | 
					
						
							|  |  |  | 						   GError              **error); | 
					
						
							|  |  |  | static gboolean g_unix_output_stream_close        (GOutputStream        *stream, | 
					
						
							|  |  |  | 						   GCancellable         *cancellable, | 
					
						
							|  |  |  | 						   GError              **error); | 
					
						
							|  |  |  | static void     g_unix_output_stream_write_async  (GOutputStream        *stream, | 
					
						
							|  |  |  | 						   const void           *buffer, | 
					
						
							|  |  |  | 						   gsize                 count, | 
					
						
							|  |  |  | 						   int                   io_priority, | 
					
						
							|  |  |  | 						   GCancellable         *cancellable, | 
					
						
							|  |  |  | 						   GAsyncReadyCallback   callback, | 
					
						
							|  |  |  | 						   gpointer              data); | 
					
						
							|  |  |  | static gssize   g_unix_output_stream_write_finish (GOutputStream        *stream, | 
					
						
							|  |  |  | 						   GAsyncResult         *result, | 
					
						
							|  |  |  | 						   GError              **error); | 
					
						
							|  |  |  | static void     g_unix_output_stream_close_async  (GOutputStream        *stream, | 
					
						
							|  |  |  | 						   int                   io_priority, | 
					
						
							|  |  |  | 						   GCancellable         *cancellable, | 
					
						
							|  |  |  | 						   GAsyncReadyCallback   callback, | 
					
						
							|  |  |  | 						   gpointer              data); | 
					
						
							|  |  |  | static gboolean g_unix_output_stream_close_finish (GOutputStream        *stream, | 
					
						
							|  |  |  | 						   GAsyncResult         *result, | 
					
						
							|  |  |  | 						   GError              **error); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | static gboolean g_unix_output_stream_pollable_is_writable   (GPollableOutputStream *stream); | 
					
						
							|  |  |  | static GSource *g_unix_output_stream_pollable_create_source (GPollableOutputStream *stream, | 
					
						
							|  |  |  | 							     GCancellable         *cancellable); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | g_unix_output_stream_finalize (GObject *object) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-06-16 09:54:04 +00:00
										 |  |  |   G_OBJECT_CLASS (g_unix_output_stream_parent_class)->finalize (object); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | g_unix_output_stream_class_init (GUnixOutputStreamClass *klass) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   GObjectClass *gobject_class = G_OBJECT_CLASS (klass); | 
					
						
							|  |  |  |   GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS (klass); | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   g_type_class_add_private (klass, sizeof (GUnixOutputStreamPrivate)); | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   gobject_class->get_property = g_unix_output_stream_get_property; | 
					
						
							|  |  |  |   gobject_class->set_property = g_unix_output_stream_set_property; | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   gobject_class->finalize = g_unix_output_stream_finalize; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-05 10:38:03 +00:00
										 |  |  |   stream_class->write_fn = g_unix_output_stream_write; | 
					
						
							|  |  |  |   stream_class->close_fn = g_unix_output_stream_close; | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   stream_class->write_async = g_unix_output_stream_write_async; | 
					
						
							|  |  |  |   stream_class->write_finish = g_unix_output_stream_write_finish; | 
					
						
							|  |  |  |   stream_class->close_async = g_unix_output_stream_close_async; | 
					
						
							|  |  |  |   stream_class->close_finish = g_unix_output_stream_close_finish; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    /**
 | 
					
						
							|  |  |  |    * GUnixOutputStream:fd: | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    * The file descriptor that the stream writes to. | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    * Since: 2.20 | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   g_object_class_install_property (gobject_class, | 
					
						
							|  |  |  | 				   PROP_FD, | 
					
						
							|  |  |  | 				   g_param_spec_int ("fd", | 
					
						
							| 
									
										
										
										
											2009-04-22 15:12:37 +02:00
										 |  |  | 						     P_("File descriptor"), | 
					
						
							|  |  |  | 						     P_("The file descriptor to write to"), | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | 						     G_MININT, G_MAXINT, -1, | 
					
						
							|  |  |  | 						     G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /**
 | 
					
						
							|  |  |  |    * GUnixOutputStream:close-fd: | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    * Whether to close the file descriptor when the stream is closed. | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    * Since: 2.20 | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   g_object_class_install_property (gobject_class, | 
					
						
							|  |  |  | 				   PROP_CLOSE_FD, | 
					
						
							|  |  |  | 				   g_param_spec_boolean ("close-fd", | 
					
						
							| 
									
										
										
										
											2009-04-22 15:12:37 +02:00
										 |  |  | 							 P_("Close file descriptor"), | 
					
						
							|  |  |  | 							 P_("Whether to close the file descriptor when the stream is closed"), | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | 							 TRUE, | 
					
						
							|  |  |  | 							 G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | static void | 
					
						
							|  |  |  | g_unix_output_stream_pollable_iface_init (GPollableOutputStreamInterface *iface) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   iface->is_writable = g_unix_output_stream_pollable_is_writable; | 
					
						
							|  |  |  |   iface->create_source = g_unix_output_stream_pollable_create_source; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-03 09:03:17 -04:00
										 |  |  | static void | 
					
						
							|  |  |  | g_unix_output_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   iface->get_fd = (int (*) (GFileDescriptorBased *))g_unix_output_stream_get_fd; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | g_unix_output_stream_set_property (GObject         *object, | 
					
						
							|  |  |  | 				   guint            prop_id, | 
					
						
							|  |  |  | 				   const GValue    *value, | 
					
						
							|  |  |  | 				   GParamSpec      *pspec) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GUnixOutputStream *unix_stream; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   unix_stream = G_UNIX_OUTPUT_STREAM (object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   switch (prop_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     case PROP_FD: | 
					
						
							|  |  |  |       unix_stream->priv->fd = g_value_get_int (value); | 
					
						
							| 
									
										
										
										
											2010-04-27 16:54:18 -04:00
										 |  |  |       if (lseek (unix_stream->priv->fd, 0, SEEK_CUR) == -1 && errno == ESPIPE) | 
					
						
							|  |  |  | 	unix_stream->priv->is_pipe_or_socket = TRUE; | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  | 	unix_stream->priv->is_pipe_or_socket = FALSE; | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |       break; | 
					
						
							|  |  |  |     case PROP_CLOSE_FD: | 
					
						
							|  |  |  |       unix_stream->priv->close_fd = g_value_get_boolean (value); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_unix_output_stream_get_property (GObject    *object, | 
					
						
							|  |  |  | 				   guint       prop_id, | 
					
						
							|  |  |  | 				   GValue     *value, | 
					
						
							|  |  |  | 				   GParamSpec *pspec) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GUnixOutputStream *unix_stream; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   unix_stream = G_UNIX_OUTPUT_STREAM (object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   switch (prop_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     case PROP_FD: | 
					
						
							|  |  |  |       g_value_set_int (value, unix_stream->priv->fd); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     case PROP_CLOSE_FD: | 
					
						
							|  |  |  |       g_value_set_boolean (value, unix_stream->priv->close_fd); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | g_unix_output_stream_init (GUnixOutputStream *unix_stream) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   unix_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (unix_stream, | 
					
						
							|  |  |  | 						   G_TYPE_UNIX_OUTPUT_STREAM, | 
					
						
							|  |  |  | 						   GUnixOutputStreamPrivate); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |   unix_stream->priv->fd = -1; | 
					
						
							|  |  |  |   unix_stream->priv->close_fd = TRUE; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |  * g_unix_output_stream_new: | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |  * @fd: a UNIX file descriptor | 
					
						
							|  |  |  |  * @close_fd: %TRUE to close the file descriptor when done | 
					
						
							| 
									
										
										
										
											2007-11-27 14:00:13 +00:00
										 |  |  |  *  | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |  * Creates a new #GUnixOutputStream for the given @fd.  | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  *  | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |  * If @close_fd, is %TRUE, the file descriptor will be closed when  | 
					
						
							|  |  |  |  * the output stream is destroyed. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Returns: a new #GOutputStream | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  **/ | 
					
						
							|  |  |  | GOutputStream * | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | g_unix_output_stream_new (gint     fd, | 
					
						
							|  |  |  | 			  gboolean close_fd) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   GUnixOutputStream *stream; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   g_return_val_if_fail (fd != -1, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |   stream = g_object_new (G_TYPE_UNIX_OUTPUT_STREAM, | 
					
						
							|  |  |  | 			 "fd", fd, | 
					
						
							|  |  |  | 			 "close-fd", close_fd, | 
					
						
							|  |  |  | 			 NULL); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   return G_OUTPUT_STREAM (stream); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * g_unix_output_stream_set_close_fd: | 
					
						
							|  |  |  |  * @stream: a #GUnixOutputStream | 
					
						
							|  |  |  |  * @close_fd: %TRUE to close the file descriptor when done | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Sets whether the file descriptor of @stream shall be closed | 
					
						
							|  |  |  |  * when the stream is closed. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.20 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | void | 
					
						
							|  |  |  | g_unix_output_stream_set_close_fd (GUnixOutputStream *stream, | 
					
						
							|  |  |  |                                    gboolean           close_fd) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   g_return_if_fail (G_IS_UNIX_OUTPUT_STREAM (stream)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   close_fd = close_fd != FALSE; | 
					
						
							|  |  |  |   if (stream->priv->close_fd != close_fd) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       stream->priv->close_fd = close_fd; | 
					
						
							|  |  |  |       g_object_notify (G_OBJECT (stream), "close-fd"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * g_unix_output_stream_get_close_fd: | 
					
						
							|  |  |  |  * @stream: a #GUnixOutputStream | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Returns whether the file descriptor of @stream will be | 
					
						
							|  |  |  |  * closed when the stream is closed. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Return value: %TRUE if the file descriptor is closed when done | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.20 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | gboolean | 
					
						
							|  |  |  | g_unix_output_stream_get_close_fd (GUnixOutputStream *stream) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   g_return_val_if_fail (G_IS_UNIX_OUTPUT_STREAM (stream), FALSE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return stream->priv->close_fd; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * g_unix_output_stream_get_fd: | 
					
						
							|  |  |  |  * @stream: a #GUnixOutputStream | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Return the UNIX file descriptor that the stream writes to. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Return value: The file descriptor of @stream | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.20 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | gint | 
					
						
							|  |  |  | g_unix_output_stream_get_fd (GUnixOutputStream *stream) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   g_return_val_if_fail (G_IS_UNIX_OUTPUT_STREAM (stream), -1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return stream->priv->fd; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | static gssize | 
					
						
							| 
									
										
										
										
											2007-11-30 05:11:25 +00:00
										 |  |  | g_unix_output_stream_write (GOutputStream  *stream, | 
					
						
							|  |  |  | 			    const void     *buffer, | 
					
						
							|  |  |  | 			    gsize           count, | 
					
						
							|  |  |  | 			    GCancellable   *cancellable, | 
					
						
							|  |  |  | 			    GError        **error) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   GUnixOutputStream *unix_stream; | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  |   gssize res = -1; | 
					
						
							| 
									
										
										
										
											2008-09-26 16:19:35 +00:00
										 |  |  |   GPollFD poll_fds[2]; | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  |   int nfds; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   int poll_ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   unix_stream = G_UNIX_OUTPUT_STREAM (stream); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  |   poll_fds[0].fd = unix_stream->priv->fd; | 
					
						
							|  |  |  |   poll_fds[0].events = G_IO_OUT; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-27 16:54:18 -04:00
										 |  |  |   if (unix_stream->priv->is_pipe_or_socket && | 
					
						
							|  |  |  |       g_cancellable_make_pollfd (cancellable, &poll_fds[1])) | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  |     nfds = 2; | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     nfds = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   while (1) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  |       poll_fds[0].revents = poll_fds[1].revents = 0; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |       do | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 	poll_ret = g_poll (poll_fds, nfds, -1); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |       while (poll_ret == -1 && errno == EINTR); | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |       if (poll_ret == -1) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  |           int errsv = errno; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	  g_set_error (error, G_IO_ERROR, | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  | 		       g_io_error_from_errno (errsv), | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 		       _("Error writing to file descriptor: %s"), | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  | 		       g_strerror (errsv)); | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 	  break; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |       if (g_cancellable_set_error_if_cancelled (cancellable, error)) | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 	break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (!poll_fds[0].revents) | 
					
						
							|  |  |  | 	continue; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |       res = write (unix_stream->priv->fd, buffer, count); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |       if (res == -1) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  |           int errsv = errno; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 	  if (errsv == EINTR || errsv == EAGAIN) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	    continue; | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	  g_set_error (error, G_IO_ERROR, | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  | 		       g_io_error_from_errno (errsv), | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 		       _("Error writing to file descriptor: %s"), | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  | 		       g_strerror (errsv)); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-05 12:57:32 -05:00
										 |  |  |   if (nfds == 2) | 
					
						
							|  |  |  |     g_cancellable_release_fd (cancellable); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   return res; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gboolean | 
					
						
							| 
									
										
										
										
											2007-11-30 05:11:25 +00:00
										 |  |  | g_unix_output_stream_close (GOutputStream  *stream, | 
					
						
							|  |  |  | 			    GCancellable   *cancellable, | 
					
						
							|  |  |  | 			    GError        **error) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   GUnixOutputStream *unix_stream; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   int res; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   unix_stream = G_UNIX_OUTPUT_STREAM (stream); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |   if (!unix_stream->priv->close_fd) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |     return TRUE; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   while (1) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       /* This might block during the close. Doesn't seem to be a way to avoid it though. */ | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |       res = close (unix_stream->priv->fd); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |       if (res == -1) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  |           int errsv = errno; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	  g_set_error (error, G_IO_ERROR, | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  | 		       g_io_error_from_errno (errsv), | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 		       _("Error closing file descriptor: %s"), | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  | 		       g_strerror (errsv)); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return res != -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |   gsize count; | 
					
						
							|  |  |  |   const void *buffer; | 
					
						
							|  |  |  |   GAsyncReadyCallback callback; | 
					
						
							|  |  |  |   gpointer user_data; | 
					
						
							|  |  |  |   GCancellable *cancellable; | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   GUnixOutputStream *stream; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | } WriteAsyncData; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gboolean | 
					
						
							| 
									
										
										
										
											2010-11-07 11:05:26 -05:00
										 |  |  | write_async_cb (int             fd, | 
					
						
							| 
									
										
										
										
											2007-11-30 05:11:25 +00:00
										 |  |  | 		GIOCondition    condition, | 
					
						
							| 
									
										
										
										
											2010-11-07 11:05:26 -05:00
										 |  |  | 		WriteAsyncData *data) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   GSimpleAsyncResult *simple; | 
					
						
							|  |  |  |   GError *error = NULL; | 
					
						
							|  |  |  |   gssize count_written; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   while (1) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       if (g_cancellable_set_error_if_cancelled (data->cancellable, &error)) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  count_written = -1; | 
					
						
							|  |  |  | 	  break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |        | 
					
						
							|  |  |  |       count_written = write (data->stream->priv->fd, data->buffer, data->count); | 
					
						
							|  |  |  |       if (count_written == -1) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  |           int errsv = errno; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 	  if (errsv == EINTR || errsv == EAGAIN) | 
					
						
							|  |  |  | 	    return TRUE; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	   | 
					
						
							|  |  |  | 	  g_set_error (&error, G_IO_ERROR, | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  | 		       g_io_error_from_errno (errsv), | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 		       _("Error writing to file descriptor: %s"), | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  | 		       g_strerror (errsv)); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   simple = g_simple_async_result_new (G_OBJECT (data->stream), | 
					
						
							|  |  |  | 				      data->callback, | 
					
						
							|  |  |  | 				      data->user_data, | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | 				      g_unix_output_stream_write_async); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   g_simple_async_result_set_op_res_gssize (simple, count_written); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (count_written == -1) | 
					
						
							| 
									
										
										
										
											2010-09-23 13:02:50 +02:00
										 |  |  |     g_simple_async_result_take_error (simple, error); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* Complete immediately, not in idle, since we're already in a mainloop callout */ | 
					
						
							|  |  |  |   g_simple_async_result_complete (simple); | 
					
						
							|  |  |  |   g_object_unref (simple); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-30 05:11:25 +00:00
										 |  |  | g_unix_output_stream_write_async (GOutputStream       *stream, | 
					
						
							|  |  |  | 				  const void          *buffer, | 
					
						
							|  |  |  | 				  gsize                count, | 
					
						
							|  |  |  | 				  int                  io_priority, | 
					
						
							|  |  |  | 				  GCancellable        *cancellable, | 
					
						
							|  |  |  | 				  GAsyncReadyCallback  callback, | 
					
						
							|  |  |  | 				  gpointer             user_data) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   GSource *source; | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   GUnixOutputStream *unix_stream; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   WriteAsyncData *data; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   unix_stream = G_UNIX_OUTPUT_STREAM (stream); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-27 16:54:18 -04:00
										 |  |  |   if (!unix_stream->priv->is_pipe_or_socket) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       G_OUTPUT_STREAM_CLASS (g_unix_output_stream_parent_class)-> | 
					
						
							|  |  |  | 	write_async (stream, buffer, count, io_priority, | 
					
						
							|  |  |  | 		     cancellable, callback, user_data); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   data = g_new0 (WriteAsyncData, 1); | 
					
						
							|  |  |  |   data->count = count; | 
					
						
							|  |  |  |   data->buffer = buffer; | 
					
						
							|  |  |  |   data->callback = callback; | 
					
						
							|  |  |  |   data->user_data = user_data; | 
					
						
							|  |  |  |   data->cancellable = cancellable; | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   data->stream = unix_stream; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   source = _g_fd_source_new (unix_stream->priv->fd, | 
					
						
							| 
									
										
										
										
											2008-09-26 16:19:35 +00:00
										 |  |  | 			     G_IO_OUT, | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 			     cancellable); | 
					
						
							| 
									
										
										
										
											2010-07-10 20:09:34 -04:00
										 |  |  |   g_source_set_name (source, "GUnixOutputStream"); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   g_source_set_callback (source, (GSourceFunc)write_async_cb, data, g_free); | 
					
						
							| 
									
										
										
										
											2009-06-16 20:22:58 -04:00
										 |  |  |   g_source_attach (source, g_main_context_get_thread_default ()); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   g_source_unref (source); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gssize | 
					
						
							| 
									
										
										
										
											2007-11-30 05:11:25 +00:00
										 |  |  | g_unix_output_stream_write_finish (GOutputStream  *stream, | 
					
						
							|  |  |  | 				   GAsyncResult   *result, | 
					
						
							|  |  |  | 				   GError        **error) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-04-27 16:54:18 -04:00
										 |  |  |   GUnixOutputStream *unix_stream = G_UNIX_OUTPUT_STREAM (stream); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   GSimpleAsyncResult *simple; | 
					
						
							|  |  |  |   gssize nwritten; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-27 16:54:18 -04:00
										 |  |  |   if (!unix_stream->priv->is_pipe_or_socket) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return G_OUTPUT_STREAM_CLASS (g_unix_output_stream_parent_class)-> | 
					
						
							|  |  |  | 	write_finish (stream, result, error); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   simple = G_SIMPLE_ASYNC_RESULT (result); | 
					
						
							| 
									
										
										
										
											2007-12-10 14:07:42 +00:00
										 |  |  |   g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_unix_output_stream_write_async); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   nwritten = g_simple_async_result_get_op_res_gssize (simple); | 
					
						
							|  |  |  |   return nwritten; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |   GOutputStream *stream; | 
					
						
							|  |  |  |   GAsyncReadyCallback callback; | 
					
						
							|  |  |  |   gpointer user_data; | 
					
						
							|  |  |  | } CloseAsyncData; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gboolean | 
					
						
							|  |  |  | close_async_cb (CloseAsyncData *data) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   GUnixOutputStream *unix_stream; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   GSimpleAsyncResult *simple; | 
					
						
							|  |  |  |   GError *error = NULL; | 
					
						
							|  |  |  |   gboolean result; | 
					
						
							|  |  |  |   int res; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   unix_stream = G_UNIX_OUTPUT_STREAM (data->stream); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |   if (!unix_stream->priv->close_fd) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |       result = TRUE; | 
					
						
							|  |  |  |       goto out; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   while (1) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |       res = close (unix_stream->priv->fd); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |       if (res == -1) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  |           int errsv = errno; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	  g_set_error (&error, G_IO_ERROR, | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  | 		       g_io_error_from_errno (errsv), | 
					
						
							| 
									
										
										
										
											2011-11-14 18:27:34 -05:00
										 |  |  | 		       _("Error closing file descriptor: %s"), | 
					
						
							| 
									
										
											  
											
												Save errno before calling other funcs that potentially alter it. Bug
	* gio/gdesktopappinfo.c: (ensure_dir):
	* gio/glocalfile.c: (g_local_file_query_filesystem_info),
	(g_local_file_read), (g_local_file_delete), (g_local_file_trash),
	(g_local_file_move):
	* gio/glocalfileinfo.c: (set_xattr), (_g_local_file_info_get),
	(_g_local_file_info_get_from_fd), (set_unix_mode),
	(set_unix_uid_gid), (set_symlink), (set_mtime_atime):
	* gio/glocalfileinputstream.c: (g_local_file_input_stream_read),
	(g_local_file_input_stream_skip),
	(g_local_file_input_stream_close),
	(g_local_file_input_stream_seek):
	* gio/glocalfileoutputstream.c:
	(g_local_file_output_stream_write),
	(g_local_file_output_stream_close),
	(g_local_file_output_stream_seek),
	(g_local_file_output_stream_truncate), (copy_file_data),
	(handle_overwrite_open):
	* gio/gunixinputstream.c: (g_unix_input_stream_read),
	(g_unix_input_stream_close), (read_async_cb), (close_async_cb):
	* gio/gunixoutputstream.c: (g_unix_output_stream_write),
	(g_unix_output_stream_close), (write_async_cb), (close_async_cb):
	Save
	errno before calling other funcs that potentially alter it. Bug
	#514766.
svn path=/trunk/; revision=6466
											
										 
											2008-02-06 15:10:08 +00:00
										 |  |  | 		       g_strerror (errsv)); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   result = res != -1; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |  out: | 
					
						
							|  |  |  |   simple = g_simple_async_result_new (G_OBJECT (data->stream), | 
					
						
							|  |  |  | 				      data->callback, | 
					
						
							|  |  |  | 				      data->user_data, | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | 				      g_unix_output_stream_close_async); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (!result) | 
					
						
							| 
									
										
										
										
											2010-09-23 13:02:50 +02:00
										 |  |  |     g_simple_async_result_take_error (simple, error); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /* Complete immediately, not in idle, since we're already in a mainloop callout */ | 
					
						
							|  |  |  |   g_simple_async_result_complete (simple); | 
					
						
							|  |  |  |   g_object_unref (simple); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   return FALSE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-30 05:11:25 +00:00
										 |  |  | g_unix_output_stream_close_async (GOutputStream        *stream, | 
					
						
							|  |  |  | 				  int                  io_priority, | 
					
						
							|  |  |  | 				  GCancellable        *cancellable, | 
					
						
							|  |  |  | 				  GAsyncReadyCallback  callback, | 
					
						
							|  |  |  | 				  gpointer             user_data) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   GSource *idle; | 
					
						
							|  |  |  |   CloseAsyncData *data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   data = g_new0 (CloseAsyncData, 1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   data->stream = stream; | 
					
						
							|  |  |  |   data->callback = callback; | 
					
						
							|  |  |  |   data->user_data = user_data; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   idle = g_idle_source_new (); | 
					
						
							|  |  |  |   g_source_set_callback (idle, (GSourceFunc)close_async_cb, data, g_free); | 
					
						
							| 
									
										
										
										
											2009-06-16 20:22:58 -04:00
										 |  |  |   g_source_attach (idle, g_main_context_get_thread_default ()); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   g_source_unref (idle); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gboolean | 
					
						
							| 
									
										
										
										
											2007-11-30 05:11:25 +00:00
										 |  |  | g_unix_output_stream_close_finish (GOutputStream  *stream, | 
					
						
							|  |  |  | 				   GAsyncResult   *result, | 
					
						
							|  |  |  | 				   GError        **error) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   /* Failures handled in generic close_finish code */ | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | static gboolean | 
					
						
							|  |  |  | g_unix_output_stream_pollable_is_writable (GPollableOutputStream *stream) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GUnixOutputStream *unix_stream = G_UNIX_OUTPUT_STREAM (stream); | 
					
						
							|  |  |  |   GPollFD poll_fd; | 
					
						
							|  |  |  |   gint result; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   poll_fd.fd = unix_stream->priv->fd; | 
					
						
							|  |  |  |   poll_fd.events = G_IO_OUT; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   do | 
					
						
							|  |  |  |     result = g_poll (&poll_fd, 1, 0); | 
					
						
							|  |  |  |   while (result == -1 && errno == EINTR); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return poll_fd.revents != 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static GSource * | 
					
						
							|  |  |  | g_unix_output_stream_pollable_create_source (GPollableOutputStream *stream, | 
					
						
							|  |  |  | 					     GCancellable          *cancellable) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GUnixOutputStream *unix_stream = G_UNIX_OUTPUT_STREAM (stream); | 
					
						
							|  |  |  |   GSource *inner_source, *pollable_source; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   pollable_source = g_pollable_source_new (G_OBJECT (stream)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   inner_source = _g_fd_source_new (unix_stream->priv->fd, G_IO_OUT, cancellable); | 
					
						
							|  |  |  |   g_source_set_dummy_callback (inner_source); | 
					
						
							|  |  |  |   g_source_add_child_source (pollable_source, inner_source); | 
					
						
							|  |  |  |   g_source_unref (inner_source); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return pollable_source; | 
					
						
							|  |  |  | } |