summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/aio_write.c
diff options
context:
space:
mode:
authorRalf Corsepius <ralf.corsepius@rtems.org>2010-08-16 05:46:09 +0000
committerRalf Corsepius <ralf.corsepius@rtems.org>2010-08-16 05:46:09 +0000
commitd8a7e180245bc00dbf55fa3e40135a4a94117ab9 (patch)
treedd764a507afa6f31d2ad7d5ae736661e56ffd738 /cpukit/posix/src/aio_write.c
parentRegenerate. (diff)
downloadrtems-d8a7e180245bc00dbf55fa3e40135a4a94117ab9.tar.bz2
2010-08-16 Alin Rus <alin.codejunkie@gmail.com>
* 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.
Diffstat (limited to 'cpukit/posix/src/aio_write.c')
-rw-r--r--cpukit/posix/src/aio_write.c64
1 files changed, 50 insertions, 14 deletions
diff --git a/cpukit/posix/src/aio_write.c b/cpukit/posix/src/aio_write.c
index 485e221a10..96f5e58492 100644
--- a/cpukit/posix/src/aio_write.c
+++ b/cpukit/posix/src/aio_write.c
@@ -1,29 +1,65 @@
/*
- * 6.7.3 Asynchronous Write, P1003.1b-1993, p. 155
+ * Copyright 2010, Alin Rus <alin.codejunkie@gmail.com>
+ *
+ * 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 <aio.h>
#include <errno.h>
-
+#include <fcntl.h>
+#include <rtems/posix/aio_misc.h>
#include <rtems/system.h>
#include <rtems/seterr.h>
+#include <stdlib.h>
+
+/*
+ * aio_write
+ *
+ * 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_write(
- struct aiocb *aiocbp __attribute__((unused))
-)
+int
+aio_write (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_WRONLY) || ((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_WRITE;
+
+ return rtems_aio_enqueue (req);
}