#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
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 && offset >= lseek(fd, 0, SEEK_END))
return 0;
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;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>