summaryrefslogtreecommitdiff
path: root/gio
diff options
context:
space:
mode:
authorMatthias Clasen <matthiasc@src.gnome.org>2008-12-08 05:41:43 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2008-12-08 05:41:43 +0000
commitb047087ac3c9d82dfb27e952e59934a09d801fb5 (patch)
tree544a976ae3b06b548cab18309755e87f88fc2e26 /gio
parentb2f0d44acbf4917547ba2bd5b891305bf23f16b1 (diff)
Add "fd" and "close-fd" properties including getters and setters. Patch by
* gio.symbols: * gunixinputstream.[hc]: * gunixoutputstream.[hc]: Add "fd" and "close-fd" properties including getters and setters. Patch by Maciej Piechotka svn path=/trunk/; revision=7735
Diffstat (limited to 'gio')
-rw-r--r--gio/ChangeLog10
-rw-r--r--gio/gio.symbols6
-rw-r--r--gio/gunixinputstream.c193
-rw-r--r--gio/gunixinputstream.h10
-rw-r--r--gio/gunixoutputstream.c191
-rw-r--r--gio/gunixoutputstream.h11
6 files changed, 380 insertions, 41 deletions
diff --git a/gio/ChangeLog b/gio/ChangeLog
index b5c820596..7c69a9af4 100644
--- a/gio/ChangeLog
+++ b/gio/ChangeLog
@@ -1,3 +1,13 @@
+2008-12-08 Matthias Clasen <mclasen@redhat.com>
+
+ Bug 555465 – GUnix{Input,Output}Stream lacks fd/close_fd_at_close
+ property
+
+ * gio.symbols:
+ * gunixinputstream.[hc]:
+ * gunixoutputstream.[hc]: Add "fd" and "close-fd" properties
+ including getters and setters. Patch by Maciej Piechotka
+
2008-12-07 Matthias Clasen <mclasen@redhat.com>
Bug 558458 – Cannot build gio tests on Solaris using SUN cc
diff --git a/gio/gio.symbols b/gio/gio.symbols
index 625666681..f074ee278 100644
--- a/gio/gio.symbols
+++ b/gio/gio.symbols
@@ -694,6 +694,9 @@ g_unix_is_mount_path_system_internal
#ifdef G_OS_UNIX
g_unix_input_stream_get_type G_GNUC_CONST
g_unix_input_stream_new
+g_unix_input_stream_set_close_fd
+g_unix_input_stream_get_close_fd
+g_unix_input_stream_get_fd
#endif /* G_OS_UNIX */
#endif
#endif
@@ -703,6 +706,9 @@ g_unix_input_stream_new
#ifdef G_OS_UNIX
g_unix_output_stream_get_type G_GNUC_CONST
g_unix_output_stream_new
+g_unix_output_stream_set_close_fd
+g_unix_output_stream_get_close_fd
+g_unix_output_stream_get_fd
#endif /* G_OS_UNIX */
#endif
#endif
diff --git a/gio/gunixinputstream.c b/gio/gunixinputstream.c
index da9c8f413..13f5906ab 100644
--- a/gio/gunixinputstream.c
+++ b/gio/gunixinputstream.c
@@ -42,22 +42,36 @@
/**
* SECTION:gunixinputstream
- * @short_description: Streaming input operations for Unix file descriptors
+ * @short_description: Streaming input operations for UNIX file descriptors
* @include: gio/gunixinputstream.h
* @see_also: #GInputStream
*
* #GUnixInputStream implements #GInputStream for reading from a
- * unix file descriptor, including asynchronous operations. The file
+ * UNIX file descriptor, including asynchronous operations. The file
* descriptor must be selectable, so it doesn't work with opened files.
**/
+enum {
+ PROP_0,
+ PROP_FD,
+ PROP_CLOSE_FD
+};
+
G_DEFINE_TYPE (GUnixInputStream, g_unix_input_stream, G_TYPE_INPUT_STREAM);
struct _GUnixInputStreamPrivate {
int fd;
- gboolean close_fd_at_close;
+ gboolean close_fd;
};
+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);
static gssize g_unix_input_stream_read (GInputStream *stream,
void *buffer,
gsize count,
@@ -112,7 +126,9 @@ g_unix_input_stream_class_init (GUnixInputStreamClass *klass)
GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass);
g_type_class_add_private (klass, sizeof (GUnixInputStreamPrivate));
-
+
+ gobject_class->get_property = g_unix_input_stream_get_property;
+ gobject_class->set_property = g_unix_input_stream_set_property;
gobject_class->finalize = g_unix_input_stream_finalize;
stream_class->read_fn = g_unix_input_stream_read;
@@ -127,6 +143,83 @@ g_unix_input_stream_class_init (GUnixInputStreamClass *klass)
}
stream_class->close_async = g_unix_input_stream_close_async;
stream_class->close_finish = g_unix_input_stream_close_finish;
+
+ /**
+ * GUnixInputStream:fd:
+ *
+ * The file descriptor that the stream reads from.
+ *
+ * Since: 2.20
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_FD,
+ g_param_spec_int ("fd",
+ _("File descriptor"),
+ _("The file descriptor to read from"),
+ 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,
+ g_param_spec_boolean ("close-fd",
+ _("Close file descriptor"),
+ _("Whether to close the file descriptor when the stream is closed"),
+ TRUE,
+ G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+}
+
+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);
+ 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);
+ }
}
static void
@@ -135,34 +228,100 @@ g_unix_input_stream_init (GUnixInputStream *unix_stream)
unix_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (unix_stream,
G_TYPE_UNIX_INPUT_STREAM,
GUnixInputStreamPrivate);
+
+ unix_stream->priv->fd = -1;
+ unix_stream->priv->close_fd = TRUE;
}
/**
* g_unix_input_stream_new:
- * @fd: unix file descriptor.
- * @close_fd_at_close: a #gboolean.
+ * @fd: a UNIX file descriptor
+ * @close_fd: %TRUE to close the file descriptor when done
*
- * Creates a new #GUnixInputStream for the given @fd. If @close_fd_at_close
- * is %TRUE, the file descriptor will be closed when the stream is closed.
+ * Creates a new #GUnixInputStream for the given @fd.
+ *
+ * If @close_fd is %TRUE, the file descriptor will be closed
+ * when the stream is closed.
*
- * Returns: a #GUnixInputStream.
+ * Returns: a new #GUnixInputStream
**/
GInputStream *
-g_unix_input_stream_new (int fd,
- gboolean close_fd_at_close)
+g_unix_input_stream_new (gint fd,
+ gboolean close_fd)
{
GUnixInputStream *stream;
g_return_val_if_fail (fd != -1, NULL);
- stream = g_object_new (G_TYPE_UNIX_INPUT_STREAM, NULL);
+ stream = g_object_new (G_TYPE_UNIX_INPUT_STREAM,
+ "fd", fd,
+ "close-fd", close_fd,
+ NULL);
- stream->priv->fd = fd;
- stream->priv->close_fd_at_close = close_fd_at_close;
-
return G_INPUT_STREAM (stream);
}
+/**
+ * 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.
+ *
+ * Return value: %TRUE if the file descriptor is closed when done
+ *
+ * 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.
+ *
+ * Return value: The file descriptor of @stream
+ *
+ * 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;
+}
+
static gssize
g_unix_input_stream_read (GInputStream *stream,
void *buffer,
@@ -232,7 +391,7 @@ g_unix_input_stream_close (GInputStream *stream,
unix_stream = G_UNIX_INPUT_STREAM (stream);
- if (!unix_stream->priv->close_fd_at_close)
+ if (!unix_stream->priv->close_fd)
return TRUE;
while (1)
@@ -412,7 +571,7 @@ close_async_cb (CloseAsyncData *data)
unix_stream = G_UNIX_INPUT_STREAM (data->stream);
- if (!unix_stream->priv->close_fd_at_close)
+ if (!unix_stream->priv->close_fd)
{
result = TRUE;
goto out;
diff --git a/gio/gunixinputstream.h b/gio/gunixinputstream.h
index 9d80f01fe..cbdbe5449 100644
--- a/gio/gunixinputstream.h
+++ b/gio/gunixinputstream.h
@@ -64,10 +64,14 @@ struct _GUnixInputStreamClass
void (*_g_reserved5) (void);
};
-GType g_unix_input_stream_get_type (void) G_GNUC_CONST;
+GType g_unix_input_stream_get_type (void) G_GNUC_CONST;
-GInputStream * g_unix_input_stream_new (int fd,
- gboolean close_fd_at_close);
+GInputStream * g_unix_input_stream_new (gint fd,
+ gboolean close_fd);
+void g_unix_input_stream_set_close_fd (GUnixInputStream *stream,
+ gboolean close_fd);
+gboolean g_unix_input_stream_get_close_fd (GUnixInputStream *stream);
+gint g_unix_input_stream_get_fd (GUnixInputStream *stream);
G_END_DECLS
diff --git a/gio/gunixoutputstream.c b/gio/gunixoutputstream.c
index ebf17ded6..83a85a8a2 100644
--- a/gio/gunixoutputstream.c
+++ b/gio/gunixoutputstream.c
@@ -51,14 +51,28 @@
* descriptor must be selectable, so it doesn't work with opened files.
**/
+enum {
+ PROP_0,
+ PROP_FD,
+ PROP_CLOSE_FD
+};
+
G_DEFINE_TYPE (GUnixOutputStream, g_unix_output_stream, G_TYPE_OUTPUT_STREAM);
struct _GUnixOutputStreamPrivate {
int fd;
- gboolean close_fd_at_close;
+ gboolean close_fd;
};
+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);
static gssize g_unix_output_stream_write (GOutputStream *stream,
const void *buffer,
gsize count,
@@ -104,7 +118,9 @@ g_unix_output_stream_class_init (GUnixOutputStreamClass *klass)
GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS (klass);
g_type_class_add_private (klass, sizeof (GUnixOutputStreamPrivate));
-
+
+ gobject_class->get_property = g_unix_output_stream_get_property;
+ gobject_class->set_property = g_unix_output_stream_set_property;
gobject_class->finalize = g_unix_output_stream_finalize;
stream_class->write_fn = g_unix_output_stream_write;
@@ -113,6 +129,83 @@ g_unix_output_stream_class_init (GUnixOutputStreamClass *klass)
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;
+
+ /**
+ * 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",
+ _("File descriptor"),
+ _("The file descriptor to write to"),
+ 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",
+ _("Close file descriptor"),
+ _("Whether to close the file descriptor when the stream is closed"),
+ TRUE,
+ G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+}
+
+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);
+ 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);
+ }
}
static void
@@ -121,36 +214,100 @@ g_unix_output_stream_init (GUnixOutputStream *unix_stream)
unix_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (unix_stream,
G_TYPE_UNIX_OUTPUT_STREAM,
GUnixOutputStreamPrivate);
-}
+ unix_stream->priv->fd = -1;
+ unix_stream->priv->close_fd = TRUE;
+}
/**
* g_unix_output_stream_new:
- * @fd: unix's file descriptor.
- * @close_fd_at_close: a #gboolean.
+ * @fd: a UNIX file descriptor
+ * @close_fd: %TRUE to close the file descriptor when done
*
- * Creates a new unix output stream for @fd. If @close_fd_at_close
- * is %TRUE, the fd will be closed when the output stream is destroyed.
+ * Creates a new #GUnixOutputStream for the given @fd.
*
- * Returns: #GOutputStream. If @close_fd_at_close is %TRUE, then
- * @fd will be closed when the #GOutputStream is closed.
+ * If @close_fd, is %TRUE, the file descriptor will be closed when
+ * the output stream is destroyed.
+ *
+ * Returns: a new #GOutputStream
**/
GOutputStream *
-g_unix_output_stream_new (int fd,
- gboolean close_fd_at_close)
+g_unix_output_stream_new (gint fd,
+ gboolean close_fd)
{
GUnixOutputStream *stream;
g_return_val_if_fail (fd != -1, NULL);
- stream = g_object_new (G_TYPE_UNIX_OUTPUT_STREAM, NULL);
-
- stream->priv->fd = fd;
- stream->priv->close_fd_at_close = close_fd_at_close;
+ stream = g_object_new (G_TYPE_UNIX_OUTPUT_STREAM,
+ "fd", fd,
+ "close-fd", close_fd,
+ NULL);
return G_OUTPUT_STREAM (stream);
}
+/**
+ * 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;
+}
+
static gssize
g_unix_output_stream_write (GOutputStream *stream,
const void *buffer,
@@ -221,7 +378,7 @@ g_unix_output_stream_close (GOutputStream *stream,
unix_stream = G_UNIX_OUTPUT_STREAM (stream);
- if (!unix_stream->priv->close_fd_at_close)
+ if (!unix_stream->priv->close_fd)
return TRUE;
while (1)
@@ -370,7 +527,7 @@ close_async_cb (CloseAsyncData *data)
unix_stream = G_UNIX_OUTPUT_STREAM (data->stream);
- if (!unix_stream->priv->close_fd_at_close)
+ if (!unix_stream->priv->close_fd)
{
result = TRUE;
goto out;
diff --git a/gio/gunixoutputstream.h b/gio/gunixoutputstream.h
index 485643dfc..ad4292388 100644
--- a/gio/gunixoutputstream.h
+++ b/gio/gunixoutputstream.h
@@ -64,11 +64,14 @@ struct _GUnixOutputStreamClass
void (*_g_reserved5) (void);
};
-GType g_unix_output_stream_get_type (void) G_GNUC_CONST;
-
-GOutputStream * g_unix_output_stream_new (int fd,
- gboolean close_fd_at_close);
+GType g_unix_output_stream_get_type (void) G_GNUC_CONST;
+GOutputStream * g_unix_output_stream_new (gint fd,
+ gboolean close_fd);
+void g_unix_output_stream_set_close_fd (GUnixOutputStream *stream,
+ gboolean close_fd);
+gboolean g_unix_output_stream_get_close_fd (GUnixOutputStream *stream);
+gint g_unix_output_stream_get_fd (GUnixOutputStream *stream);
G_END_DECLS
#endif /* __G_UNIX_OUTPUT_STREAM_H__ */