summaryrefslogtreecommitdiffstats
path: root/eglib/gmain.c
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-04-23 14:17:50 +0000
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-04-23 14:17:50 +0000
commitb47a2a08851a5bacc0e2498846db25d8837ba069 (patch)
tree827627365f909cf7290a7f29a1062284bafb98d1 /eglib/gmain.c
parent56eba24d02bc70648c9f7da5a13ded03bccf8a2f (diff)
Introduce g_io_channel_set_flags to eglib.
Diffstat (limited to 'eglib/gmain.c')
-rw-r--r--eglib/gmain.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/eglib/gmain.c b/eglib/gmain.c
index b51da600..8071c62b 100644
--- a/eglib/gmain.c
+++ b/eglib/gmain.c
@@ -201,6 +201,52 @@ gint g_io_channel_unix_get_fd(GIOChannel *channel)
return channel->fd;
}
+static int set_flags(int fd, long flags)
+{
+ long arg;
+
+ arg = fcntl(fd, F_GETFL);
+ if (arg < 0)
+ return -errno;
+
+ /* Return if already set */
+ if ((arg & flags) == flags)
+ return 0;
+
+ arg |= flags;
+ if (fcntl(fd, F_SETFL, arg) < 0)
+ return -errno;
+
+ return 0;
+}
+
+GIOStatus g_io_channel_set_flags(GIOChannel *channel, GIOFlags flags,
+ GError **error)
+{
+ int err, fd;
+ long fd_flags = 0;
+
+ if (!channel || channel->closed)
+ return G_IO_STATUS_ERROR;
+
+ fd = g_io_channel_unix_get_fd(channel);
+
+ if (flags & G_IO_FLAG_APPEND)
+ fd_flags |= O_APPEND;
+ if (flags & G_IO_FLAG_NONBLOCK)
+ fd_flags |= O_NONBLOCK;
+
+ err = set_flags(fd, fd_flags);
+ if (err < 0) {
+ if (error)
+ g_set_error(error, 0, 0, "Unable to set flags: %s",
+ strerror(-err));
+ return G_IO_STATUS_ERROR;
+ }
+
+ return G_IO_STATUS_NORMAL;
+}
+
struct io_watch {
guint id;
GIOChannel *channel;