aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-12-15 11:24:35 +1000
committerSteve Bennett <steveb@workware.net.au>2011-12-16 13:10:13 +1000
commit1209055595c76e7faae95cb22e683215654f91cc (patch)
tree91c472b93ef959b2258c9d35fa2dc7ca7baed4c1
parent4f78258d1d59b0bbf5e526b2aa13711881e47c91 (diff)
downloadjimtcl-1209055595c76e7faae95cb22e683215654f91cc.zip
jimtcl-1209055595c76e7faae95cb22e683215654f91cc.tar.gz
jimtcl-1209055595c76e7faae95cb22e683215654f91cc.tar.bz2
Better error/eof detection in aio
On cygwin, ECONNRESET can happen when the other end closes the connection. Treat it like EOF. Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jim-aio.c40
1 files changed, 28 insertions, 12 deletions
diff --git a/jim-aio.c b/jim-aio.c
index 7855317..143289a 100644
--- a/jim-aio.c
+++ b/jim-aio.c
@@ -298,6 +298,30 @@ static void JimAioDelProc(Jim_Interp *interp, void *privData)
Jim_Free(af);
}
+static int JimCheckStreamError(Jim_Interp *interp, AioFile *af)
+{
+ if (!ferror(af->fp)) {
+ return JIM_OK;
+ }
+ clearerr(af->fp);
+ /* EAGAIN and similar are not error conditions. Just treat them like eof */
+ if (feof(af->fp) || errno == EAGAIN || errno == EINTR) {
+ return JIM_OK;
+ }
+#ifdef ECONNRESET
+ if (errno == ECONNRESET) {
+ return JIM_OK;
+ }
+#endif
+#ifdef ECONNABORTED
+ if (errno != ECONNABORTED) {
+ return JIM_OK;
+ }
+#endif
+ JimAioSetError(interp, af->filename);
+ return JIM_ERR;
+}
+
static int aio_cmd_read(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
AioFile *af = Jim_CmdPrivData(interp);
@@ -347,15 +371,9 @@ static int aio_cmd_read(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
break;
}
/* Check for error conditions */
- if (ferror(af->fp)) {
- clearerr(af->fp);
- /* eof and EAGAIN are not error conditions */
- if (!feof(af->fp) && errno != EAGAIN) {
- /* I/O error */
- Jim_FreeNewObj(interp, objPtr);
- JimAioSetError(interp, af->filename);
- return JIM_ERR;
- }
+ if (JimCheckStreamError(interp, af)) {
+ Jim_FreeNewObj(interp, objPtr);
+ return JIM_ERR;
}
if (nonewline) {
int len;
@@ -443,11 +461,9 @@ static int aio_cmd_gets(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
break;
}
}
- if (ferror(af->fp) && errno != EAGAIN && errno != EINTR) {
+ if (JimCheckStreamError(interp, af)) {
/* I/O error */
Jim_FreeNewObj(interp, objPtr);
- JimAioSetError(interp, af->filename);
- clearerr(af->fp);
return JIM_ERR;
}