aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--rt/aio_misc.c20
2 files changed, 24 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 96da3a1..7c6c6f7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
1999-08-06 Ulrich Drepper <drepper@cygnus.com>
+ * rt/aio_misc.c (handle_fildes_io): Imitate the behaviour on other
+ systems which allow using the functions also on non-seekable
+ devices.
+
* resolv/res_send.c (res_send): Recompute timeout for poll for
each jump to `wait'.
diff --git a/rt/aio_misc.c b/rt/aio_misc.c
index ba0c9d4..fb5fbf6 100644
--- a/rt/aio_misc.c
+++ b/rt/aio_misc.c
@@ -435,6 +435,16 @@ handle_fildes_io (void *arg)
(void *) aiocbp->aiocb.aio_buf,
aiocbp->aiocb.aio_nbytes,
aiocbp->aiocb.aio_offset));
+
+ if (aiocbp->aiocb.__return_value == -1 && errno == ESPIPE)
+ /* The Linux kernel is different from others. It returns
+ ESPIPE if using pread on a socket. Other platforms
+ simply ignore the offset parameter and behave like
+ read. */
+ aiocbp->aiocb.__return_value =
+ TEMP_FAILURE_RETRY (read (fildes,
+ (void *) aiocbp->aiocb64.aio_buf,
+ aiocbp->aiocb64.aio_nbytes));
}
else if ((aiocbp->aiocb.aio_lio_opcode & 127) == LIO_WRITE)
{
@@ -450,6 +460,16 @@ handle_fildes_io (void *arg)
(const void *) aiocbp->aiocb.aio_buf,
aiocbp->aiocb.aio_nbytes,
aiocbp->aiocb.aio_offset));
+
+ if (aiocbp->aiocb.__return_value == -1 && errno == ESPIPE)
+ /* The Linux kernel is different from others. It returns
+ ESPIPE if using pwrite on a socket. Other platforms
+ simply ignore the offset parameter and behave like
+ write. */
+ aiocbp->aiocb.__return_value =
+ TEMP_FAILURE_RETRY (write (fildes,
+ (void *) aiocbp->aiocb64.aio_buf,
+ aiocbp->aiocb64.aio_nbytes));
}
else if (aiocbp->aiocb.aio_lio_opcode == LIO_DSYNC)
aiocbp->aiocb.__return_value = TEMP_FAILURE_RETRY (fdatasync (fildes));