#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; }