GGiteevtzproxy
278cfe60创建于 2023年12月7日历史提交
#include "virt.h"

int safepoll(struct pollfd *fds, nfds_t nfds, int timeout)
{
    int ret;

    do {
        ret = poll(fds, nfds, timeout);
    } while (ret == -1 && errno == EINTR);

    if (ret == -1)
        ret = -errno;

    return ret;
}

ssize_t safewrite(int fd, const void *buf, size_t count, bool eagain_ret)
{
    ssize_t ret;
    size_t len;
    int flags;
    bool nonblock;

    nonblock = false;
    flags = fcntl(fd, F_GETFL);
    if (flags > 0 && flags & O_NONBLOCK)
        nonblock = true;

    len = count;
    while (len > 0) {
        ret = write(fd, buf, len);
        if (ret == -1) {
            if (errno == EINTR)
                continue;

            if (errno == EAGAIN) {
                if (nonblock && eagain_ret) {
                    return -EAGAIN;
                } else {
                    continue;
                }
            }
            return -errno;
        } else if (ret == 0) {
            break;
        } else {
            buf += ret;
            len -= ret;
        }
    }
    return count - len;
}

ssize_t saferead(int fd, void *buf, size_t count, bool eagain_ret)
{
    size_t ret, len;
    int flags;
    bool nonblock;

    nonblock = false;
    flags = fcntl(fd, F_GETFL);
    if (flags > 0 && flags & O_NONBLOCK)
        nonblock = true;

    len = count;
    while (len > 0) {
        ret = read(fd, buf, len);
        if ((int)ret == -1) {
            if (errno == EINTR)
                continue;

            if (errno == EAGAIN) {
                if (nonblock && eagain_ret) {
                    return -EAGAIN;
                } else {
                    continue;
                }
            }
            return -errno;
        } else if (ret == 0) {
            break;
        } else {
            buf += ret;
            len -= ret;
        }
    }
    return count - len;
}