From fa1e4759db9cbb9ac3f0a78254c8183569edae47 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 26 Nov 2009 13:37:11 +0000 Subject: [PATCH] Move qemuMonitorEscape + migrate status enum into shared monitor code The qemuMonitorEscape() method, and the VIR_ENUM for migration status will be needed by the JSON monitor too, so move that code into the shared qemu_monitor.c file instead of qemu_monitor_text.c * src/qemu/qemu_monitor.h: Declare qemuMonitorMigrationStatus enum and qemuMonitorEscapeArg and qemuMonitorEscapeShell methods * src/qemu/qemu_monitor.c: Implement qemuMonitorMigrationStatus enum and qemuMonitorEscapeArg and qemuMonitorEscapeShell methods * src/qemu/qemu_monitor_text.c: Remove above methods/enum --- src/qemu/qemu_monitor.c | 87 ++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor.h | 5 +++ src/qemu/qemu_monitor_text.c | 87 ------------------------------------ 3 files changed, 92 insertions(+), 87 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 4cddd515ee..f3c9022d37 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -75,6 +75,93 @@ struct _qemuMonitor { }; +VIR_ENUM_IMPL(qemuMonitorMigrationStatus, + QEMU_MONITOR_MIGRATION_STATUS_LAST, + "inactive", "active", "completed", "failed", "cancelled") + +static char *qemuMonitorEscape(const char *in, int shell) +{ + int len = 0; + int i, j; + char *out; + + /* To pass through the QEMU monitor, we need to use escape + sequences: \r, \n, \", \\ + + To pass through both QEMU + the shell, we need to escape + the single character ' as the five characters '\\'' + */ + + for (i = 0; in[i] != '\0'; i++) { + switch(in[i]) { + case '\r': + case '\n': + case '"': + case '\\': + len += 2; + break; + case '\'': + if (shell) + len += 5; + else + len += 1; + break; + default: + len += 1; + break; + } + } + + if (VIR_ALLOC_N(out, len + 1) < 0) + return NULL; + + for (i = j = 0; in[i] != '\0'; i++) { + switch(in[i]) { + case '\r': + out[j++] = '\\'; + out[j++] = 'r'; + break; + case '\n': + out[j++] = '\\'; + out[j++] = 'n'; + break; + case '"': + case '\\': + out[j++] = '\\'; + out[j++] = in[i]; + break; + case '\'': + if (shell) { + out[j++] = '\''; + out[j++] = '\\'; + out[j++] = '\\'; + out[j++] = '\''; + out[j++] = '\''; + } else { + out[j++] = in[i]; + } + break; + default: + out[j++] = in[i]; + break; + } + } + out[j] = '\0'; + + return out; +} + +char *qemuMonitorEscapeArg(const char *in) +{ + return qemuMonitorEscape(in, 0); +} + +char *qemuMonitorEscapeShell(const char *in) +{ + return qemuMonitorEscape(in, 1); +} + + void qemuMonitorLock(qemuMonitorPtr mon) { virMutexLock(&mon->lock); diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 27b43b77f1..88d3dd7d9a 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -75,6 +75,9 @@ typedef int (*qemuMonitorDiskSecretLookup)(qemuMonitorPtr mon, char **secret, size_t *secretLen); +char *qemuMonitorEscapeArg(const char *in); +char *qemuMonitorEscapeShell(const char *in); + qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm, qemuMonitorEOFNotify eofCB); @@ -158,6 +161,8 @@ enum { QEMU_MONITOR_MIGRATION_STATUS_LAST }; +VIR_ENUM_DECL(qemuMonitorMigrationStatus) + int qemuMonitorGetMigrationStatus(qemuMonitorPtr mon, int *status, unsigned long long *transferred, diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index d39a417554..2a8b3bde1c 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -51,88 +51,6 @@ typedef int qemuMonitorExtraPromptHandler(qemuMonitorPtr mon, void *data); -static char *qemuMonitorEscape(const char *in, int shell) -{ - int len = 0; - int i, j; - char *out; - - /* To pass through the QEMU monitor, we need to use escape - sequences: \r, \n, \", \\ - - To pass through both QEMU + the shell, we need to escape - the single character ' as the five characters '\\'' - */ - - for (i = 0; in[i] != '\0'; i++) { - switch(in[i]) { - case '\r': - case '\n': - case '"': - case '\\': - len += 2; - break; - case '\'': - if (shell) - len += 5; - else - len += 1; - break; - default: - len += 1; - break; - } - } - - if (VIR_ALLOC_N(out, len + 1) < 0) - return NULL; - - for (i = j = 0; in[i] != '\0'; i++) { - switch(in[i]) { - case '\r': - out[j++] = '\\'; - out[j++] = 'r'; - break; - case '\n': - out[j++] = '\\'; - out[j++] = 'n'; - break; - case '"': - case '\\': - out[j++] = '\\'; - out[j++] = in[i]; - break; - case '\'': - if (shell) { - out[j++] = '\''; - out[j++] = '\\'; - out[j++] = '\\'; - out[j++] = '\''; - out[j++] = '\''; - } else { - out[j++] = in[i]; - } - break; - default: - out[j++] = in[i]; - break; - } - } - out[j] = '\0'; - - return out; -} - -static char *qemuMonitorEscapeArg(const char *in) -{ - return qemuMonitorEscape(in, 0); -} - -static char *qemuMonitorEscapeShell(const char *in) -{ - return qemuMonitorEscape(in, 1); -} - /* When connecting to a monitor, QEMU will print a greeting like * * QEMU 0.11.0 monitor - type 'help' for more information @@ -904,11 +822,6 @@ cleanup: #define MIGRATION_REMAINING_PREFIX "remaining ram: " #define MIGRATION_TOTAL_PREFIX "total ram: " -VIR_ENUM_DECL(qemuMonitorMigrationStatus) -VIR_ENUM_IMPL(qemuMonitorMigrationStatus, - QEMU_MONITOR_MIGRATION_STATUS_LAST, - "inactive", "active", "completed", "failed", "cancelled") - int qemuMonitorTextGetMigrationStatus(qemuMonitorPtr mon, int *status, unsigned long long *transferred,