[Libvir] [PATCH 5/7] Add qemudEscapeShellArg for passing commandlines to qemu.

Jim Paris jim at jtan.com
Sun Aug 12 23:11:37 UTC 2007


Use this to escape a shell argument in a commandline passed to qemu.
First we need to escape certain characters to get them through the
qemu monitor interface.  On the shell side, the argument will be
enclosed in single quotes, so the only character that needs special
treatment is the single quote itself.

Signed-off-by: Jim Paris <jim at jtan.com>
---
 src/qemu_driver.c |   66 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 66 insertions(+), 0 deletions(-)

diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index e487640..5d310fe 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -1866,6 +1866,72 @@ static int qemudDomainGetInfo(virDomainPtr dom,
 }
 
 
+static char *qemudEscapeShellArg(const char *in)
+{
+    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 '\'':
+            len += 5;
+            break;
+        default:
+            len += 1;
+            break;
+        }
+    }
+
+    if ((out = (char *)malloc(len + 1)) == NULL)
+        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 '\'':
+            out[j++] = '\'';
+            out[j++] = '\\';
+            out[j++] = '\\';
+            out[j++] = '\'';
+            out[j++] = '\'';
+            break;
+        default:
+            out[j++] = in[i];
+            break;
+        }
+    }
+    out[j] = '\0';
+
+    return out;
+}
+
+
 static int qemudDomainSave(virDomainPtr dom,
                     const char *path ATTRIBUTE_UNUSED) {
     struct qemud_driver *driver = (struct qemud_driver *)dom->conn->privateData;
-- 
1.5.3.rc4




More information about the libvir-list mailing list