ssize_t iov_send_recv(int sockfd, struct iovec *iov,

                      size_t offset, size_t bytes,

                      bool do_sendv)

{

    int iovlen;

    ssize_t ret;

    size_t diff;

    struct iovec *last_iov;



    /* last_iov is inclusive, so count from one.  */

    iovlen = 1;

    last_iov = iov;

    bytes += offset;



    while (last_iov->iov_len < bytes) {

        bytes -= last_iov->iov_len;



        last_iov++;

        iovlen++;

    }



    diff = last_iov->iov_len - bytes;

    last_iov->iov_len -= diff;



    while (iov->iov_len <= offset) {

        offset -= iov->iov_len;



        iov++;

        iovlen--;

    }



    iov->iov_base = (char *) iov->iov_base + offset;

    iov->iov_len -= offset;



    {

#if defined CONFIG_IOVEC && defined CONFIG_POSIX

        struct msghdr msg;

        memset(&msg, 0, sizeof(msg));

        msg.msg_iov = iov;

        msg.msg_iovlen = iovlen;



        do {

            if (do_sendv) {

                ret = sendmsg(sockfd, &msg, 0);

            } else {

                ret = recvmsg(sockfd, &msg, 0);

            }

        } while (ret == -1 && errno == EINTR);

#else

        struct iovec *p = iov;

        ret = 0;

        while (iovlen > 0) {

            int rc;

            if (do_sendv) {

                rc = send(sockfd, p->iov_base, p->iov_len, 0);

            } else {

                rc = qemu_recv(sockfd, p->iov_base, p->iov_len, 0);

            }

            if (rc == -1) {

                if (errno == EINTR) {

                    continue;

                }

                if (ret == 0) {

                    ret = -1;

                }

                break;

            }

            if (rc == 0) {

                break;

            }

            ret += rc;

            iovlen--, p++;

        }

#endif

    }



    /* Undo the changes above */

    iov->iov_base = (char *) iov->iov_base - offset;

    iov->iov_len += offset;

    last_iov->iov_len += diff;

    return ret;

}

ssize_t iov_send_recv(int sockfd, struct iovec *iov,

                      size_t offset, size_t bytes,

                      bool do_sendv)

{

    int iovlen;

    ssize_t ret;

    size_t diff;

    struct iovec *last_iov;



    

    iovlen = 1;

    last_iov = iov;

    bytes += offset;



    while (last_iov->iov_len < bytes) {

        bytes -= last_iov->iov_len;



        last_iov++;

        iovlen++;

    }



    diff = last_iov->iov_len - bytes;

    last_iov->iov_len -= diff;



    while (iov->iov_len <= offset) {

        offset -= iov->iov_len;



        iov++;

        iovlen--;

    }



    iov->iov_base = (char *) iov->iov_base + offset;

    iov->iov_len -= offset;



    {

#if defined CONFIG_IOVEC && defined CONFIG_POSIX

        struct msghdr msg;

        memset(&msg, 0, sizeof(msg));

        msg.msg_iov = iov;

        msg.msg_iovlen = iovlen;



        do {

            if (do_sendv) {

                ret = sendmsg(sockfd, &msg, 0);

            } else {

                ret = recvmsg(sockfd, &msg, 0);

            }

        } while (ret == -1 && errno == EINTR);

#else

        struct iovec *p = iov;

        ret = 0;

        while (iovlen > 0) {

            int rc;

            if (do_sendv) {

                rc = send(sockfd, p->iov_base, p->iov_len, 0);

            } else {

                rc = qemu_recv(sockfd, p->iov_base, p->iov_len, 0);

            }

            if (rc == -1) {

                if (errno == EINTR) {

                    continue;

                }

                if (ret == 0) {

                    ret = -1;

                }

                break;

            }

            if (rc == 0) {

                break;

            }

            ret += rc;

            iovlen--, p++;

        }

#endif

    }



    

    iov->iov_base = (char *) iov->iov_base - offset;

    iov->iov_len += offset;

    last_iov->iov_len += diff;

    return ret;

}

