summaryrefslogtreecommitdiff
path: root/glib/giochannel.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2003-05-30 21:11:08 +0000
committerOwen Taylor <otaylor@src.gnome.org>2003-05-30 21:11:08 +0000
commite41ebdcfcd6c7eeefafe00b4d983aa0c4855d312 (patch)
tree0b5a2ff2a0fe105721c712519e60ec3bc6864c1f /glib/giochannel.c
parent9ff5d0eeed62eef76c70cece2fb0601580afb85b (diff)
downloadglib-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.c15
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;