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 | |
| parent | 56eba24d02bc70648c9f7da5a13ded03bccf8a2f (diff) | |
Introduce g_io_channel_set_flags to eglib.
| -rw-r--r-- | eglib/gmain.c | 46 | ||||
| -rw-r--r-- | eglib/gmain.h | 43 | 
2 files changed, 74 insertions, 15 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; diff --git a/eglib/gmain.h b/eglib/gmain.h index 15b6c072..b7b93072 100644 --- a/eglib/gmain.h +++ b/eglib/gmain.h @@ -58,6 +58,17 @@ typedef enum {  	G_IO_STATUS_AGAIN	= 2  } GIOStatus; +typedef enum { +	G_IO_FLAG_APPEND	= 1 << 0, +	G_IO_FLAG_NONBLOCK	= 1 << 1, +	G_IO_FLAG_IS_READABLE	= 1 << 2, +	G_IO_FLAG_IS_WRITEABLE	= 1 << 3, +	G_IO_FLAG_IS_SEEKABLE	= 1 << 4, +	G_IO_FLAG_MASK		= (1 << 5) - 1, +	G_IO_FLAG_GET_MASK	= G_IO_FLAG_MASK, +	G_IO_FLAG_SET_MASK	= G_IO_FLAG_APPEND | G_IO_FLAG_NONBLOCK +} GIOFlags; +  #ifndef FALSE  #define FALSE (0)  #endif @@ -78,6 +89,21 @@ typedef enum {  #undef CLAMP  #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) +/* GError */ + +typedef guint32 GQuark; + +typedef struct { +	GQuark       domain; +	gint         code; +	gchar       *message; +} GError; + +void g_set_error(GError **err, GQuark domain, gint code, +			const gchar *format, ...); +GError* g_error_new_literal(GQuark domain, gint code, const gchar *message); +void g_error_free(GError *err); +  typedef enum {  	G_IO_IN		= POLLIN,  	G_IO_OUT	= POLLOUT, @@ -109,6 +135,8 @@ GIOChannel *g_io_channel_ref(GIOChannel *channel);  void g_io_channel_unref(GIOChannel *channel);  void g_io_channel_set_close_on_unref(GIOChannel *channel, gboolean do_close);  gint g_io_channel_unix_get_fd(GIOChannel *channel); +GIOStatus g_io_channel_set_flags(GIOChannel *channel, GIOFlags flags, +				GError **error);  guint g_io_add_watch(GIOChannel *channel, GIOCondition condition,  					GIOFunc func, gpointer user_data);  guint g_io_add_watch_full(GIOChannel *channel, gint priority, @@ -123,21 +151,6 @@ guint g_timeout_add(guint interval, GSourceFunc function, gpointer data);  guint g_idle_add(GSourceFunc function, gpointer data);  gboolean g_source_remove(guint tag); -/* GError */ - -typedef guint32 GQuark; - -typedef struct { -	GQuark       domain; -	gint         code; -	gchar       *message; -} GError; - -void g_set_error(GError **err, GQuark domain, gint code, -			const gchar *format, ...); -GError* g_error_new_literal(GQuark domain, gint code, const gchar *message); -void g_error_free(GError *err); -  /* Spawning related functions */  typedef enum { | 
