diff options
author | Steve Bennett <steveb@workware.net.au> | 2010-09-10 15:05:19 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2010-10-15 11:02:51 +1000 |
commit | e4ed647094e02f4a1beb28ab8a3b0b5c4d611a84 (patch) | |
tree | 796d8862658adaa6fefe7a05e712078175be4099 | |
parent | 5f80c4b6b542a3b5496fa93b8f92a3f178c8bf1d (diff) | |
download | jimtcl-e4ed647094e02f4a1beb28ab8a3b0b5c4d611a84.zip jimtcl-e4ed647094e02f4a1beb28ab8a3b0b5c4d611a84.tar.gz jimtcl-e4ed647094e02f4a1beb28ab8a3b0b5c4d611a84.tar.bz2 |
fh error not cleared after signal
Use clearerr() after a read fails to avoid repeated failures after a signal.
Also, dont' treat EINTR as an error in gets.
And remove some leftover perror() calls.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim-aio.c | 11 |
1 files changed, 6 insertions, 5 deletions
@@ -312,10 +312,11 @@ static int aio_cmd_read(Jim_Interp *interp, int argc, Jim_Obj *const *argv) break; } /* Check for error conditions */ - if (ferror(af->fp)) { + if (ferror(af->fp) && errno != EAGAIN) { /* I/O error */ Jim_FreeNewObj(interp, objPtr); JimAioSetError(interp, af->filename); + clearerr(af->fp); return JIM_ERR; } if (nonewline) { @@ -337,6 +338,8 @@ static int aio_cmd_gets(Jim_Interp *interp, int argc, Jim_Obj *const *argv) char buf[AIO_BUF_LEN]; Jim_Obj *objPtr; + errno = 0; + objPtr = Jim_NewStringObj(interp, NULL, 0); while (1) { int more = 0; @@ -362,10 +365,11 @@ static int aio_cmd_gets(Jim_Interp *interp, int argc, Jim_Obj *const *argv) if (!more) break; } - if (ferror(af->fp) && (errno != EAGAIN)) { + if (ferror(af->fp) && errno != EAGAIN && errno != EINTR) { /* I/O error */ Jim_FreeNewObj(interp, objPtr); JimAioSetError(interp, af->filename); + clearerr(af->fp); return JIM_ERR; } /* On EOF returns -1 if varName was specified, or the empty string. */ @@ -437,7 +441,6 @@ static int aio_cmd_recvfrom(Jim_Interp *interp, int argc, Jim_Obj *const *argv) rlen = recvfrom(fileno(af->fp), buf, len, 0, &sa.sa, &salen); if (rlen < 0) { - perror("recvfrom"); Jim_Free(buf); JimAioSetError(interp, NULL); return JIM_ERR; @@ -495,7 +498,6 @@ static int aio_cmd_sendto(Jim_Interp *interp, int argc, Jim_Obj *const *argv) /* Note that we don't validate the socket type. Rely on sendto() failing if appropriate */ len = sendto(fileno(af->fp), wdata, wlen, 0, &sa.sa, salen); if (len < 0) { - perror("sendto"); JimAioSetError(interp, NULL); return JIM_ERR; } @@ -1050,7 +1052,6 @@ static int JimAioSockCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) } res = connect(sock, &sa.sa, salen); if (res) { - perror("connect"); JimAioSetError(interp, argv[2]); close(sock); return JIM_ERR; |