X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Fproto.c;h=1ad9d11192f592c6820b7d0adce53ce95c3d5380;hb=760a1c84d7e83fede50bb635749f092fb8b191c0;hp=284037dfa2d215a47840b67579c7f8db07194d0c;hpb=c372c7c23a298a940b8a0868396ef2ae0d824e4d;p=libguestfs.git diff --git a/daemon/proto.c b/daemon/proto.c index 284037d..1ad9d11 100644 --- a/daemon/proto.c +++ b/daemon/proto.c @@ -25,9 +25,14 @@ #include #include #include /* defines MIN */ +#include #include #include +#ifdef HAVE_WINDOWS_H +#include +#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