| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | /* GIO - GLib Input, Output and Streaming Library
 | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * Copyright (C) 2006-2007 Red Hat, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2022-05-18 09:12:45 +01:00
										 |  |  |  * SPDX-License-Identifier: LGPL-2.1-or-later | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  * 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 | 
					
						
							| 
									
										
										
										
											2017-05-27 18:21:30 +02:00
										 |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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 | 
					
						
							| 
									
										
										
										
											2014-01-23 12:58:29 +01:00
										 |  |  |  * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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 <unistd.h>
 | 
					
						
							|  |  |  | #include <errno.h>
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <glib.h>
 | 
					
						
							|  |  |  | #include <glib/gstdio.h>
 | 
					
						
							| 
									
										
										
										
											2013-06-01 15:24:13 -03:00
										 |  |  | #include <glib/glib-unix.h>
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | #include "gioerror.h"
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | #include "gunixinputstream.h"
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | #include "gcancellable.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"
 | 
					
						
							| 
									
										
										
										
											2021-01-19 22:14:41 +01:00
										 |  |  | #include "giounix-private.h"
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-28 12:39:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-27 14:00:13 +00:00
										 |  |  | /**
 | 
					
						
							| 
									
										
										
										
											2023-11-02 16:27:11 +00:00
										 |  |  |  * GUnixInputStream: | 
					
						
							| 
									
										
										
										
											2007-11-27 14:00:13 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2023-11-02 16:27:11 +00:00
										 |  |  |  * `GUnixInputStream` implements [class@Gio.InputStream] for reading from a UNIX | 
					
						
							| 
									
										
										
										
											2010-04-27 16:54:18 -04:00
										 |  |  |  * file descriptor, including asynchronous operations. (If the file | 
					
						
							| 
									
										
										
										
											2023-11-02 16:27:11 +00:00
										 |  |  |  * descriptor refers to a socket or pipe, this will use `poll()` to do | 
					
						
							| 
									
										
										
										
											2010-04-27 16:54:18 -04:00
										 |  |  |  * 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
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2014-02-09 02:07:26 -05:00
										 |  |  |  * Note that `<gio/gunixinputstream.h>` belongs to the UNIX-specific GIO | 
					
						
							| 
									
										
										
										
											2014-02-05 20:17:46 -05:00
										 |  |  |  * interfaces, thus you have to use the `gio-unix-2.0.pc` pkg-config | 
					
						
							| 
									
										
										
										
											2024-02-06 15:41:11 +00:00
										 |  |  |  * file or the `GioUnix-2.0` GIR namespace when using it. | 
					
						
							| 
									
										
										
										
											2008-12-31 07:47:19 +00:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2007-11-27 14:00:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | enum { | 
					
						
							|  |  |  |   PROP_0, | 
					
						
							|  |  |  |   PROP_FD, | 
					
						
							|  |  |  |   PROP_CLOSE_FD | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-11 00:29:58 +01:00
										 |  |  | struct _GUnixInputStreamPrivate { | 
					
						
							|  |  |  |   int fd; | 
					
						
							|  |  |  |   guint close_fd : 1; | 
					
						
							| 
									
										
										
										
											2021-01-19 22:14:41 +01:00
										 |  |  |   guint can_poll : 1; | 
					
						
							| 
									
										
										
										
											2013-06-11 00:29:58 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | static void g_unix_input_stream_pollable_iface_init (GPollableInputStreamInterface *iface); | 
					
						
							| 
									
										
										
										
											2011-09-03 09:03:17 -04:00
										 |  |  | static void g_unix_input_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface); | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | G_DEFINE_TYPE_WITH_CODE (GUnixInputStream, g_unix_input_stream, G_TYPE_INPUT_STREAM, | 
					
						
							| 
									
										
										
										
											2013-06-11 00:29:58 +01:00
										 |  |  |                          G_ADD_PRIVATE (GUnixInputStream) | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | 			 G_IMPLEMENT_INTERFACE (G_TYPE_POLLABLE_INPUT_STREAM, | 
					
						
							|  |  |  | 						g_unix_input_stream_pollable_iface_init) | 
					
						
							| 
									
										
										
										
											2011-09-03 09:03:17 -04:00
										 |  |  | 			 G_IMPLEMENT_INTERFACE (G_TYPE_FILE_DESCRIPTOR_BASED, | 
					
						
							|  |  |  | 						g_unix_input_stream_file_descriptor_based_iface_init) | 
					
						
							|  |  |  | 			 ) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | static void     g_unix_input_stream_set_property (GObject              *object, | 
					
						
							|  |  |  | 						  guint                 prop_id, | 
					
						
							|  |  |  | 						  const GValue         *value, | 
					
						
							|  |  |  | 						  GParamSpec           *pspec); | 
					
						
							|  |  |  | static void     g_unix_input_stream_get_property (GObject              *object, | 
					
						
							|  |  |  | 						  guint                 prop_id, | 
					
						
							|  |  |  | 						  GValue               *value, | 
					
						
							|  |  |  | 						  GParamSpec           *pspec); | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | static gssize   g_unix_input_stream_read         (GInputStream         *stream, | 
					
						
							|  |  |  | 						  void                 *buffer, | 
					
						
							|  |  |  | 						  gsize                 count, | 
					
						
							|  |  |  | 						  GCancellable         *cancellable, | 
					
						
							|  |  |  | 						  GError              **error); | 
					
						
							|  |  |  | static gboolean g_unix_input_stream_close        (GInputStream         *stream, | 
					
						
							|  |  |  | 						  GCancellable         *cancellable, | 
					
						
							|  |  |  | 						  GError              **error); | 
					
						
							|  |  |  | static void     g_unix_input_stream_skip_async   (GInputStream         *stream, | 
					
						
							|  |  |  | 						  gsize                 count, | 
					
						
							|  |  |  | 						  int                   io_priority, | 
					
						
							|  |  |  | 						  GCancellable         *cancellable, | 
					
						
							|  |  |  | 						  GAsyncReadyCallback   callback, | 
					
						
							|  |  |  | 						  gpointer              data); | 
					
						
							|  |  |  | static gssize   g_unix_input_stream_skip_finish  (GInputStream         *stream, | 
					
						
							|  |  |  | 						  GAsyncResult         *result, | 
					
						
							|  |  |  | 						  GError              **error); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-04 16:46:29 -05:00
										 |  |  | static gboolean g_unix_input_stream_pollable_can_poll      (GPollableInputStream *stream); | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | static gboolean g_unix_input_stream_pollable_is_readable   (GPollableInputStream *stream); | 
					
						
							|  |  |  | static GSource *g_unix_input_stream_pollable_create_source (GPollableInputStream *stream, | 
					
						
							|  |  |  | 							    GCancellable         *cancellable); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | g_unix_input_stream_class_init (GUnixInputStreamClass *klass) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   GObjectClass *gobject_class = G_OBJECT_CLASS (klass); | 
					
						
							|  |  |  |   GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass); | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   gobject_class->get_property = g_unix_input_stream_get_property; | 
					
						
							|  |  |  |   gobject_class->set_property = g_unix_input_stream_set_property; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-05 10:38:03 +00:00
										 |  |  |   stream_class->read_fn = g_unix_input_stream_read; | 
					
						
							|  |  |  |   stream_class->close_fn = g_unix_input_stream_close; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   if (0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       /* TODO: Implement instead of using fallbacks */ | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |       stream_class->skip_async = g_unix_input_stream_skip_async; | 
					
						
							|  |  |  |       stream_class->skip_finish = g_unix_input_stream_skip_finish; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /**
 | 
					
						
							|  |  |  |    * GUnixInputStream:fd: | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    * The file descriptor that the stream reads from. | 
					
						
							|  |  |  |    * | 
					
						
							|  |  |  |    * Since: 2.20 | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   g_object_class_install_property (gobject_class, | 
					
						
							|  |  |  | 				   PROP_FD, | 
					
						
							| 
									
										
										
										
											2023-04-28 01:59:26 +02:00
										 |  |  | 				   g_param_spec_int ("fd", NULL, NULL, | 
					
						
							| 
									
										
										
										
											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)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /**
 | 
					
						
							|  |  |  |    * GUnixInputStream: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, | 
					
						
							| 
									
										
										
										
											2023-04-28 01:59:26 +02:00
										 |  |  | 				   g_param_spec_boolean ("close-fd", NULL, NULL, | 
					
						
							| 
									
										
										
										
											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_input_stream_pollable_iface_init (GPollableInputStreamInterface *iface) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-02-04 16:46:29 -05:00
										 |  |  |   iface->can_poll = g_unix_input_stream_pollable_can_poll; | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  |   iface->is_readable = g_unix_input_stream_pollable_is_readable; | 
					
						
							|  |  |  |   iface->create_source = g_unix_input_stream_pollable_create_source; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-03 09:03:17 -04:00
										 |  |  | static void | 
					
						
							|  |  |  | g_unix_input_stream_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   iface->get_fd = (int (*) (GFileDescriptorBased *))g_unix_input_stream_get_fd; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | g_unix_input_stream_set_property (GObject         *object, | 
					
						
							|  |  |  | 				  guint            prop_id, | 
					
						
							|  |  |  | 				  const GValue    *value, | 
					
						
							|  |  |  | 				  GParamSpec      *pspec) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GUnixInputStream *unix_stream; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   unix_stream = G_UNIX_INPUT_STREAM (object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   switch (prop_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     case PROP_FD: | 
					
						
							|  |  |  |       unix_stream->priv->fd = g_value_get_int (value); | 
					
						
							| 
									
										
										
										
											2021-01-19 22:14:41 +01:00
										 |  |  |       unix_stream->priv->can_poll = _g_fd_is_pollable (unix_stream->priv->fd); | 
					
						
							| 
									
										
										
										
											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_input_stream_get_property (GObject    *object, | 
					
						
							|  |  |  | 				  guint       prop_id, | 
					
						
							|  |  |  | 				  GValue     *value, | 
					
						
							|  |  |  | 				  GParamSpec *pspec) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GUnixInputStream *unix_stream; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   unix_stream = G_UNIX_INPUT_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_input_stream_init (GUnixInputStream *unix_stream) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-06-24 15:43:04 +01:00
										 |  |  |   unix_stream->priv = g_unix_input_stream_get_instance_private (unix_stream); | 
					
						
							| 
									
										
										
										
											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_input_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-26 16:13:05 +00:00
										 |  |  |  *  | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |  * Creates a new #GUnixInputStream for the given @fd.  | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * If @close_fd is %TRUE, the file descriptor will be closed  | 
					
						
							|  |  |  |  * when the stream is closed. | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  *  | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |  * Returns: a new #GUnixInputStream | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |  **/ | 
					
						
							|  |  |  | GInputStream * | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | g_unix_input_stream_new (gint     fd, | 
					
						
							|  |  |  | 			 gboolean close_fd) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   GUnixInputStream *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_INPUT_STREAM, | 
					
						
							|  |  |  | 			 "fd", fd, | 
					
						
							|  |  |  | 			 "close-fd", close_fd, | 
					
						
							|  |  |  | 			 NULL); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return G_INPUT_STREAM (stream); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * g_unix_input_stream_set_close_fd: | 
					
						
							|  |  |  |  * @stream: a #GUnixInputStream | 
					
						
							|  |  |  |  * @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_input_stream_set_close_fd (GUnixInputStream *stream, | 
					
						
							|  |  |  | 				  gboolean          close_fd) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   g_return_if_fail (G_IS_UNIX_INPUT_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_input_stream_get_close_fd: | 
					
						
							|  |  |  |  * @stream: a #GUnixInputStream | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Returns whether the file descriptor of @stream will be | 
					
						
							|  |  |  |  * closed when the stream is closed. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2014-02-19 19:35:23 -05:00
										 |  |  |  * Returns: %TRUE if the file descriptor is closed when done | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.20 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | gboolean | 
					
						
							|  |  |  | g_unix_input_stream_get_close_fd (GUnixInputStream *stream) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   g_return_val_if_fail (G_IS_UNIX_INPUT_STREAM (stream), FALSE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return stream->priv->close_fd; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * g_unix_input_stream_get_fd: | 
					
						
							|  |  |  |  * @stream: a #GUnixInputStream | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Return the UNIX file descriptor that the stream reads from. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2014-02-19 19:35:23 -05:00
										 |  |  |  * Returns: The file descriptor of @stream | 
					
						
							| 
									
										
										
										
											2008-12-08 05:41:43 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Since: 2.20 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | gint | 
					
						
							|  |  |  | g_unix_input_stream_get_fd (GUnixInputStream *stream) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   g_return_val_if_fail (G_IS_UNIX_INPUT_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_input_stream_read (GInputStream  *stream, | 
					
						
							|  |  |  | 			  void          *buffer, | 
					
						
							|  |  |  | 			  gsize          count, | 
					
						
							|  |  |  | 			  GCancellable  *cancellable, | 
					
						
							|  |  |  | 			  GError       **error) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   GUnixInputStream *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_INPUT_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_IN; | 
					
						
							| 
									
										
										
										
											2021-01-19 22:14:41 +01:00
										 |  |  |   if (unix_stream->priv->can_poll && | 
					
						
							| 
									
										
										
										
											2010-04-27 16:54:18 -04:00
										 |  |  |       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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-07-31 11:30:55 +01:00
										 |  |  |       int errsv; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2017-07-31 11:30:55 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |           poll_ret = g_poll (poll_fds, nfds, -1); | 
					
						
							|  |  |  |           errsv = errno; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       while (poll_ret == -1 && errsv == EINTR); | 
					
						
							| 
									
										
										
										
											2009-08-11 15:12:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |       if (poll_ret == -1) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	  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 reading from 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
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       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-27 15:08:03 +00:00
										 |  |  |       res = read (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 reading from 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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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_input_stream_close (GInputStream  *stream, | 
					
						
							|  |  |  | 			   GCancellable  *cancellable, | 
					
						
							|  |  |  | 			   GError       **error) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   GUnixInputStream *unix_stream; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   int res; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  |   unix_stream = G_UNIX_INPUT_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; | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2012-08-02 15:49:59 -04:00
										 |  |  |   /* This might block during the close. Doesn't seem to be a way to avoid it though. */ | 
					
						
							|  |  |  |   res = close (unix_stream->priv->fd); | 
					
						
							|  |  |  |   if (res == -1) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-08-02 15:49:59 -04:00
										 |  |  |       int errsv = errno; | 
					
						
							| 
									
										
											  
											
												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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-02 15:49:59 -04:00
										 |  |  |       g_set_error (error, G_IO_ERROR, | 
					
						
							|  |  |  | 		   g_io_error_from_errno (errsv), | 
					
						
							|  |  |  | 		   _("Error closing file descriptor: %s"), | 
					
						
							|  |  |  | 		   g_strerror (errsv)); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   return res != -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-27 15:08:03 +00:00
										 |  |  | g_unix_input_stream_skip_async (GInputStream        *stream, | 
					
						
							|  |  |  | 				gsize                count, | 
					
						
							|  |  |  | 				int                  io_priority, | 
					
						
							|  |  |  | 				GCancellable        *cancellable, | 
					
						
							|  |  |  | 				GAsyncReadyCallback  callback, | 
					
						
							|  |  |  | 				gpointer             data) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-12-10 14:07:42 +00:00
										 |  |  |   g_warn_if_reached (); | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   /* TODO: Not implemented */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gssize | 
					
						
							| 
									
										
										
										
											2007-11-30 05:11:25 +00:00
										 |  |  | g_unix_input_stream_skip_finish  (GInputStream  *stream, | 
					
						
							|  |  |  | 				  GAsyncResult  *result, | 
					
						
							|  |  |  | 				  GError       **error) | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-12-10 14:07:42 +00:00
										 |  |  |   g_warn_if_reached (); | 
					
						
							| 
									
										
										
										
											2008-01-07 13:58:37 +00:00
										 |  |  |   return 0; | 
					
						
							| 
									
										
										
										
											2007-11-26 16:13:05 +00:00
										 |  |  |   /* TODO: Not implemented */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-04 16:46:29 -05:00
										 |  |  | static gboolean | 
					
						
							|  |  |  | g_unix_input_stream_pollable_can_poll (GPollableInputStream *stream) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-01-19 22:14:41 +01:00
										 |  |  |   return G_UNIX_INPUT_STREAM (stream)->priv->can_poll; | 
					
						
							| 
									
										
										
										
											2012-02-04 16:46:29 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | static gboolean | 
					
						
							|  |  |  | g_unix_input_stream_pollable_is_readable (GPollableInputStream *stream) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GUnixInputStream *unix_stream = G_UNIX_INPUT_STREAM (stream); | 
					
						
							|  |  |  |   GPollFD poll_fd; | 
					
						
							|  |  |  |   gint result; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   poll_fd.fd = unix_stream->priv->fd; | 
					
						
							|  |  |  |   poll_fd.events = G_IO_IN; | 
					
						
							| 
									
										
										
										
											2012-11-09 09:22:19 -08:00
										 |  |  |   poll_fd.revents = 0; | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   do | 
					
						
							|  |  |  |     result = g_poll (&poll_fd, 1, 0); | 
					
						
							|  |  |  |   while (result == -1 && errno == EINTR); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return poll_fd.revents != 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static GSource * | 
					
						
							|  |  |  | g_unix_input_stream_pollable_create_source (GPollableInputStream *stream, | 
					
						
							|  |  |  | 					    GCancellable         *cancellable) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GUnixInputStream *unix_stream = G_UNIX_INPUT_STREAM (stream); | 
					
						
							| 
									
										
										
										
											2013-06-01 15:24:13 -03:00
										 |  |  |   GSource *inner_source, *cancellable_source, *pollable_source; | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   pollable_source = g_pollable_source_new (G_OBJECT (stream)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 15:24:13 -03:00
										 |  |  |   inner_source = g_unix_fd_source_new (unix_stream->priv->fd, G_IO_IN); | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  |   g_source_set_dummy_callback (inner_source); | 
					
						
							|  |  |  |   g_source_add_child_source (pollable_source, inner_source); | 
					
						
							|  |  |  |   g_source_unref (inner_source); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 15:24:13 -03:00
										 |  |  |   if (cancellable) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       cancellable_source = g_cancellable_source_new (cancellable); | 
					
						
							|  |  |  |       g_source_set_dummy_callback (cancellable_source); | 
					
						
							|  |  |  |       g_source_add_child_source (pollable_source, cancellable_source); | 
					
						
							|  |  |  |       g_source_unref (cancellable_source); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-18 13:05:25 -04:00
										 |  |  |   return pollable_source; | 
					
						
							|  |  |  | } |