Adds saferead() and safewrite(), which are like read() and write()
except that they retry in case of EINTR.

Signed-off-by: Jim Paris <[EMAIL PROTECTED]>
---
 src/util.c |   37 +++++++++++++++++++++++++++++++++++++
 src/util.h |    2 ++
 2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/src/util.c b/src/util.c
index 4f80eef..eb57859 100644
--- a/src/util.c
+++ b/src/util.c
@@ -189,3 +189,40 @@ virExecNonBlock(virConnectPtr conn,
     return(_virExec(conn, argv, retpid, infd, outfd, errfd, 1));
 }
 
+/* Like read(), but restarts after EINTR */
+int saferead(int fd, void *buf, size_t count)
+{
+       size_t nread = 0;
+       while (count > 0) { 
+               int r = read(fd, buf, count);
+               if (r < 0 && errno == EINTR)
+                       continue;
+               if (r < 0)
+                       return r;
+               if (r == 0)
+                       return nread;
+               buf = (unsigned char *)buf + r;
+               count -= r;
+               nread += r;
+       }
+       return nread;
+}
+
+/* Like write(), but restarts after EINTR */
+ssize_t safewrite(int fd, const void *buf, size_t count)
+{
+       size_t nwritten = 0;
+       while (count > 0) {
+               int r = write(fd, buf, count);
+               if (r < 0 && errno == EINTR)
+                       continue;
+               if (r < 0)
+                       return r;
+               if (r == 0)
+                       return nwritten;
+               buf = (unsigned char *)buf + r;
+               count -= r;
+               nwritten += r;
+       }
+       return nwritten;
+}
diff --git a/src/util.h b/src/util.h
index d11e6d9..f69fac8 100644
--- a/src/util.h
+++ b/src/util.h
@@ -24,3 +24,5 @@
 int virExec(virConnectPtr conn, char **argv, int *retpid, int infd, int 
*outfd, int *errfd);
 int virExecNonBlock(virConnectPtr conn, char **argv, int *retpid, int infd, 
int *outfd, int *errfd);
 
+int saferead(int fd, void *buf, size_t count);
+ssize_t safewrite(int fd, const void *buf, size_t count);
-- 
1.5.3.rc4

--
Libvir-list mailing list
Libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to