On Thu, Nov 26, 2009 at 06:27:22PM +0000, Daniel P. Berrange wrote: > 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 3829e7a..21f8c4b 100644 > --- a/src/qemu/qemu_monitor.c > +++ b/src/qemu/qemu_monitor.c > @@ -77,6 +77,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 27b43b7..88d3dd7 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 d39a417..2a8b3bd 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, ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list