diff options
| author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-04-23 14:17:50 +0000 | 
|---|---|---|
| committer | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-04-23 14:17:50 +0000 | 
| commit | b47a2a08851a5bacc0e2498846db25d8837ba069 (patch) | |
| tree | 827627365f909cf7290a7f29a1062284bafb98d1 /eglib/gmain.c | |
| parent | 56eba24d02bc70648c9f7da5a13ded03bccf8a2f (diff) | |
Introduce g_io_channel_set_flags to eglib.
Diffstat (limited to 'eglib/gmain.c')
| -rw-r--r-- | eglib/gmain.c | 46 | 
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; | 
