Mac OS X: Use gnulib setenv module explicitly.
[libguestfs.git] / daemon / proto.c
index 284037d..1ad9d11 100644 (file)
 #include <unistd.h>
 #include <errno.h>
 #include <sys/param.h>         /* defines MIN */
+#include <sys/select.h>
 #include <rpc/types.h>
 #include <rpc/xdr.h>
 
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
 #include "c-ctype.h"
 #include "ignore-value.h"
 
@@ -66,7 +71,7 @@ main_loop (int _sock)
       exit (EXIT_FAILURE);
 
     xdrmem_create (&xdr, lenbuf, 4, XDR_DECODE);
-    xdr_uint32_t (&xdr, &len);
+    xdr_u_int (&xdr, &len);
     xdr_destroy (&xdr);
 
     if (len > GUESTFS_MESSAGE_MAX) {
@@ -136,9 +141,20 @@ main_loop (int _sock)
       goto cont;
     }
 
-    /* Now start to process this message. */
     proc_nr = hdr.proc;
     serial = hdr.serial;
+
+    /* Clear errors before we call the stub functions.  This is just
+     * to ensure that we can accurately report errors in cases where
+     * error handling paths don't set errno correctly.
+     */
+    errno = 0;
+#ifdef WIN32
+    SetLastError (0);
+    WSASetLastError (0);
+#endif
+
+    /* Now start to process this message. */
     dispatch_incoming_message (&xdr);
     /* Note that dispatch_incoming_message will also send a reply. */
 
@@ -179,12 +195,11 @@ reply_with_error (const char *fs, ...)
 }
 
 void
-reply_with_perror (const char *fs, ...)
+reply_with_perror_errno (int err, const char *fs, ...)
 {
   char buf1[GUESTFS_ERROR_LEN];
   char buf2[GUESTFS_ERROR_LEN];
   va_list args;
-  int err = errno;
 
   va_start (args, fs);
   vsnprintf (buf1, sizeof buf1, fs, args);
@@ -232,7 +247,7 @@ send_error (const char *msg)
   xdr_destroy (&xdr);
 
   xdrmem_create (&xdr, lenbuf, 4, XDR_ENCODE);
-  xdr_uint32_t (&xdr, &len);
+  xdr_u_int (&xdr, &len);
   xdr_destroy (&xdr);
 
   if (xwrite (sock, lenbuf, 4) == -1) {
@@ -284,7 +299,7 @@ reply (xdrproc_t xdrp, char *ret)
   xdr_destroy (&xdr);
 
   xdrmem_create (&xdr, lenbuf, 4, XDR_ENCODE);
-  xdr_uint32_t (&xdr, &len);
+  xdr_u_int (&xdr, &len);
   xdr_destroy (&xdr);
 
   if (xwrite (sock, lenbuf, 4) == -1) {
@@ -314,7 +329,7 @@ receive_file (receive_cb cb, void *opaque)
       exit (EXIT_FAILURE);
 
     xdrmem_create (&xdr, lenbuf, 4, XDR_DECODE);
-    xdr_uint32_t (&xdr, &len);
+    xdr_u_int (&xdr, &len);
     xdr_destroy (&xdr);
 
     if (len == GUESTFS_CANCEL_FLAG)
@@ -379,7 +394,7 @@ cancel_receive (void)
   uint32_t flag = GUESTFS_CANCEL_FLAG;
 
   xdrmem_create (&xdr, fbuf, sizeof fbuf, XDR_ENCODE);
-  xdr_uint32_t (&xdr, &flag);
+  xdr_u_int (&xdr, &flag);
   xdr_destroy (&xdr);
 
   if (xwrite (sock, fbuf, sizeof fbuf) == -1) {
@@ -454,7 +469,7 @@ check_for_library_cancellation (void)
     return 0;
 
   xdrmem_create (&xdr, buf, sizeof buf, XDR_DECODE);
-  xdr_uint32_t (&xdr, &flag);
+  xdr_u_int (&xdr, &flag);
   xdr_destroy (&xdr);
 
   if (flag != GUESTFS_CANCEL_FLAG) {
@@ -496,7 +511,7 @@ send_chunk (const guestfs_chunk *chunk)
   xdr_destroy (&xdr);
 
   xdrmem_create (&xdr, lenbuf, 4, XDR_ENCODE);
-  xdr_uint32_t (&xdr, &len);
+  xdr_u_int (&xdr, &len);
   xdr_destroy (&xdr);
 
   int err = (xwrite (sock, lenbuf, 4) == 0