aboutsummaryrefslogtreecommitdiff
path: root/jim-aio.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-09-10 15:05:19 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:51 +1000
commite4ed647094e02f4a1beb28ab8a3b0b5c4d611a84 (patch)
tree796d8862658adaa6fefe7a05e712078175be4099 /jim-aio.c
parent5f80c4b6b542a3b5496fa93b8f92a3f178c8bf1d (diff)
downloadjimtcl-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>
Diffstat (limited to 'jim-aio.c')
-rw-r--r--jim-aio.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/jim-aio.c b/jim-aio.c
index eadac75..d717911 100644
--- a/jim-aio.c
+++ b/jim-aio.c
@@ -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;