[lxc-devel] [PATCH 4/5] Implement simple utility functions for reading and writing to fds
Dwight Engen
dwight.engen at oracle.com
Mon May 20 17:19:42 UTC 2013
Hi Christian,
These routines will be good to have. I think your names are fine, but
thought I'd point that out that there seems to be some sort of
convention in other projects I've seen to name them safe_read(),
safe_write(). They are usually accompanied by full_read() and
full_write() which handle short return counts as well.
Also, it might be good to have their return type be ssize_t to match
actual read(3) and write(3). Thanks!
On Mon, 20 May 2013 17:54:23 +0200
Christian Seiler <christian at iwakd.de> wrote:
> Signed-off-by: Christian Seiler <christian at iwakd.de>
> ---
> src/lxc/utils.c | 35 +++++++++++++++++++++++++++++++++++
> src/lxc/utils.h | 5 +++++
> 2 files changed, 40 insertions(+), 0 deletions(-)
>
> diff --git a/src/lxc/utils.c b/src/lxc/utils.c
> index 66bd19d..cd35e00 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 be1a8a8..d1242b1 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
More information about the lxc-devel
mailing list