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, 8 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>