Diff for /libaitio/src/aio.c between versions 1.1 and 1.2

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

Removed from v.1.1  
changed lines
  Added in v.1.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>