From b47a2a08851a5bacc0e2498846db25d8837ba069 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 23 Apr 2008 14:17:50 +0000 Subject: Introduce g_io_channel_set_flags to eglib. --- eglib/gmain.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'eglib/gmain.c') 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; -- cgit