diff options
author | Owen Taylor <otaylor@redhat.com> | 2003-05-30 21:11:08 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2003-05-30 21:11:08 +0000 |
commit | e41ebdcfcd6c7eeefafe00b4d983aa0c4855d312 (patch) | |
tree | 0b5a2ff2a0fe105721c712519e60ec3bc6864c1f /glib/giochannel.c | |
parent | 9ff5d0eeed62eef76c70cece2fb0601580afb85b (diff) | |
download | glib-e41ebdcfcd6c7eeefafe00b4d983aa0c4855d312.tar.gz |
Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR, since close() can
Fri May 30 16:48:26 2003 Owen Taylor <otaylor@redhat.com>
* glib/giochannel.c (g_io_channel_error_from_errno):
Silently return G_IO_CHANNEL_ERROR_FAILED for EINTR,
since close() can return EINTR. (#11842, Balazs Scheidler)
Diffstat (limited to 'glib/giochannel.c')
-rw-r--r-- | glib/giochannel.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/glib/giochannel.c b/glib/giochannel.c index 4bbda0971..caa817e6f 100644 --- a/glib/giochannel.c +++ b/glib/giochannel.c @@ -547,9 +547,6 @@ g_io_channel_error_from_errno (gint en) #ifdef EAGAIN g_return_val_if_fail (en != EAGAIN, G_IO_CHANNEL_ERROR_FAILED); #endif -#ifdef EINTR - g_return_val_if_fail (en != EINTR, G_IO_CHANNEL_ERROR_FAILED); -#endif switch (en) { @@ -570,6 +567,18 @@ g_io_channel_error_from_errno (gint en) return G_IO_CHANNEL_ERROR_FBIG; #endif +#ifdef EINTR + /* In general, we should catch EINTR before we get here, + * but close() is allowed to return EINTR by POSIX, so + * we need to catch it here; EINTR from close() is + * unrecoverable, because it's undefined whether + * the fd was actually closed or not, so we just return + * a generic error code. + */ + case EINTR: + return G_IO_CHANNEL_ERROR_FAILED; +#endif + #ifdef EINVAL case EINVAL: return G_IO_CHANNEL_ERROR_INVAL; |