From d8a7e180245bc00dbf55fa3e40135a4a94117ab9 Mon Sep 17 00:00:00 2001 From: Ralf Corsepius Date: Mon, 16 Aug 2010 05:46:09 +0000 Subject: 2010-08-16 Alin Rus * posix/src/aio_misc.c: New. * posix/src/aio_error.c, posix/src/aio_read.c, * posix/src/aio_return.c, posix/src/aio_write.c: New implementation. --- cpukit/posix/src/aio_read.c | 64 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 14 deletions(-) (limited to 'cpukit/posix/src/aio_read.c') diff --git a/cpukit/posix/src/aio_read.c b/cpukit/posix/src/aio_read.c index 0b4551e549..4c1133c9f0 100644 --- a/cpukit/posix/src/aio_read.c +++ b/cpukit/posix/src/aio_read.c @@ -1,29 +1,65 @@ /* - * 6.7.2 Asynchronous Read, P1003.1b-1993, p. 154 + * Copyright 2010, Alin Rus + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. * - * COPYRIGHT (c) 1989-2007. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.com/license/LICENSE. - * - * $Id$ + * $Id$ */ + #if HAVE_CONFIG_H #include "config.h" #endif #include #include - +#include +#include #include #include +#include -int aio_read( - struct aiocb *aiocbp __attribute__((unused)) -) +/* + * aio_read + * + * Asynchronous write to a file + * + * Input parameters: + * aiocbp - asynchronous I/O control block + * + * Output parameters: + * -1 - request could not pe enqueued + * - FD not opened for write + * - invalid aio_reqprio or aio_offset or + * aio_nbytes + * - not enough memory + * 0 - otherwise + */ + +int +aio_read (struct aiocb *aiocbp) { - rtems_set_errno_and_return_minus_one( ENOSYS ); + rtems_aio_request *req; + int mode; + + mode = fcntl (aiocbp->aio_fildes, F_GETFL); + if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) + rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); + + if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) + rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); + + if (aiocbp->aio_offset < 0 || aiocbp->aio_nbytes < 0) + rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); + + req = malloc (sizeof (rtems_aio_request)); + if (req == NULL) + rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); + + req->aiocbp = aiocbp; + req->aiocbp->aio_lio_opcode = LIO_READ; + + return rtems_aio_enqueue (req); } -- cgit v1.2.3