WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] libxc: Consolidate read()/write() syscall

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] libxc: Consolidate read()/write() syscall wrappers to read/write an
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 14 Nov 2007 04:40:09 -0800
Delivery-date: Wed, 14 Nov 2007 04:41:23 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir@xxxxxxxxxxxxx>
# Date 1194805353 0
# Node ID f669bf5c67206b5b0be080e35203d5a40e418e7d
# Parent  a790ad6ef0732b8ce77cc7c81ac7e63f7bfb9dd5
libxc: Consolidate read()/write() syscall wrappers to read/write an
exact number of bytes. The consolidated versions are more watertight
than the various versions previously distributed around the library
source code.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 tools/libxc/ia64/xc_ia64_linux_restore.c |   51 +++++++---------------
 tools/libxc/ia64/xc_ia64_linux_save.c    |   44 +++++++------------
 tools/libxc/xc_core.c                    |   22 +++------
 tools/libxc/xc_domain_restore.c          |   70 +++++++++++--------------------
 tools/libxc/xc_domain_save.c             |   58 +++++++++++--------------
 tools/libxc/xc_linux.c                   |   29 ------------
 tools/libxc/xc_netbsd.c                  |   29 ------------
 tools/libxc/xc_private.c                 |   36 +++++++++++++++
 tools/libxc/xc_private.h                 |    4 +
 tools/libxc/xc_solaris.c                 |   29 ------------
 10 files changed, 140 insertions(+), 232 deletions(-)

diff -r a790ad6ef073 -r f669bf5c6720 tools/libxc/ia64/xc_ia64_linux_restore.c
--- a/tools/libxc/ia64/xc_ia64_linux_restore.c  Sat Nov 10 10:55:27 2007 +0000
+++ b/tools/libxc/ia64/xc_ia64_linux_restore.c  Sun Nov 11 18:22:33 2007 +0000
@@ -28,25 +28,6 @@ static unsigned long p2m_size;
 /* number of 'in use' pfns in the guest (i.e. #P2M entries with a valid mfn) */
 static unsigned long nr_pfns;
 
-static ssize_t
-read_exact(int fd, void *buf, size_t count)
-{
-    int r = 0, s;
-    unsigned char *b = buf;
-
-    while (r < count) {
-        s = read(fd, &b[r], count - r);
-        if ((s == -1) && (errno == EINTR))
-            continue;
-        if (s <= 0) {
-            break;
-        }
-        r += s;
-    }
-
-    return (r == count) ? 1 : 0;
-}
-
 static int
 populate_page_if_necessary(int xc_handle, uint32_t dom, unsigned long gmfn,
                            struct xen_ia64_p2m_table *p2m_table)
@@ -68,7 +49,7 @@ read_page(int xc_handle, int io_fd, uint
         ERROR("cannot map page");
         return -1;
     }
