Whamcloud - gitweb
use one place for syscall.h
[fs/lustre-release.git] / libsysio / src / rw.c
index ad103b8..300f073 100644 (file)
@@ -51,9 +51,9 @@
 #include <sys/queue.h>
 
 #include "sysio.h"
+#include "xtio.h"
 #include "file.h"
 #include "inode.h"
-#include "xtio.h"
 
 #include "sysio-symbols.h"
 
@@ -105,9 +105,7 @@ _sysio_iiox(int (*f)(struct inode *, struct ioctx *),
        /*
         * Check that it was opened with flags supporting the operation.
         */
-       if (!(wr
-               ? (fil->f_flags & (O_RDWR | O_WRONLY))
-               : !(fil->f_flags & O_WRONLY)))
+       if (!F_CHKRW(fil, wr ? 'w' : 'r'))
                return -EBADF;
 
        ino = fil->f_ino;
@@ -120,7 +118,7 @@ _sysio_iiox(int (*f)(struct inode *, struct ioctx *),
        cc =
            _sysio_validx(xtv, xtv_count,
                          iov, iov_count,
-#if _LARGEFILE64_SOURCE && defined(O_LARGEFILE)
+#if defined(_LARGEFILE64_SOURCE) && defined(O_LARGEFILE)
                          (fil->f_flags & O_LARGEFILE) == 0
                            ? LONG_MAX
                            :
@@ -267,7 +265,7 @@ SYSIO_INTERFACE_NAME(ireadv)(int fd, const struct iovec *iov, int count)
                free(xtv);
                SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
        }
-       SYSIO_INTERFACE_RETURN(ioctx->ioctx_id, 0);
+       SYSIO_INTERFACE_RETURN(ioctx, 0);
 }
 
 ssize_t
@@ -351,7 +349,7 @@ SYSIO_INTERFACE_NAME(iread)(int fd, void *buf, size_t count)
                free(iov);
                SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
        }
-       SYSIO_INTERFACE_RETURN(ioctx->ioctx_id, 0);
+       SYSIO_INTERFACE_RETURN(ioctx, 0);
 }
 
 ssize_t
@@ -464,10 +462,10 @@ PREPEND(_, SYSIO_INTERFACE_NAME(ipreadv))(int fd,
                free(xtv);
                SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
        }
-       SYSIO_INTERFACE_RETURN(ioctx->ioctx_id, 0);
+       SYSIO_INTERFACE_RETURN(ioctx, 0);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef ipread64v
 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ipreadv)),
                     SYSIO_INTERFACE_NAME(ipread64v))
@@ -517,7 +515,7 @@ PREPEND(_, SYSIO_INTERFACE_NAME(preadv))(int fd,
        SYSIO_INTERFACE_RETURN(err ? -1 : cc, err);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef pread64v
 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(preadv)), 
                     SYSIO_INTERFACE_NAME(pread64v))
@@ -578,10 +576,10 @@ error:
                        free(xtv);
                SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
        }
-       SYSIO_INTERFACE_RETURN(ioctx->ioctx_id, 0);
+       SYSIO_INTERFACE_RETURN(ioctx, 0);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef ipread64
 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ipread)),
                     SYSIO_INTERFACE_NAME(ipread64))
@@ -635,7 +633,7 @@ PREPEND(_, SYSIO_INTERFACE_NAME(pread))(int fd,
        SYSIO_INTERFACE_RETURN(err ? -1 : cc, err);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef pread64
 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pread)),
                     SYSIO_INTERFACE_NAME(pread64))
@@ -682,9 +680,13 @@ PREPEND(_, SYSIO_INTERFACE_NAME(ireadx))(int fd,
 
        SYSIO_INTERFACE_ENTER;
        fil = _sysio_fd_find(fd);
-       if (!(fil && xtv_count))
+       if (!fil)
                SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
 
+       /* Perform a check on the iov_count and xtv_count */
+       if ((iov_count == 0) || (xtv_count == 0))
+               SYSIO_INTERFACE_RETURN(IOID_FAIL, -EINVAL);
+
        err =
            _sysio_iiox(IIOXOP_READ(fil->f_ino),
                        fil,
@@ -693,16 +695,16 @@ PREPEND(_, SYSIO_INTERFACE_NAME(ireadx))(int fd,
                        NULL,
                        &ioctx);
 
-       SYSIO_INTERFACE_RETURN(err ? IOID_FAIL : ioctx->ioctx_id, err);
+       SYSIO_INTERFACE_RETURN(err ? IOID_FAIL : ioctx, err);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef iread64x
 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ireadx)),
                     SYSIO_INTERFACE_NAME(iread64x))
 #endif
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 ioid_t
 SYSIO_INTERFACE_NAME(ireadx)(int fd,
                             const struct iovec *iov, size_t iov_count,
@@ -717,9 +719,14 @@ SYSIO_INTERFACE_NAME(ireadx)(int fd,
 
        SYSIO_INTERFACE_ENTER;
        fil = _sysio_fd_find(fd);
-       if (!(fil && xtv_count))
+       if (!fil)
                SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
 
+
+       /* Perform a check on the iov_count and xtv_count */
+       if ((iov_count == 0) || (xtv_count == 0))
+               SYSIO_INTERFACE_RETURN(IOID_FAIL, -EINVAL);
+
        ixtv = ixtvent = malloc(xtv_count * sizeof(struct intnl_xtvec));
        if (!ixtv)
                SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
@@ -743,7 +750,7 @@ SYSIO_INTERFACE_NAME(ireadx)(int fd,
                free(ixtv);
                SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
        }
-       SYSIO_INTERFACE_RETURN(ioctx->ioctx_id, 0);
+       SYSIO_INTERFACE_RETURN(ioctx, 0);
 }
 #else
 #undef ireadx
@@ -764,10 +771,10 @@ SYSIO_INTERFACE_NAME(readx)(int fd,
                                                 xtv, 
                                                 xtv_count)) == IOID_FAIL)
                return -1;
