File:
[ELWIX - Embedded LightWeight unIX -] /
libaitio /
src /
aio.c
Revision
1.2:
download - view:
text,
annotated -
select for diffs -
revision graph
Fri Sep 10 12:39:41 2010 UTC (13 years, 11 months ago) by
misho
Branches:
MAIN
CVS tags:
io1_7,
io1_6,
io1_5,
io1_4,
IO1_6,
IO1_5,
IO1_4,
IO1_3,
HEAD
new version 1.3
#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;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>