--- libaitio/src/aio.c 2010/07/05 09:25:06 1.1 +++ libaitio/src/aio.c 2010/09/10 12:39:41 1.2 @@ -0,0 +1,143 @@ +#include "global.h" + + +/* + * io_rread() Raw VFS read function + * @fd = File handle + * @buf = Read buffer + * @nbytes = Read buffer size + * @offset = Read from position, if -1 read nbytes from current position + * @update = Update file handle position !0 + * return: -1 error or !=-1 readed bytes + */ +inline int +io_rread(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update) +{ + int ret; +#ifdef AIO_OPS + off_t old = 0; + struct aiocb acb; +#endif + + if (!buf) { + io_SetErr(EINVAL, "Error:: invalid arguments ...\n"); + return -1; + } + if (!nbytes) + return 0; + if (offset == -1) { + offset = lseek(fd, 0, SEEK_CUR); + if (offset == -1) { + LOGERR; + return -1; + } + } + +#ifdef AIO_OPS + /* This made for generate EOF for file */ + if (!update && (old = lseek(fd, 0, SEEK_CUR)) == -1) { + LOGERR; + return -1; + } + if (offset >= lseek(fd, 0, SEEK_END)) + return 0; + if (!update) + lseek(fd, old, SEEK_SET); + + memset(buf, 0, nbytes); + memset(&acb, 0, sizeof acb); + acb.aio_fildes = fd; + acb.aio_nbytes = nbytes; + acb.aio_buf = buf; + acb.aio_offset = offset; + + if (aio_read(&acb) == -1) { + LOGERR; + return -1; + } + + while (aio_error(&acb) == EINPROGRESS); + ret = aio_return(&acb); + if (ret == -1) { + LOGERR; + return -1; + } else + ret = acb.aio_nbytes; +#else + ret = pread(fd, buf, nbytes, offset); + if (ret == -1) { + LOGERR; + return -1; + } +#endif + + if (update) + lseek(fd, offset + ret, SEEK_SET); + + return ret; +} + +/* + * io_rwrite() Raw VFS write function + * @fd = File handle + * @buf = Write buffer + * @nbytes = Write bytes from buffer + * @offset = Write at position, if -1 write nbytes from current position + * @update = Update file handle position !0 + * return: -1 error or !=-1 writed bytes + */ +inline int +io_rwrite(int fd, void * __restrict buf, size_t nbytes, off_t offset, int update) +{ + int ret; +#ifdef AIO_OPS + struct aiocb acb; +#endif + + if (!buf) { + io_SetErr(EINVAL, "Error:: invalid arguments ...\n"); + return -1; + } + if (!nbytes) + return 0; + if (offset == -1) { + offset = lseek(fd, 0, SEEK_CUR); + if (offset == -1) { + LOGERR; + return -1; + } + } + +#ifdef AIO_OPS + memset(&acb, 0, sizeof acb); + acb.aio_fildes = fd; + acb.aio_nbytes = nbytes; + acb.aio_buf = buf; + acb.aio_offset = offset; + + if (aio_write(&acb) == -1) { + LOGERR; + return -1; + } + + while (aio_error(&acb) == EINPROGRESS); + ret = aio_return(&acb); + if (ret == -1) { + LOGERR; + return -1; + } else + ret = acb.aio_nbytes; +#else + ret = pwrite(fd, buf, nbytes, offset); + if (ret == -1) { + LOGERR; + return -1; + } +#endif + + if (update) + lseek(fd, offset + ret, SEEK_SET); + + + return ret; +}