X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Fproto.c;h=acd66017fd91493f397fa3310677d7fa82f19eef;hp=becf27c3d88ac728254953dd587b4105bbb8f0c2;hb=ad7497c533cc5c24f667104bebbfa5f6dda8c8f6;hpb=2069ade88144d8efd272a74be24b5c9ff49844dc diff --git a/daemon/proto.c b/daemon/proto.c index becf27c..acd6601 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 @@ -47,6 +47,8 @@ main_loop (int _sock) char lenbuf[4]; unsigned len; struct guestfs_message_header hdr; + struct timeval start_t, end_t; + int64_t start_us, end_us, elapsed_us; sock = _sock; @@ -79,6 +81,7 @@ main_loop (int _sock) xread (sock, buf, len); +#if 0 if (verbose) { int i, j; @@ -99,6 +102,11 @@ main_loop (int _sock) printf ("|\n"); } } +#endif + + /* In verbose mode, display the time taken to run each command. */ + if (verbose) + gettimeofday (&start_t, NULL); /* Decode the message header. */ xdrmem_create (&xdr, buf, len, XDR_DECODE); @@ -131,6 +139,21 @@ main_loop (int _sock) dispatch_incoming_message (&xdr); /* Note that dispatch_incoming_message will also send a reply. */ + /* In verbose mode, display the time taken to run each command. */ + if (verbose) { + gettimeofday (&end_t, NULL); + + 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 (%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: xdr_destroy (&xdr); free (buf); @@ -209,8 +232,14 @@ send_error (const char *msg) xdr_uint32_t (&xdr, &len); xdr_destroy (&xdr); - (void) xwrite (sock, lenbuf, 4); - (void) xwrite (sock, buf, len); + if (xwrite (sock, lenbuf, 4) == -1) { + fprintf (stderr, "xwrite failed\n"); + exit (1); + } + if (xwrite (sock, buf, len) == -1) { + fprintf (stderr, "xwrite failed\n"); + exit (1); + } } void @@ -237,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; } } @@ -250,8 +284,14 @@ reply (xdrproc_t xdrp, char *ret) xdr_uint32_t (&xdr, &len); xdr_destroy (&xdr); - (void) xwrite (sock, lenbuf, 4); - (void) xwrite (sock, buf, len); + if (xwrite (sock, lenbuf, 4) == -1) { + fprintf (stderr, "xwrite failed\n"); + exit (1); + } + if (xwrite (sock, buf, len) == len) { + fprintf (stderr, "xwrite failed\n"); + exit (1); + } } /* Receive file chunks, repeatedly calling 'cb'. */