summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/aio_write.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/posix/src/aio_write.c')
-rw-r--r--cpukit/posix/src/aio_write.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/cpukit/posix/src/aio_write.c b/cpukit/posix/src/aio_write.c
new file mode 100644
index 0000000000..03f6b90c64
--- /dev/null
+++ b/cpukit/posix/src/aio_write.c
@@ -0,0 +1,65 @@
+/*
+ * 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.
+ *
+ * $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 be 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)
+{
+ 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)
+ 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);
+}