diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 66bd19d09..cd35e0006 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -281,3 +281,38 @@ again: goto again; return status; } + +int lxc_write_nointr(int fd, const void* buf, size_t count) +{ + int ret; +again: + ret = write(fd, buf, count); + if (ret < 0 && errno == EINTR) + goto again; + return ret; +} + +int lxc_read_nointr(int fd, void* buf, size_t count) +{ + int ret; +again: + ret = read(fd, buf, count); + if (ret < 0 && errno == EINTR) + goto again; + return ret; +} + +int lxc_read_nointr_expect(int fd, void* buf, size_t count, const void* expected_buf) +{ + int ret; + ret = lxc_read_nointr(fd, buf, count); + if (ret <= 0) + return ret; + if (ret != count) + return -1; + if (expected_buf && memcmp(buf, expected_buf, count) != 0) { + errno = EINVAL; + return -1; + } + return ret; +} diff --git a/src/lxc/utils.h b/src/lxc/utils.h index be1a8a8c3..d1242b1f5 100644 --- a/src/lxc/utils.h +++ b/src/lxc/utils.h @@ -68,4 +68,9 @@ extern int __build_bug_on_failed; extern int wait_for_pid(pid_t pid); extern int lxc_wait_for_pid_status(pid_t pid); +/* send and receive buffers completely */ +extern int lxc_write_nointr(int fd, const void* buf, size_t count); +extern int lxc_read_nointr(int fd, void* buf, size_t count); +extern int lxc_read_nointr_expect(int fd, void* buf, size_t count, const void* expected_buf); + #endif