#include #include #include #include #include #include #include #include #include #include #include #include #include /* * Stolen from the LAM/MPI 6.2 distribution * http://www.lam-mpi.org/ */ int mreadv(int fd, struct iovec *iov, int iovcnt) { int nread; /* # of bytes read */ int r; int savelen; /* save full length */ void *savebase; /* save original base ptr */ nread = 0; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } do { r = readv(fd, iov, iovcnt); if (r < 0) { if (errno != EINTR) { iov->iov_len = savelen; iov->iov_base = (char*) savebase; return(-1); } } else if (r == 0) { /* eof */ iov->iov_len = savelen; iov->iov_base = (char*) savebase; while ((iovcnt > 0) && (iov->iov_len == 0)) { iov++; iovcnt--; } if (iovcnt > 0) { errno = 3; } return((int) nread); } else { nread += r; while (r > 0) { if (r >= iov->iov_len) { r -= iov->iov_len; iov->iov_len = savelen; iov->iov_base = (char*) savebase; iov++; iovcnt--; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } } else { iov->iov_len -= r; iov->iov_base = (char *) iov->iov_base + r; r = 0; } } while ((iovcnt > 0) && (iov->iov_len == 0)) { iov++; iovcnt--; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } } } } while (iovcnt > 0); return((int) nread); } int mwritev(int fd, struct iovec *iov, int iovcnt) { int nwritten; /* # of bytes written */ int r; int savelen; /* save full length */ void *savebase; /* save original base ptr */ nwritten = 0; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } do { r = writev(fd, iov, iovcnt); if (r < 0) { if (errno != EINTR) { iov->iov_len = savelen; iov->iov_base = (char *) savebase; return(-1); } } else if (r == 0) { /* eof */ iov->iov_len = savelen; iov->iov_base = (char*) savebase; while ((iovcnt > 0) && (iov->iov_len == 0)) { iov++; iovcnt--; } if (iovcnt > 0) { errno = 3; } return((int) nwritten); } else { nwritten += r; while (r > 0) { if (r >= iov->iov_len) { r -= iov->iov_len; iov->iov_len = savelen; iov->iov_base = (char *)savebase; iov++; iovcnt--; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } } else { iov->iov_len -= r; iov->iov_base = (char *) iov->iov_base + r; r = 0; } } while ((iovcnt > 0) && (iov->iov_len == 0)) { iov++; iovcnt--; if (iovcnt > 0) { savelen = iov->iov_len; savebase = iov->iov_base; } } } } while (iovcnt > 0); return((int) nwritten); }