Whamcloud - gitweb
b=21581 too long file / path names for old tar
[fs/lustre-release.git] / libsysio / src / rw.c
index edc308b..ebbca58 100644 (file)
@@ -50,8 +50,8 @@
 #include <sys/uio.h>
 #include <sys/queue.h>
 
-#include "xtio.h"
 #include "sysio.h"
+#include "xtio.h"
 #include "file.h"
 #include "inode.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
                            :
@@ -467,7 +465,7 @@ PREPEND(_, SYSIO_INTERFACE_NAME(ipreadv))(int fd,
        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))
@@ -489,7 +487,7 @@ SYSIO_INTERFACE_NAME(ipreadv)(int fd,
 static ssize_t
 PREPEND(_, SYSIO_INTERFACE_NAME(preadv))(int fd, 
                                         const struct iovec *iov, 
-                                        size_t count, 
+                                        _SYSIO_PREADV_T count, 
                                         _SYSIO_OFF_T offset)
 {
        struct file *fil;
@@ -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))
@@ -526,7 +524,7 @@ sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(preadv)),
 ssize_t
 SYSIO_INTERFACE_NAME(preadv)(int fd, 
                             const struct iovec *iov, 
-                            size_t count, 
+                            _SYSIO_PREADV_T count, 
                             off_t offset)
 {
 
@@ -581,7 +579,7 @@ error:
        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,
@@ -696,13 +698,13 @@ PREPEND(_, SYSIO_INTERFACE_NAME(ireadx))(int fd,
        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);
@@ -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
 
@@ -837,7 +844,8 @@ SYSIO_INTERFACE_NAME(iwritev)(int fd,
 }
 
 ssize_t
-SYSIO_INTERFACE_NAME(writev)(int fd, const struct iovec *iov, int count)
+SYSIO_INTERFACE_NAME(writev)(int fd, const struct iovec *iov,
+                            int count)
 {
        struct file *fil;
        struct intnl_xtvec xtvector;
@@ -986,7 +994,7 @@ PREPEND(_, SYSIO_INTERFACE_NAME(ipwritev))(int fd,
        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))
@@ -1008,7 +1016,7 @@ SYSIO_INTERFACE_NAME(ipwritev)(int fd,
 static ssize_t
 PREPEND(_, SYSIO_INTERFACE_NAME(pwritev))(int fd, 
                                          const struct iovec *iov, 
-                                         size_t count, 
+                                         _SYSIO_PREADV_T count, 
                                          _SYSIO_OFF_T offset)
 {
        struct file *fil;
@@ -1036,7 +1044,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))
@@ -1045,7 +1053,7 @@ sysio_sym_weak_alias(PREPEND(_, SYSIO_INTERFACE_NAME(pwritev)),
 ssize_t
 SYSIO_INTERFACE_NAME(pwritev)(int fd, 
                              const struct iovec *iov, 
-                             size_t count, 
+                             _SYSIO_PREADV_T count, 
                              off_t offset)
 {
 
@@ -1100,7 +1108,7 @@ error:
        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 +1162,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))
@@ -1215,13 +1223,13 @@ PREPEND(_, SYSIO_INTERFACE_NAME(iwritex))(int fd,
        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 +1244,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);
@@ -1285,10 +1297,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 +1315,7 @@ SYSIO_INTERFACE_NAME(write64x)(int fd,
                                                    xtv, 
                                                    xtv_count)) == IOID_FAIL)
                return -1;
-       return iowait(ioid);
+       return SYSIO_INTERFACE_NAME(iowait)(ioid);
 }
 #endif