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