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 <christ...@iwakd.de> wrote: > Signed-off-by: Christian Seiler <christ...@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 ------------------------------------------------------------------------------ AlienVault Unified Security Management (USM) platform delivers complete security visibility with the essential security capabilities. Easily and efficiently configure, manage, and operate all of your security controls from a single console and one unified framework. Download a free trial. http://p.sf.net/sfu/alienvault_d2d _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel