From patchwork Tue Apr 12 09:34:19 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Add dd-style SIGUSR1 progress reporting Date: Mon, 11 Apr 2011 23:34:19 -0000 From: Jes Sorensen X-Patchwork-Id: 90761 Message-Id: <1302600859-12853-1-git-send-email-Jes.Sorensen@redhat.com> To: kwolf@redhat.com Cc: stefanha@linux.vnet.ibm.com, qemu-devel@nongnu.org From: Jes Sorensen This introduces support for dd-style progress reporting, if the user hasn't specified -p to report progress. If sent a SIGUSR1, qemu-img will report current progress for commands that support progress reporting. Signed-off-by: Jes Sorensen --- qemu-progress.c | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 44 insertions(+), 5 deletions(-) diff --git a/qemu-progress.c b/qemu-progress.c index 656e065..6498161 100644 --- a/qemu-progress.c +++ b/qemu-progress.c @@ -26,12 +26,15 @@ #include "osdep.h" #include "sysemu.h" #include +#include struct progress_state { int enabled; float current; float last_print; float min_skip; + void (*print)(void); + void (*end)(void); }; static struct progress_state state; @@ -51,20 +54,56 @@ static void progress_simple_print(void) static void progress_simple_end(void) { - if (state.enabled) { - printf("\n"); - } + printf("\n"); +} + +static void progress_simple_init(void) +{ + state.print = progress_simple_print; + state.end = progress_simple_end; +} + +static void sigusr_print(int signal) +{ + printf(" (%3.2f/100%%)\n", state.current); +} + +static void progress_dummy_print(void) +{ +} + +static void progress_dummy_end(void) +{ +} + +static void progress_dummy_init(void) +{ + struct sigaction action; + + memset(&action, 0, sizeof(action)); + sigfillset(&action.sa_mask); + action.sa_handler = sigusr_print; + action.sa_flags = 0; + sigaction(SIGUSR1, &action, NULL); + + state.print = progress_dummy_print; + state.end = progress_dummy_end; } void qemu_progress_init(int enabled, float min_skip) { state.enabled = enabled; state.min_skip = min_skip; + if (enabled) { + progress_simple_init(); + } else { + progress_dummy_init(); + } } void qemu_progress_end(void) { - progress_simple_end(); + state.end(); } void qemu_progress_print(float percent, int max) @@ -84,6 +123,6 @@ void qemu_progress_print(float percent, int max) if (current > (state.last_print + state.min_skip) || (current == 100) || (current == 0)) { state.last_print = state.current; - progress_simple_print(); + state.print(); } }