-    if (!read_exact(io_fd, mem, PAGE_SIZE)) {
+    if (read_exact(io_fd, mem, PAGE_SIZE)) {
         ERROR("Error when reading from state file (5)");
         munmap(mem, PAGE_SIZE);
         return -1;
@@ -93,7 +74,7 @@ xc_ia64_recv_unallocated_list(int xc_han
     unsigned long *pfntab = NULL;
     unsigned int nr_frees;
 
-    if (!read_exact(io_fd, &count, sizeof(count))) {
+    if (read_exact(io_fd, &count, sizeof(count))) {
         ERROR("Error when reading pfn count");
         goto out;
     }
@@ -104,7 +85,7 @@ xc_ia64_recv_unallocated_list(int xc_han
         goto out;
     }
 
-    if (!read_exact(io_fd, pfntab, sizeof(unsigned long)*count)) {
+    if (read_exact(io_fd, pfntab, sizeof(unsigned long)*count)) {
         ERROR("Error when reading pfntab");
         goto out;
     }
@@ -138,7 +119,7 @@ xc_ia64_recv_vcpu_context(int xc_handle,
 xc_ia64_recv_vcpu_context(int xc_handle, int io_fd, uint32_t dom,
                           uint32_t vcpu, vcpu_guest_context_t *ctxt)
 {
-    if (!read_exact(io_fd, ctxt, sizeof(*ctxt))) {
+    if (read_exact(io_fd, ctxt, sizeof(*ctxt))) {
         ERROR("Error when reading ctxt");
         return -1;
     }
@@ -182,7 +163,7 @@ xc_ia64_recv_shared_info(int xc_handle, 
         return -1;
     }
 
-    if (!read_exact(io_fd, shared_info, PAGE_SIZE)) {
+    if (read_exact(io_fd, shared_info, PAGE_SIZE)) {
         ERROR("Error when reading shared_info page");
         munmap(shared_info, PAGE_SIZE);
         return -1;
@@ -308,7 +289,7 @@ xc_ia64_hvm_recv_context(int xc_handle, 
         ERROR("Could not get domain info");
         goto out;
     }
-    if (!read_exact(io_fd, &max_virt_cpus, sizeof(max_virt_cpus))) {
+    if (read_exact(io_fd, &max_virt_cpus, sizeof(max_virt_cpus))) {
         ERROR("error reading max_virt_cpus");
         goto out;
     }
@@ -325,7 +306,7 @@ xc_ia64_hvm_recv_context(int xc_handle, 
         goto out;
     }
     memset(vcpumap, 0, vcpumap_size);
-    if (!read_exact(io_fd, vcpumap, vcpumap_size)) {
+    if (read_exact(io_fd, vcpumap, vcpumap_size)) {
         ERROR("read vcpumap");
         goto out;
     }
@@ -345,7 +326,7 @@ xc_ia64_hvm_recv_context(int xc_handle, 
     }    
 
     /* Set HVM-specific parameters */
-    if (!read_exact(io_fd, magic_pfns, sizeof(magic_pfns))) {
+    if (read_exact(io_fd, magic_pfns, sizeof(magic_pfns))) {
         ERROR("error reading magic page addresses");
         goto out;
     }
@@ -372,7 +353,7 @@ xc_ia64_hvm_recv_context(int xc_handle, 
     *store_mfn = magic_pfns[0];
 
     /* Read HVM context */
-    if (!read_exact(io_fd, &rec_size, sizeof(rec_size))) {
+    if (read_exact(io_fd, &rec_size, sizeof(rec_size))) {
         ERROR("error read hvm context size!\n");
         goto out;
     }
@@ -384,7 +365,7 @@ xc_ia64_hvm_recv_context(int xc_handle, 
         goto out;
     }
 
-    if (!read_exact(io_fd, hvm_buf, rec_size)) {
+    if (read_exact(io_fd, hvm_buf, rec_size)) {
         ERROR("error loading the HVM context");
         goto out;
     }
@@ -445,14 +426,14 @@ xc_domain_restore(int xc_handle, int io_
     /* For info only */
     nr_pfns = 0;
 
-    if ( !read_exact(io_fd, &p2m_size, sizeof(unsigned long)) )
+    if ( read_exact(io_fd, &p2m_size, sizeof(unsigned long)) )
     {
         ERROR("read: p2m_size");
         goto out;
     }
     DPRINTF("xc_linux_restore start: p2m_size = %lx\n", p2m_size);
 
-    if (!read_exact(io_fd, &ver, sizeof(unsigned long))) {
+    if (read_exact(io_fd, &ver, sizeof(unsigned long))) {
         ERROR("Error when reading version");
         goto out;
     }
@@ -461,7 +442,7 @@ xc_domain_restore(int xc_handle, int io_
         goto out;
     }
 
-    if (!read_exact(io_fd, &domctl.u.arch_setup, sizeof(domctl.u.arch_setup))) 
{
+    if (read_exact(io_fd, &domctl.u.arch_setup, sizeof(domctl.u.arch_setup))) {
         ERROR("read: domain setup");
         goto out;
     }
@@ -492,7 +473,7 @@ xc_domain_restore(int xc_handle, int io_
         unsigned long memmap_size;
         xen_ia64_memmap_info_t *memmap_info;
 
-        if (!read_exact(io_fd, &memmap_info_num_pages,
+        if (read_exact(io_fd, &memmap_info_num_pages,
                         sizeof(memmap_info_num_pages))) {
             ERROR("read: memmap_info_num_pages");
             goto out;
@@ -503,7 +484,7 @@ xc_domain_restore(int xc_handle, int io_
             ERROR("Could not allocate memory for memmap_info");
             goto out;
         }
-        if (!read_exact(io_fd, memmap_info, memmap_size)) {
+        if (read_exact(io_fd, memmap_info, memmap_size)) {
             ERROR("read: memmap_info");
             goto out;
         }
@@ -546,7 +527,7 @@ xc_domain_restore(int xc_handle, int io_
 
     while (1) {
         unsigned long gmfn;
-        if (!read_exact(io_fd, &gmfn, sizeof(unsigned long))) {
+        if (read_exact(io_fd, &gmfn, sizeof(unsigned long))) {
             ERROR("Error when reading batch size");
             goto out;
         }
diff -r a790ad6ef073 -r f669bf5c6720 tools/libxc/ia64/xc_ia64_linux_save.c
--- a/tools/libxc/ia64/xc_ia64_linux_save.c     Sat Nov 10 10:55:27 2007 +0000
+++ b/tools/libxc/ia64/xc_ia64_linux_save.c     Sun Nov 11 18:22:33 2007 +0000
@@ -79,14 +79,6 @@ static int xc_ia64_shadow_control(int xc
                              dirty_bitmap, pages, NULL, 0, stats);
 }
 
-static inline ssize_t
-write_exact(int fd, void *buf, size_t count)
-{
-    if (write(fd, buf, count) != count)
-        return 0;
-    return 1;
-}
-
 static int
 suspend_and_state(int (*suspend)(int), int xc_handle, int io_fd,
                   int dom, xc_dominfo_t *info)
@@ -174,7 +166,7 @@ xc_ia64_send_unallocated_list(int xc_han
                 j++;
         }
     }
-    if (!write_exact(io_fd, &j, sizeof(unsigned int))) {
+    if (write_exact(io_fd, &j, sizeof(unsigned int))) {
         ERROR("Error when writing to state file (6a)");
         return -1;
     }
@@ -195,7 +187,7 @@ xc_ia64_send_unallocated_list(int xc_han
             if (!xc_ia64_p2m_allocated(p2m_table, N))
                 pfntab[j++] = N;
             if (j == sizeof(pfntab)/sizeof(pfntab[0])) {
-                if (!write_exact(io_fd, &pfntab, sizeof(pfntab[0]) * j)) {
+                if (write_exact(io_fd, &pfntab, sizeof(pfntab[0]) * j)) {
                     ERROR("Error when writing to state file (6b)");
                     return -1;
                 }
@@ -204,7 +196,7 @@ xc_ia64_send_unallocated_list(int xc_han
         }
     }
     if (j > 0) {
-        if (!write_exact(io_fd, &pfntab, sizeof(pfntab[0]) * j)) {
+        if (write_exact(io_fd, &pfntab, sizeof(pfntab[0]) * j)) {
             ERROR("Error when writing to state file (6c)");
             return -1;
         }
@@ -222,7 +214,7 @@ xc_ia64_send_vcpu_context(int xc_handle,
         return -1;
     }
 
-    if (!write_exact(io_fd, ctxt, sizeof(*ctxt))) {
+    if (write_exact(io_fd, ctxt, sizeof(*ctxt))) {
         ERROR("Error when writing to state file (1)");
         return -1;
     }
@@ -234,7 +226,7 @@ static int
 static int
 xc_ia64_send_shared_info(int xc_handle, int io_fd, shared_info_t *live_shinfo)
 {
-    if (!write_exact(io_fd, live_shinfo, PAGE_SIZE)) {
+    if (write_exact(io_fd, live_shinfo, PAGE_SIZE)) {
         ERROR("Error when writing to state file (1)");
         return -1;
     }
@@ -258,7 +250,7 @@ xc_ia64_pv_send_context(int xc_handle, i
         ERROR("cannot map privreg page");
         return -1;
     }
-    if (!write_exact(io_fd, mem, PAGE_SIZE)) {
+    if (write_exact(io_fd, mem, PAGE_SIZE)) {
         ERROR("Error when writing privreg to state file (5)");
         munmap(mem, PAGE_SIZE);
         return -1;
@@ -319,12 +311,12 @@ xc_ia64_hvm_send_context(int xc_handle, 
             __set_bit(i, vcpumap);
     }
 
-    if (!write_exact(io_fd, &max_virt_cpus, sizeof(max_virt_cpus))) {
+    if (write_exact(io_fd, &max_virt_cpus, sizeof(max_virt_cpus))) {
         ERROR("write max_virt_cpus");
         goto out;
     }
 
-    if (!write_exact(io_fd, vcpumap, vcpumap_size)) {
+    if (write_exact(io_fd, vcpumap, vcpumap_size)) {
         ERROR("write vcpumap");
         goto out;
     }
@@ -352,7 +344,7 @@ xc_ia64_hvm_send_context(int xc_handle, 
         }
     }
 
-    if (!write_exact(io_fd, magic_pfns, sizeof(magic_pfns))) {
+    if (write_exact(io_fd, magic_pfns, sizeof(magic_pfns))) {
         ERROR("Error when writing to state file (7)");
         goto out;
     }
@@ -377,12 +369,12 @@ xc_ia64_hvm_send_context(int xc_handle, 
         goto out;
     }
         
-    if (!write_exact(io_fd, &rec_size, sizeof(rec_size))) {
+    if (write_exact(io_fd, &rec_size, sizeof(rec_size))) {
         ERROR("error write hvm buffer size");
         goto out;
     }
         
-    if (!write_exact(io_fd, hvm_buf, rec_size)) {
+    if (write_exact(io_fd, hvm_buf, rec_size)) {
         ERROR("write HVM info failed!\n");
         goto out;
     }
@@ -496,7 +488,7 @@ xc_domain_save(int xc_handle, int io_fd,
     p2m_size = xc_memory_op(xc_handle, XENMEM_maximum_gpfn, &dom);
 
     /* This is expected by xm restore.  */
-    if (!write_exact(io_fd, &p2m_size, sizeof(unsigned long))) {
+    if (write_exact(io_fd, &p2m_size, sizeof(unsigned long))) {
         ERROR("write: p2m_size");
         goto out;
     }
@@ -509,7 +501,7 @@ xc_domain_save(int xc_handle, int io_fd,
     {
         unsigned long version = XC_IA64_SR_FORMAT_VER_CURRENT;
 
-        if (!write_exact(io_fd, &version, sizeof(unsigned long))) {
+        if (write_exact(io_fd, &version, sizeof(unsigned long))) {
             ERROR("write: version");
             goto out;
         }
@@ -522,7 +514,7 @@ xc_domain_save(int xc_handle, int io_fd,
         ERROR("Could not get domain setup");
         goto out;
     }
-    if (!write_exact(io_fd, &domctl.u.arch_setup,
+    if (write_exact(io_fd, &domctl.u.arch_setup,
                      sizeof(domctl.u.arch_setup))) {
         ERROR("write: domain setup");
         goto out;
@@ -605,12 +597,12 @@ xc_domain_save(int xc_handle, int io_fd,
         PERROR("xc_ia64_p2m_map");
         goto out;
     }
-    if (!write_exact(io_fd,
+    if (write_exact(io_fd,
                      &memmap_info_num_pages, sizeof(memmap_info_num_pages))) {
         PERROR("write: arch.memmap_info_num_pages");
         goto out;
     }
-    if (!write_exact(io_fd, memmap_info, memmap_size)) {
+    if (write_exact(io_fd, memmap_info, memmap_size)) {
         PERROR("write: memmap_info");
         goto out;
     }
@@ -679,7 +671,7 @@ xc_domain_save(int xc_handle, int io_fd,
                     continue;
                 }
 
-                if (!write_exact(io_fd, &N, sizeof(N))) {
+                if (write_exact(io_fd, &N, sizeof(N))) {
                     ERROR("write: p2m_size");
                     munmap(mem, PAGE_SIZE);
                     goto out;
@@ -751,7 +743,7 @@ xc_domain_save(int xc_handle, int io_fd,
     /* terminate */
     {
         unsigned long pfn = INVALID_MFN;
-        if (!write_exact(io_fd, &pfn, sizeof(pfn))) {
+        if (write_exact(io_fd, &pfn, sizeof(pfn))) {
             ERROR("Error when writing to state file (6)");
             goto out;
         }
diff -r a790ad6ef073 -r f669bf5c6720 tools/libxc/xc_core.c
--- a/tools/libxc/xc_core.c     Sat Nov 10 10:55:27 2007 +0000
+++ b/tools/libxc/xc_core.c     Sun Nov 11 18:22:33 2007 +0000
@@ -860,19 +860,15 @@ static int local_file_dump(void *args, c
 static int local_file_dump(void *args, char *buffer, unsigned int length)
 {
     struct dump_args *da = args;
-    int bytes, offset;
-
-    for ( offset = 0; offset < length; offset += bytes )
-    {
-        bytes = write(da->fd, &buffer[offset], length-offset);
-        if ( bytes <= 0 )
-        {
-            PERROR("Failed to write buffer");
-            return -errno;
-        }
-    }
-
-    if (length >= DUMP_INCREMENT*PAGE_SIZE) {
+
+    if ( write_exact(da->fd, buffer, length) == -1 )
+    {
+        PERROR("Failed to write buffer");
+        return -errno;
+    }
+
+    if ( length >= (DUMP_INCREMENT * PAGE_SIZE) )
+    {
         // Now dumping pages -- make sure we discard clean pages from
         // the cache after each write
         discard_file_cache(da->fd, 0 /* no flush */);
diff -r a790ad6ef073 -r f669bf5c6720 tools/libxc/xc_domain_restore.c
--- a/tools/libxc/xc_domain_restore.c   Sat Nov 10 10:55:27 2007 +0000
+++ b/tools/libxc/xc_domain_restore.c   Sun Nov 11 18:22:33 2007 +0000
@@ -59,26 +59,6 @@ static xen_pfn_t *p2m_batch = NULL;
 /* Address size of the guest, in bytes */
 unsigned int guest_width;
 
-
-static ssize_t
-read_exact(int fd, void *buf, size_t count)
-{
-    int r = 0, s;
-    unsigned char *b = buf;
-
-    while ( r < count )
-    {
-        s = read(fd, &b[r], count - r);
-        if ( (s == -1) && (errno == EINTR) )
-            continue;
-        if ( s <= 0 )
-            break;
-        r += s;
-    }
-
-    return (r == count);
-}
-
 /*
 ** In the state file (or during transfer), all page-table pages are
 ** converted into a 'canonical' form where references to actual mfns
@@ -177,7 +157,7 @@ static xen_pfn_t *load_p2m_frame_list(
     xen_pfn_t p2m_fl_zero;
 
     /* Read first entry of P2M list, or extended-info signature (~0UL). */
-    if ( !read_exact(io_fd, &p2m_fl_zero, sizeof(long)) )
+    if ( read_exact(io_fd, &p2m_fl_zero, sizeof(long)) )
     {
         ERROR("read extended-info signature failed");
         return NULL;
@@ -188,7 +168,7 @@ static xen_pfn_t *load_p2m_frame_list(
         uint32_t tot_bytes;
         
         /* Next 4 bytes: total size of following extended info. */
-        if ( !read_exact(io_fd, &tot_bytes, sizeof(tot_bytes)) )
+        if ( read_exact(io_fd, &tot_bytes, sizeof(tot_bytes)) )
         {
             ERROR("read extended-info size failed");
             return NULL;
@@ -200,8 +180,8 @@ static xen_pfn_t *load_p2m_frame_list(
             char     chunk_sig[4];
             
             /* 4-character chunk signature + 4-byte remaining chunk size. */
-            if ( !read_exact(io_fd, chunk_sig, sizeof(chunk_sig)) ||
-                 !read_exact(io_fd, &chunk_bytes, sizeof(chunk_bytes)) ||
+            if ( read_exact(io_fd, chunk_sig, sizeof(chunk_sig)) ||
+                 read_exact(io_fd, &chunk_bytes, sizeof(chunk_bytes)) ||
                  (tot_bytes < (chunk_bytes + 8)) )
             {
                 ERROR("read extended-info chunk signature failed");
@@ -230,7 +210,7 @@ static xen_pfn_t *load_p2m_frame_list(
                     return NULL;
                 }
 
-                if ( !read_exact(io_fd, &ctxt, chunk_bytes) )
+                if ( read_exact(io_fd, &ctxt, chunk_bytes) )
                 {
                     ERROR("read extended-info vcpu context failed");
                     return NULL;
@@ -251,7 +231,7 @@ static xen_pfn_t *load_p2m_frame_list(
             while ( chunk_bytes )
             {
                 unsigned long sz = MIN(chunk_bytes, sizeof(xen_pfn_t));
-                if ( !read_exact(io_fd, &p2m_fl_zero, sz) )
+                if ( read_exact(io_fd, &p2m_fl_zero, sz) )
                 {
                     ERROR("read-and-discard extended-info chunk bytes failed");
                     return NULL;
@@ -262,7 +242,7 @@ static xen_pfn_t *load_p2m_frame_list(
         }
 
         /* Now read the real first entry of P2M list. */
-        if ( !read_exact(io_fd, &p2m_fl_zero, sizeof(xen_pfn_t)) )
+        if ( read_exact(io_fd, &p2m_fl_zero, sizeof(xen_pfn_t)) )
         {
             ERROR("read first entry of p2m_frame_list failed");
             return NULL;
@@ -279,8 +259,8 @@ static xen_pfn_t *load_p2m_frame_list(
 
     /* First entry has already been read. */
     p2m_frame_list[0] = p2m_fl_zero;
-    if ( !read_exact(io_fd, &p2m_frame_list[1], 
-                     (P2M_FL_ENTRIES - 1) * sizeof(xen_pfn_t)) )
+    if ( read_exact(io_fd, &p2m_frame_list[1], 
+                    (P2M_FL_ENTRIES - 1) * sizeof(xen_pfn_t)) )
     {
         ERROR("read p2m_frame_list failed");
         return NULL;
@@ -349,7 +329,7 @@ int xc_domain_restore(int xc_handle, int
     /* For info only */
     nr_pfns = 0;
 
-    if ( !read_exact(io_fd, &p2m_size, sizeof(unsigned long)) )
+    if ( read_exact(io_fd, &p2m_size, sizeof(unsigned long)) )
     {
         ERROR("read: p2m_size");
         goto out;
@@ -464,7 +444,7 @@ int xc_domain_restore(int xc_handle, int
             prev_pc = this_pc;
         }
 
-        if ( !read_exact(io_fd, &j, sizeof(int)) )
+        if ( read_exact(io_fd, &j, sizeof(int)) )
         {
             ERROR("Error when reading batch size");
             goto out;
@@ -482,9 +462,9 @@ int xc_domain_restore(int xc_handle, int
         if ( j == -2 )
         {
             new_ctxt_format = 1;
-            if ( !read_exact(io_fd, &max_vcpu_id, sizeof(int)) ||
+            if ( read_exact(io_fd, &max_vcpu_id, sizeof(int)) ||
                  (max_vcpu_id >= 64) ||
-                 !read_exact(io_fd, &vcpumap, sizeof(uint64_t)) )
+                 read_exact(io_fd, &vcpumap, sizeof(uint64_t)) )
             {
                 ERROR("Error when reading max_vcpu_id");
                 goto out;
@@ -501,7 +481,7 @@ int xc_domain_restore(int xc_handle, int
             goto out;
         }
 
-        if ( !read_exact(io_fd, region_pfn_type, j*sizeof(unsigned long)) )
+        if ( read_exact(io_fd, region_pfn_type, j*sizeof(unsigned long)) )
         {
             ERROR("Error when reading region pfn types");
             goto out;
@@ -594,7 +574,7 @@ int xc_domain_restore(int xc_handle, int
             /* In verify mode, we use a copy; otherwise we work in place */
             page = verify ? (void *)buf : (region_base + i*PAGE_SIZE);
 
-            if ( !read_exact(io_fd, page, PAGE_SIZE) )
+            if ( read_exact(io_fd, page, PAGE_SIZE) )
             {
                 ERROR("Error when reading page (type was %lx)", pagetype);
                 goto out;
@@ -704,7 +684,7 @@ int xc_domain_restore(int xc_handle, int
         uint32_t rec_len;
 
         /* Set HVM-specific parameters */
-        if ( !read_exact(io_fd, magic_pfns, sizeof(magic_pfns)) )
+        if ( read_exact(io_fd, magic_pfns, sizeof(magic_pfns)) )
         {
             ERROR("error reading magic page addresses");
             goto out;
@@ -737,7 +717,7 @@ int xc_domain_restore(int xc_handle, int
         *store_mfn = magic_pfns[2];
 
         /* Read HVM context */
-        if ( !read_exact(io_fd, &rec_len, sizeof(uint32_t)) )
+        if ( read_exact(io_fd, &rec_len, sizeof(uint32_t)) )
         {
             ERROR("error read hvm context size!\n");
             goto out;
@@ -751,7 +731,7 @@ int xc_domain_restore(int xc_handle, int
             goto out;
         }
         
-        if ( !read_exact(io_fd, hvm_buf, rec_len) )
+        if ( read_exact(io_fd, hvm_buf, rec_len) )
         {
             ERROR("error loading the HVM context");
             goto out;
@@ -943,7 +923,7 @@ int xc_domain_restore(int xc_handle, int
         unsigned long *pfntab;
         int nr_frees;
 
-        if ( !read_exact(io_fd, &count, sizeof(count)) ||
+        if ( read_exact(io_fd, &count, sizeof(count)) ||
              (count > (1U << 28)) ) /* up to 1TB of address space */
         {
             ERROR("Error when reading pfn count (= %u)", count);
@@ -956,7 +936,7 @@ int xc_domain_restore(int xc_handle, int
             goto out;
         }
 
-        if ( !read_exact(io_fd, pfntab, sizeof(unsigned long)*count) )
+        if ( read_exact(io_fd, pfntab, sizeof(unsigned long)*count) )
         {
             ERROR("Error when reading pfntab");
             goto out;
@@ -1001,9 +981,9 @@ int xc_domain_restore(int xc_handle, int
         if ( !(vcpumap & (1ULL << i)) )
             continue;
 
-        if ( !read_exact(io_fd, &ctxt, ((guest_width == 8)
-                                        ? sizeof(ctxt.x64)
-                                        : sizeof(ctxt.x32))) )
+        if ( read_exact(io_fd, &ctxt, ((guest_width == 8)
+                                       ? sizeof(ctxt.x64)
+                                       : sizeof(ctxt.x32))) )
         {
             ERROR("Error when reading ctxt %d", i);
             goto out;
@@ -1112,7 +1092,7 @@ int xc_domain_restore(int xc_handle, int
 
         if ( !ext_vcpucontext )
             continue;
-        if ( !read_exact(io_fd, &domctl.u.ext_vcpucontext, 128) ||
+        if ( read_exact(io_fd, &domctl.u.ext_vcpucontext, 128) ||
              (domctl.u.ext_vcpucontext.vcpu != i) )
         {
             ERROR("Error when reading extended ctxt %d", i);
@@ -1128,7 +1108,7 @@ int xc_domain_restore(int xc_handle, int
         }
     }
 
-    if ( !read_exact(io_fd, shared_info_page, PAGE_SIZE) )
+    if ( read_exact(io_fd, shared_info_page, PAGE_SIZE) )
     {
         ERROR("Error when reading shared info page");
         goto out;
diff -r a790ad6ef073 -r f669bf5c6720 tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c      Sat Nov 10 10:55:27 2007 +0000
+++ b/tools/libxc/xc_domain_save.c      Sun Nov 11 18:22:33 2007 +0000
@@ -175,8 +175,7 @@ static int noncached_write(int fd, int l
 static int noncached_write(int fd, int live, void *buffer, int len) 
 {
     static int write_count = 0;
-
-    int rc = write(fd,buffer,len);
+    int rc = (write_exact(fd, buffer, len) == 0) ? len : -1;
 
     write_count += len;
     if ( write_count >= (MAX_PAGECACHE_USAGE * PAGE_SIZE) )
@@ -281,11 +280,6 @@ static int ratewrite(int io_fd, int live
 
 #endif
 
-static inline ssize_t write_exact(int fd, void *buf, size_t count)
-{
-    return (write(fd, buf, count) == count);
-}
-
 static int print_stats(int xc_handle, uint32_t domid, int pages_sent,
                        xc_shadow_op_stats_t *stats, int print)
 {
@@ -782,21 +776,21 @@ static xen_pfn_t *map_and_save_p2m_table
                               : sizeof(ctxt.x32));
         uint32_t chunk2_sz = 0;
         uint32_t tot_sz    = (chunk1_sz + 8) + (chunk2_sz + 8);
-        if ( !write_exact(io_fd, &signature, sizeof(signature)) ||
-             !write_exact(io_fd, &tot_sz, sizeof(tot_sz)) ||
-             !write_exact(io_fd, "vcpu", 4) ||
-             !write_exact(io_fd, &chunk1_sz, sizeof(chunk1_sz)) ||
-             !write_exact(io_fd, &ctxt, chunk1_sz) ||
-             !write_exact(io_fd, "extv", 4) ||
-             !write_exact(io_fd, &chunk2_sz, sizeof(chunk2_sz)) )
+        if ( write_exact(io_fd, &signature, sizeof(signature)) ||
+             write_exact(io_fd, &tot_sz, sizeof(tot_sz)) ||
+             write_exact(io_fd, "vcpu", 4) ||
+             write_exact(io_fd, &chunk1_sz, sizeof(chunk1_sz)) ||
+             write_exact(io_fd, &ctxt, chunk1_sz) ||
+             write_exact(io_fd, "extv", 4) ||
+             write_exact(io_fd, &chunk2_sz, sizeof(chunk2_sz)) )
         {
             ERROR("write: extended info");
             goto out;
         }
     }
 
-    if ( !write_exact(io_fd, p2m_frame_list, 
-                      P2M_FL_ENTRIES * sizeof(xen_pfn_t)) )
+    if ( write_exact(io_fd, p2m_frame_list, 
+                     P2M_FL_ENTRIES * sizeof(xen_pfn_t)) )
     {
         ERROR("write: p2m_frame_list");
         goto out;
@@ -1044,7 +1038,7 @@ int xc_domain_save(int xc_handle, int io
     }
 
     /* Start writing out the saved-domain record. */
-    if ( !write_exact(io_fd, &p2m_size, sizeof(unsigned long)) )
+    if ( write_exact(io_fd, &p2m_size, sizeof(unsigned long)) )
     {
         ERROR("write: p2m_size");
         goto out;
@@ -1249,14 +1243,14 @@ int xc_domain_save(int xc_handle, int io
                 }
             }
 
-            if ( !write_exact(io_fd, &batch, sizeof(unsigned int)) )
+            if ( write_exact(io_fd, &batch, sizeof(unsigned int)) )
             {
                 ERROR("Error when writing to state file (2) (errno %d)",
                       errno);
                 goto out;
             }
 
-            if ( !write_exact(io_fd, pfn_type, sizeof(unsigned long)*batch) )
+            if ( write_exact(io_fd, pfn_type, sizeof(unsigned long)*batch) )
             {
                 ERROR("Error when writing to state file (3) (errno %d)",
                       errno);
@@ -1342,7 +1336,7 @@ int xc_domain_save(int xc_handle, int io
             DPRINTF("Entering debug resend-all mode\n");
 
             /* send "-1" to put receiver into debug mode */
-            if ( !write_exact(io_fd, &minusone, sizeof(int)) )
+            if ( write_exact(io_fd, &minusone, sizeof(int)) )
             {
                 ERROR("Error when writing to state file (6) (errno %d)",
                       errno);
@@ -1434,7 +1428,7 @@ int xc_domain_save(int xc_handle, int io
         }
 
         chunk.vcpumap = vcpumap;
-        if ( !write_exact(io_fd, &chunk, sizeof(chunk)) )
+        if ( write_exact(io_fd, &chunk, sizeof(chunk)) )
         {
             ERROR("Error when writing to state file (errno %d)", errno);
             goto out;
@@ -1443,7 +1437,7 @@ int xc_domain_save(int xc_handle, int io
 
     /* Zero terminate */
     i = 0;
-    if ( !write_exact(io_fd, &i, sizeof(int)) )
+    if ( write_exact(io_fd, &i, sizeof(int)) )
     {
         ERROR("Error when writing to state file (6') (errno %d)", errno);
         goto out;
@@ -1461,7 +1455,7 @@ int xc_domain_save(int xc_handle, int io
                          (unsigned long *)&magic_pfns[1]);
         xc_get_hvm_param(xc_handle, dom, HVM_PARAM_STORE_PFN,
                          (unsigned long *)&magic_pfns[2]);
-        if ( !write_exact(io_fd, magic_pfns, sizeof(magic_pfns)) )
+        if ( write_exact(io_fd, magic_pfns, sizeof(magic_pfns)) )
         {
             ERROR("Error when writing to state file (7)");
             goto out;
@@ -1475,13 +1469,13 @@ int xc_domain_save(int xc_handle, int io
             goto out;
         }
         
-        if ( !write_exact(io_fd, &rec_size, sizeof(uint32_t)) )
+        if ( write_exact(io_fd, &rec_size, sizeof(uint32_t)) )
         {
             ERROR("error write hvm buffer size");
             goto out;
         }
         
-        if ( !write_exact(io_fd, hvm_buf, rec_size) )
+        if ( write_exact(io_fd, hvm_buf, rec_size) )
         {
             ERROR("write HVM info failed!\n");
             goto out;
@@ -1505,7 +1499,7 @@ int xc_domain_save(int xc_handle, int io
                 j++;
         }
 
-        if ( !write_exact(io_fd, &j, sizeof(unsigned int)) )
+        if ( write_exact(io_fd, &j, sizeof(unsigned int)) )
         {
             ERROR("Error when writing to state file (6a) (errno %d)", errno);
             goto out;
@@ -1519,7 +1513,7 @@ int xc_domain_save(int xc_handle, int io
             i++;
             if ( (j == 1024) || (i == p2m_size) )
             {
-                if ( !write_exact(io_fd, &pfntab, sizeof(unsigned long)*j) )
+                if ( write_exact(io_fd, &pfntab, sizeof(unsigned long)*j) )
                 {
                     ERROR("Error when writing to state file (6b) (errno %d)",
                           errno);
@@ -1596,9 +1590,9 @@ int xc_domain_save(int xc_handle, int io
                     mfn_to_pfn(xen_cr3_to_pfn(ctxt.x64.ctrlreg[1])));
         }
 
-        if ( !write_exact(io_fd, &ctxt, ((guest_width==8) 
-                                         ? sizeof(ctxt.x64) 
-                                         : sizeof(ctxt.x32))) )
+        if ( write_exact(io_fd, &ctxt, ((guest_width==8) 
+                                        ? sizeof(ctxt.x64) 
+                                        : sizeof(ctxt.x32))) )
         {
             ERROR("Error when writing to state file (1) (errno %d)", errno);
             goto out;
@@ -1612,7 +1606,7 @@ int xc_domain_save(int xc_handle, int io
             ERROR("No extended context for VCPU%d", i);
             goto out;
         }
-        if ( !write_exact(io_fd, &domctl.u.ext_vcpucontext, 128) )
+        if ( write_exact(io_fd, &domctl.u.ext_vcpucontext, 128) )
         {
             ERROR("Error when writing to state file (2) (errno %d)", errno);
             goto out;
@@ -1625,7 +1619,7 @@ int xc_domain_save(int xc_handle, int io
     memcpy(page, live_shinfo, PAGE_SIZE);
     SET_FIELD(((shared_info_either_t *)page), 
               arch.pfn_to_mfn_frame_list_list, 0);
-    if ( !write_exact(io_fd, page, PAGE_SIZE) )
+    if ( write_exact(io_fd, page, PAGE_SIZE) )
     {
         ERROR("Error when writing to state file (1) (errno %d)", errno);
         goto out;
diff -r a790ad6ef073 -r f669bf5c6720 tools/libxc/xc_linux.c
--- a/tools/libxc/xc_linux.c    Sat Nov 10 10:55:27 2007 +0000
+++ b/tools/libxc/xc_linux.c    Sun Nov 11 18:22:33 2007 +0000
@@ -295,37 +295,12 @@ int xc_evtchn_unbind(int xce_handle, evt
     return ioctl(xce_handle, IOCTL_EVTCHN_UNBIND, &unbind);
 }
 
-static int dorw(int fd, char *data, size_t size, int do_write)
-{
-    size_t offset = 0;
-    ssize_t len;
-
-    while ( offset < size )
-    {
-        if (do_write)
-            len = write(fd, data + offset, size - offset);
-        else
-            len = read(fd, data + offset, size - offset);
-
-        if ( len == -1 )
-        {
-             if ( errno == EINTR )
-                 continue;
-             return -1;
-        }
-
-        offset += len;
-    }
-
-    return 0;
-}
-
 evtchn_port_or_error_t
 xc_evtchn_pending(int xce_handle)
 {
     evtchn_port_t port;
 
-    if ( dorw(xce_handle, (char *)&port, sizeof(port), 0) == -1 )
+    if ( read_exact(xce_handle, (char *)&port, sizeof(port)) == -1 )
         return -1;
 
     return port;
@@ -333,7 +308,7 @@ xc_evtchn_pending(int xce_handle)
 
 int xc_evtchn_unmask(int xce_handle, evtchn_port_t port)
 {
-    return dorw(xce_handle, (char *)&port, sizeof(port), 1);
+    return write_exact(xce_handle, (char *)&port, sizeof(port));
 }
 
 /* Optionally flush file to disk and discard page cache */
diff -r a790ad6ef073 -r f669bf5c6720 tools/libxc/xc_netbsd.c
--- a/tools/libxc/xc_netbsd.c   Sat Nov 10 10:55:27 2007 +0000
+++ b/tools/libxc/xc_netbsd.c   Sun Nov 11 18:22:33 2007 +0000
@@ -209,37 +209,12 @@ xc_evtchn_bind_virq(int xce_handle, unsi
        return bind.port;
 }
 
-static int dorw(int fd, char *data, size_t size, int do_write)
-{
-    size_t offset = 0;
-    ssize_t len;
-
-    while ( offset < size )
-    {
-        if (do_write)
-            len = write(fd, data + offset, size - offset);
-        else
-            len = read(fd, data + offset, size - offset);
-
-        if ( len == -1 )
-        {
-             if ( errno == EINTR )
-                 continue;
-             return -1;
-        }
-
-        offset += len;
-    }
-
-    return 0;
-}
-
 evtchn_port_or_error_t
 xc_evtchn_pending(int xce_handle)
 {
     evtchn_port_t port;
 
-    if ( dorw(xce_handle, (char *)&port, sizeof(port), 0) == -1 )
+    if ( read_exact(xce_handle, (char *)&port, sizeof(port)) == -1 )
         return -1;
 
     return port;
@@ -247,7 +222,7 @@ xc_evtchn_pending(int xce_handle)
 
 int xc_evtchn_unmask(int xce_handle, evtchn_port_t port)
 {
-    return dorw(xce_handle, (char *)&port, sizeof(port), 1);
+    return write_exact(xce_handle, (char *)&port, sizeof(port));
 }
 
 /* Optionally flush file to disk and discard page cache */
diff -r a790ad6ef073 -r f669bf5c6720 tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c  Sat Nov 10 10:55:27 2007 +0000
+++ b/tools/libxc/xc_private.c  Sun Nov 11 18:22:33 2007 +0000
@@ -581,6 +581,42 @@ void bitmap_byte_to_64(uint64_t *lp, con
     }
 }
 
+int read_exact(int fd, void *data, size_t size)
+{
+    size_t offset = 0;
+    ssize_t len;
+
+    while ( offset < size )
+    {
+        len = read(fd, (char *)data + offset, size - offset);
+        if ( (len == -1) && (errno == EINTR) )
+            continue;
+        if ( len <= 0 )
+            return -1;
+        offset += len;
+    }
+
+    return 0;
+}
+
+int write_exact(int fd, const void *data, size_t size)
+{
+    size_t offset = 0;
+    ssize_t len;
+
+    while ( offset < size )
+    {
+        len = write(fd, (const char *)data + offset, size - offset);
+        if ( (len == -1) && (errno == EINTR) )
+            continue;
+        if ( len <= 0 )
+            return -1;
+        offset += len;
+    }
+
+    return 0;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r a790ad6ef073 -r f669bf5c6720 tools/libxc/xc_private.h
--- a/tools/libxc/xc_private.h  Sat Nov 10 10:55:27 2007 +0000
+++ b/tools/libxc/xc_private.h  Sun Nov 11 18:22:33 2007 +0000
@@ -180,4 +180,8 @@ int xc_add_mmu_update(int xc_handle, str
                    unsigned long long ptr, unsigned long long val);
 int xc_flush_mmu_updates(int xc_handle, struct xc_mmu *mmu);
 
+/* Return 0 on success; -1 on error. */
+int read_exact(int fd, void *data, size_t size);
+int write_exact(int fd, const void *data, size_t size);
+
 #endif /* __XC_PRIVATE_H__ */
diff -r a790ad6ef073 -r f669bf5c6720 tools/libxc/xc_solaris.c
--- a/tools/libxc/xc_solaris.c  Sat Nov 10 10:55:27 2007 +0000
+++ b/tools/libxc/xc_solaris.c  Sun Nov 11 18:22:33 2007 +0000
@@ -206,37 +206,12 @@ int xc_evtchn_unbind(int xce_handle, evt
     return ioctl(xce_handle, IOCTL_EVTCHN_UNBIND, &unbind);
 }
 
-static int dorw(int fd, char *data, size_t size, int do_write)
-{
-    size_t offset = 0;
-    ssize_t len;
-
-    while ( offset < size )
-    {
-        if (do_write)
-            len = write(fd, data + offset, size - offset);
-        else
-            len = read(fd, data + offset, size - offset);
-
-        if ( len == -1 )
-        {
-             if ( errno == EINTR )
-                 continue;
-             return -1;
-        }
-
-        offset += len;
-    }
-
-    return 0;
-}
-
 evtchn_port_or_error_t
 xc_evtchn_pending(int xce_handle)
 {
     evtchn_port_t port;
 
-    if ( dorw(xce_handle, (char *)&port, sizeof(port), 0) == -1 )
+    if ( read_exact(xce_handle, (char *)&port, sizeof(port)) == -1 )
         return -1;
 
     return port;
@@ -244,7 +219,7 @@ xc_evtchn_pending(int xce_handle)
 
 int xc_evtchn_unmask(int xce_handle, evtchn_port_t port)
 {
-    return dorw(xce_handle, (char *)&port, sizeof(port), 1);
+    return write_exact(xce_handle, (char *)&port, sizeof(port));
 }
 
 /* Optionally flush file to disk and discard page cache */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] libxc: Consolidate read()/write() syscall wrappers to read/write an, Xen patchbot-unstable <=