From 92f023dccced28a55ce323253f298e9825fe7da7 Mon Sep 17 00:00:00 2001 From: Christian Seiler Date: Mon, 20 May 2013 17:54:23 +0200 Subject: [PATCH] Implement simple utility functions for reading and writing to fds Signed-off-by: Christian Seiler Signed-off-by: Serge Hallyn --- src/lxc/utils.c | 35 +++++++++++++++++++++++++++++++++++ src/lxc/utils.h | 5 +++++ 2 files changed, 40 insertions(+) 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 -- 2.47.2