#include "ofi.h"
#include "ofi_osd.h"
ssize_t
ofi_sendv_socket(SOCKET fd, const struct iovec *iovec, size_t iov_cnt, int flags)
{
ssize_t size = 0;
int ret, i;
if (iov_cnt == 1) {
return ofi_send_socket(fd, iovec[0].iov_base,
iovec[0].iov_len, flags);
}
for (i = 0; i < iov_cnt; i++) {
ret = ofi_send_socket(fd, iovec[i].iov_base,
iovec[i].iov_len, flags);
if (ret >= 0) {
size += ret;
if (ret != iovec[i].iov_len)
return size;
} else {
return size ? size : ret;
}
}
return size;
}
ssize_t
ofi_recvv_socket(SOCKET fd, const struct iovec *iovec, size_t iov_cnt, int flags)
{
ssize_t size = 0;
int ret, i;
if (iov_cnt == 1) {
return ofi_recv_socket(fd, iovec[0].iov_base,
iovec[0].iov_len, flags);
}
for (i = 0; i < iov_cnt; i++) {
ret = ofi_recv_socket(fd, iovec[i].iov_base,
iovec[i].iov_len, flags);
if (ret >= 0) {
size += ret;
if (ret != iovec[i].iov_len)
return size;
} else {
return size ? size : ret;
}
}
return size;
}
ssize_t ofi_writev_socket(SOCKET fd, const struct iovec *iovec, size_t iov_cnt)
{
return ofi_sendv_socket(fd, iovec, iov_cnt, 0);
}
ssize_t ofi_readv_socket(SOCKET fd, const struct iovec *iovec, size_t iov_cnt)
{
return ofi_recvv_socket(fd, iovec, iov_cnt, 0);
}
ssize_t ofi_sendmsg_tcp(SOCKET fd, const struct msghdr *msg, int flags)
{
return ofi_sendv_socket(fd, msg->msg_iov, msg->msg_iovlen, flags);
}
ssize_t ofi_recvmsg_tcp(SOCKET fd, struct msghdr *msg, int flags)
{
return ofi_recvv_socket(fd, msg->msg_iov, msg->msg_iovlen, flags);
}