X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Fproto.c;h=9b33902f7bde6aa39a662c03265e96d716faf03e;hb=9c5f05ec14655195fc94dc7c72d132087abe634b;hp=39cee5abe3765fc004a3ffb4b999116298cc9651;hpb=c127ad3d4a494abb2d9bb4fb6eaa179431d2411a;p=libguestfs.git diff --git a/daemon/proto.c b/daemon/proto.c index 39cee5a..9b33902 100644 --- a/daemon/proto.c +++ b/daemon/proto.c @@ -1,5 +1,5 @@ /* libguestfs - the guestfsd daemon - * Copyright (C) 2009 Red Hat Inc. + * Copyright (C) 2009 Red Hat Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -69,7 +69,7 @@ main_loop (int _sock) if (len > GUESTFS_MESSAGE_MAX) { fprintf (stderr, "guestfsd: incoming message is too long (%u bytes)\n", - len); + len); exit (1); } @@ -86,20 +86,20 @@ main_loop (int _sock) int i, j; for (i = 0; i < len; i += 16) { - printf ("%04x: ", i); - for (j = i; j < MIN (i+16, len); ++j) - printf ("%02x ", (unsigned char) buf[j]); - for (; j < i+16; ++j) - printf (" "); - printf ("|"); - for (j = i; j < MIN (i+16, len); ++j) - if (isprint (buf[j])) - printf ("%c", buf[j]); - else - printf ("."); - for (; j < i+16; ++j) - printf (" "); - printf ("|\n"); + printf ("%04x: ", i); + for (j = i; j < MIN (i+16, len); ++j) + printf ("%02x ", (unsigned char) buf[j]); + for (; j < i+16; ++j) + printf (" "); + printf ("|"); + for (j = i; j < MIN (i+16, len); ++j) + if (isprint (buf[j])) + printf ("%c", buf[j]); + else + printf ("."); + for (; j < i+16; ++j) + printf (" "); + printf ("|\n"); } } #endif @@ -146,10 +146,12 @@ main_loop (int _sock) start_us = (int64_t) start_t.tv_sec * 1000000 + start_t.tv_usec; end_us = (int64_t) end_t.tv_sec * 1000000 + end_t.tv_usec; elapsed_us = end_us - start_us; - fprintf (stderr, "proc %d serial %d took %d.%02d seconds\n", - proc_nr, serial, - (int) (elapsed_us / 1000000), - (int) ((elapsed_us / 10000) % 100)); + fprintf (stderr, "proc %d (%s) took %d.%02d seconds\n", + proc_nr, + proc_nr >= 0 && proc_nr < GUESTFS_PROC_NR_PROCS + ? function_names[proc_nr] : "UNKNOWN PROCEDURE", + (int) (elapsed_us / 1000000), + (int) ((elapsed_us / 10000) % 100)); } cont: @@ -264,9 +266,14 @@ reply (xdrproc_t xdrp, char *ret) } if (xdrp) { + /* This can fail if the reply body is too large, for example + * if it exceeds the maximum message size. In that case + * we want to return an error message instead. (RHBZ#509597). + */ if (!(*xdrp) (&xdr, ret)) { - fprintf (stderr, "guestfsd: failed to encode reply body\n"); - exit (1); + reply_with_perror ("guestfsd: failed to encode reply body\n"); + xdr_destroy (&xdr); + return; } } @@ -281,7 +288,7 @@ reply (xdrproc_t xdrp, char *ret) fprintf (stderr, "xwrite failed\n"); exit (1); } - if (xwrite (sock, buf, len) == len) { + if (xwrite (sock, buf, len) == -1) { fprintf (stderr, "xwrite failed\n"); exit (1); } @@ -310,7 +317,7 @@ receive_file (receive_cb cb, void *opaque) if (len > GUESTFS_MESSAGE_MAX) { fprintf (stderr, "guestfsd: incoming message is too long (%u bytes)\n", - len); + len); exit (1); } @@ -334,7 +341,7 @@ receive_file (receive_cb cb, void *opaque) if (verbose) printf ("receive_file: got chunk: cancel = %d, len = %d, buf = %p\n", - chunk.cancel, chunk.data.data_len, chunk.data.data_val); + chunk.cancel, chunk.data.data_len, chunk.data.data_val); if (chunk.cancel) { fprintf (stderr, "receive_file: received cancellation from library\n"); @@ -390,7 +397,7 @@ send_file_write (const void *buf, int len) if (len > GUESTFS_MAX_CHUNK_SIZE) { fprintf (stderr, "send_file_write: len (%d) > GUESTFS_MAX_CHUNK_SIZE (%d)\n", - len, GUESTFS_MAX_CHUNK_SIZE); + len, GUESTFS_MAX_CHUNK_SIZE); return -1; } @@ -448,7 +455,7 @@ check_for_library_cancellation (void) if (flag != GUESTFS_CANCEL_FLAG) { fprintf (stderr, "check_for_library_cancellation: read 0x%x from library, expected 0x%x\n", - flag, GUESTFS_CANCEL_FLAG); + flag, GUESTFS_CANCEL_FLAG); return 0; }