summaryrefslogtreecommitdiffstats
path: root/common/glib-ectomy.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/glib-ectomy.c')
-rw-r--r--common/glib-ectomy.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/common/glib-ectomy.c b/common/glib-ectomy.c
index 41641ee6..33d20533 100644
--- a/common/glib-ectomy.c
+++ b/common/glib-ectomy.c
@@ -24,6 +24,11 @@ struct timeout {
GSourceFunc function;
};
+struct _GIOChannel {
+ int fd;
+ gboolean close_on_unref;
+};
+
struct _GMainContext {
guint next_id;
glong next_timeout;
@@ -82,8 +87,17 @@ void g_io_channel_close(GIOChannel *channel)
return;
close(channel->fd);
+ channel->fd = -1;
+}
+
+void g_io_channel_unref(GIOChannel *channel)
+{
+ if (!channel)
+ return;
+
+ if (channel->close_on_unref && channel->fd >= 0)
+ g_io_channel_close(channel);
- memset(channel, 0, sizeof(channel));
free(channel);
}
@@ -95,11 +109,18 @@ GIOChannel *g_io_channel_unix_new(int fd)
if (!channel)
return NULL;
+ memset(channel, 0, sizeof(GIOChannel));
+
channel->fd = fd;
return channel;
}
+void g_io_channel_set_close_on_unref(GIOChannel *channel, gboolean do_close)
+{
+ channel->close_on_unref = do_close;
+}
+
gint g_io_channel_unix_get_fd(GIOChannel *channel)
{
return channel->fd;