-       return iowait(ioid);
+       return SYSIO_INTERFACE_NAME(iowait)(ioid);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef iread64x
 ssize_t
 SYSIO_INTERFACE_NAME(read64x)(int fd,
@@ -782,7 +789,7 @@ SYSIO_INTERFACE_NAME(read64x)(int fd,
                                                   xtv, 
                                                   xtv_count)) == IOID_FAIL)
                return -1;
-       return iowait(ioid);
+       return SYSIO_INTERFACE_NAME(iowait)(ioid);
 }
 #endif
 
@@ -833,7 +840,7 @@ SYSIO_INTERFACE_NAME(iwritev)(int fd,
                free(xtv);
                SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
        }
-       SYSIO_INTERFACE_RETURN(ioctx->ioctx_id, 0);
+       SYSIO_INTERFACE_RETURN(ioctx, 0);
 }
 
 ssize_t
@@ -909,7 +916,7 @@ SYSIO_INTERFACE_NAME(iwrite)(int fd, const void *buf, size_t count)
                free(iov);
                SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
        }
-       SYSIO_INTERFACE_RETURN(ioctx->ioctx_id, 0);
+       SYSIO_INTERFACE_RETURN(ioctx, 0);
 }
 
 ssize_t
@@ -983,10 +990,10 @@ PREPEND(_, SYSIO_INTERFACE_NAME(ipwritev))(int fd,
                free(xtv);
                SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
        }
-       SYSIO_INTERFACE_RETURN(ioctx->ioctx_id, 0);
+       SYSIO_INTERFACE_RETURN(ioctx, 0);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef ipwrite64v
 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ipwritev)),
                     SYSIO_INTERFACE_NAME(ipwrite64v))
@@ -1036,7 +1043,7 @@ PREPEND(_, SYSIO_INTERFACE_NAME(pwritev))(int fd,
        SYSIO_INTERFACE_RETURN(err ? -1 : cc, err);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef pwrite64v
 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pwritev)),
                     SYSIO_INTERFACE_NAME(pwrite64v))
@@ -1097,10 +1104,10 @@ error:
                        free(xtv);
                SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
        }
-       SYSIO_INTERFACE_RETURN(ioctx->ioctx_id, 0);
+       SYSIO_INTERFACE_RETURN(ioctx, 0);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef ipwrite64
 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(ipwrite)),
                     SYSIO_INTERFACE_NAME(ipwrite64))
@@ -1154,7 +1161,7 @@ PREPEND(_, SYSIO_INTERFACE_NAME(pwrite))(int fd,
        SYSIO_INTERFACE_RETURN(err ? -1 : cc, err);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef pwrite64
 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pwrite)),
                     SYSIO_INTERFACE_NAME(pwrite64))
@@ -1212,16 +1219,16 @@ PREPEND(_, SYSIO_INTERFACE_NAME(iwritex))(int fd,
                        NULL,
                        &ioctx);
 
-       SYSIO_INTERFACE_RETURN(err ? IOID_FAIL : ioctx->ioctx_id, err);
+       SYSIO_INTERFACE_RETURN(err ? IOID_FAIL : ioctx, err);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef iwrite64x
 sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(iwritex)),
                     SYSIO_INTERFACE_NAME(iwrite64x))
 #endif
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 ioid_t
 SYSIO_INTERFACE_NAME(iwritex)(int fd,
                              const struct iovec *iov, size_t iov_count,
@@ -1236,9 +1243,13 @@ SYSIO_INTERFACE_NAME(iwritex)(int fd,
 
        SYSIO_INTERFACE_ENTER;
        fil = _sysio_fd_find(fd);
-       if (!(fil && xtv_count))
+       if (!fil)
                SYSIO_INTERFACE_RETURN(IOID_FAIL, -EBADF);
 
+       /* Perform a check on the iov_count and xtv_count */
+       if ((iov_count == 0) || (xtv_count == 0))
+               SYSIO_INTERFACE_RETURN(IOID_FAIL, -EINVAL);
+
        ixtv = ixtvent = malloc(xtv_count * sizeof(struct intnl_xtvec));
        if (!ixtv)
                SYSIO_INTERFACE_RETURN(IOID_FAIL, -ENOMEM);
@@ -1262,7 +1273,7 @@ SYSIO_INTERFACE_NAME(iwritex)(int fd,
                free(ixtv);
                SYSIO_INTERFACE_RETURN(IOID_FAIL, err);
        }
-       SYSIO_INTERFACE_RETURN(ioctx->ioctx_id, 0);
+       SYSIO_INTERFACE_RETURN(ioctx, 0);
 }
 #else
 #undef iwritex
@@ -1285,10 +1296,10 @@ SYSIO_INTERFACE_NAME(writex)(int fd,
                                           xtv, 
                                           xtv_count)) == IOID_FAIL)
                return -1;
-       return iowait(ioid);
+       return SYSIO_INTERFACE_NAME(iowait)(ioid);
 }
 
-#if _LARGEFILE64_SOURCE
+#ifdef _LARGEFILE64_SOURCE
 #undef write64x
 ssize_t
 SYSIO_INTERFACE_NAME(write64x)(int fd,
@@ -1303,7 +1314,7 @@ SYSIO_INTERFACE_NAME(write64x)(int fd,
                                                    xtv, 
                                                    xtv_count)) == IOID_FAIL)
                return -1;
-       return iowait(ioid);
+       return SYSIO_INTERFACE_NAME(iowait)(ioid);
 }
 #endif