[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