ssize_t iov_send_recv(int sockfd, struct iovec *iov,                       size_t offset, size_t bytes,                       bool do_sendv)     int iovlen;     ssize_t ret;     size_t diff;     struct iovec *last_iov;     iovlen = 1;     last_iov = iov;     bytes += offset;     while (last_iov->iov_len < bytes) {         bytes -= last_iov->iov_len;         last_iov++;         iovlen++;     diff = last_iov->iov_len - bytes;     last_iov->iov_len -= diff;     while (iov->iov_len <= offset) {         offset -= iov->iov_len;         iov++;         iovlen--;     iov->iov_base = (char *) iov->iov_base + offset;     iov->iov_len -= offset; #if defined CONFIG_IOVEC && defined CONFIG_POSIX         struct msghdr msg;         memset(&msg, 0, sizeof(msg));         msg.msg_iov = iov;         msg.msg_iovlen = iovlen;         do {             if (do_sendv) {                 ret = sendmsg(sockfd, &msg, 0);             } else {                 ret = recvmsg(sockfd, &msg, 0);         } while (ret == -1 && errno == EINTR); #else         struct iovec *p = iov;         ret = 0;         while (iovlen > 0) {             int rc;             if (do_sendv) {                 rc = send(sockfd, p->iov_base, p->iov_len, 0);             } else {                 rc = qemu_recv(sockfd, p->iov_base, p->iov_len, 0);             if (rc == -1) {                 if (errno == EINTR) {                     continue;                 if (ret == 0) {                     ret = -1;                 break;             if (rc == 0) {                 break;             ret += rc;             iovlen--, p++; #endif     iov->iov_base = (char *) iov->iov_base - offset;     iov->iov_len += offset;     last_iov->iov_len += diff;     return ret; ssize_t iov_send_recv(int sockfd, struct iovec *iov,
ssize_t FUNC_0(int sockfd, struct iovec *iov,

                      size_t offset, size_t bytes,

                      bool do_sendv)

{

    int VAR_0;

    ssize_t ret;

    size_t diff;

    struct iovec *VAR_1;



    

    VAR_0 = 1;

    VAR_1 = iov;

    bytes += offset;



    while (VAR_1->iov_len < bytes) {

        bytes -= VAR_1->iov_len;



        VAR_1++;

        VAR_0++;

    }



    diff = VAR_1->iov_len - bytes;

    VAR_1->iov_len -= diff;



    while (iov->iov_len <= offset) {

        offset -= iov->iov_len;



        iov++;

        VAR_0--;

    }



    iov->iov_base = (char *) iov->iov_base + offset;

    iov->iov_len -= offset;



    {

#if defined CONFIG_IOVEC && defined CONFIG_POSIX

        struct msghdr msg;

        memset(&msg, 0, sizeof(msg));

        msg.msg_iov = iov;

        msg.msg_iovlen = VAR_0;



        do {

            if (do_sendv) {

                ret = sendmsg(sockfd, &msg, 0);

            } else {

                ret = recvmsg(sockfd, &msg, 0);

            }

        } while (ret == -1 && errno == EINTR);

#else

        struct iovec *VAR_2 = iov;

        ret = 0;

        while (VAR_0 > 0) {

            int VAR_3;

            if (do_sendv) {

                VAR_3 = send(sockfd, VAR_2->iov_base, VAR_2->iov_len, 0);

            } else {

                VAR_3 = qemu_recv(sockfd, VAR_2->iov_base, VAR_2->iov_len, 0);

            }

            if (VAR_3 == -1) {

                if (errno == EINTR) {

                    continue;

                }

                if (ret == 0) {

                    ret = -1;

                }

                break;

            }

            if (VAR_3 == 0) {

                break;

            }

            ret += VAR_3;

            VAR_0--, VAR_2++;

        }

#endif

    }



    

    iov->iov_base = (char *) iov->iov_base - offset;

    iov->iov_len += offset;

    VAR_1->iov_len += diff;

    return ret;

}

ssize_t FUNC_0(int sockfd, struct iovec *iov,
size_t offset, size_t bytes,
bool do_sendv)
{ int VAR_0; ssize_t ret; size_t diff; struct iovec *VAR_1; VAR_0 = 1; VAR_1 = iov; bytes += offset; while (VAR_1->iov_len < bytes) { bytes -= VAR_1->iov_len; VAR_1++; VAR_0++; } diff = VAR_1->iov_len - bytes; VAR_1->iov_len -= diff; while (iov->iov_len <= offset) { offset -= iov->iov_len; iov++; VAR_0--; } iov->iov_base = (char *) iov->iov_base + offset; iov->iov_len -= offset; { #if defined CONFIG_IOVEC && defined CONFIG_POSIX
struct msghdr msg; memset(&msg, 0, sizeof(msg)); msg.msg_iov = iov; msg.msg_iovlen = VAR_0; do { if (do_sendv) { ret = sendmsg(sockfd, &msg, 0); } else { ret = recvmsg(sockfd, &msg, 0); } } while (ret == -1 && errno == EINTR); #else
struct iovec *VAR_2 = iov; ret = 0; while (VAR_0 > 0) { int VAR_3; if (do_sendv) { VAR_3 = send(sockfd, VAR_2->iov_base, VAR_2->iov_len, 0); } else { VAR_3 = qemu_recv(sockfd, VAR_2->iov_base, VAR_2->iov_len, 0); } if (VAR_3 == -1) { if (errno == EINTR) { continue; } if (ret == 0) { ret = -1; } break; } if (VAR_3 == 0) { break; } ret += VAR_3; VAR_0--, VAR_2++; } #endif
} iov->iov_base = (char *) iov->iov_base - offset; iov->iov_len += offset; VAR_1->iov_len += diff; return ret; }