From: Christian Seiler Date: Mon, 20 May 2013 15:54:23 +0000 (+0200) Subject: Implement simple utility functions for reading and writing to fds X-Git-Tag: lxc-1.0.0.alpha1~1^2~198 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=92f023dccced28a55ce323253f298e9825fe7da7;p=thirdparty%2Flxc.git Implement simple utility functions for reading and writing to fds Signed-off-by: Christian Seiler Signed-off-by: Serge Hallyn --- 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