version 1.1, 2010/07/05 09:25:06
|
version 1.2, 2010/09/10 12:39:41
|
Line 0
|
Line 1
|
|
#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; |
|
} |