Quote strings so they're safe to pass to the shell. Based on glib's
g_quote_string.
---
src/libvirt_private.syms | 1 +
src/util/buf.c | 29 +++++++++++++++++++++++++++++
src/util/buf.h | 1 +
3 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 853ee62..eb16fb6 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -28,6 +28,7 @@ virBufferError;
virBufferEscapeSexpr;
virBufferEscapeString;
virBufferFreeAndReset;
+virBufferQuoteString;
virBufferStrcat;
virBufferURIEncodeString;
virBufferUse;
diff --git a/src/util/buf.c b/src/util/buf.c
index 5002486..8106231 100644
--- a/src/util/buf.c
+++ b/src/util/buf.c
@@ -472,6 +472,35 @@ virBufferURIEncodeString (virBufferPtr buf, const char *str)
}
/**
+ * virBufferQuoteString:
+ * @buf: the buffer to append to
+ * @str: an unquoted string
+ *
+ * Quotes a string so that the shell (/bin/sh) will interpret the
+ * quoted string as unquoted_string.
+ */
+void
+virBufferQuoteString(const virBufferPtr buf, const char *unquoted_str)
+{
+ const char *p;
+
+ virBufferAddChar(buf, '\'');
+ p = unquoted_str;
+
+ while (*p) {
+ /* Replace literal ' with a close ', a \', and a open ' */
+ if (*p == '\'')
+ virBufferAddLit(buf, "'\\''");
+ else
+ virBufferAddChar(buf, *p);
+ ++p;
+ }
+
+ /* close the quote */
+ virBufferAddChar(buf, '\'');
+}
+
+/**
* virBufferStrcat:
* @buf: the buffer to dump
* @...: the variable list of strings, the last argument must be NULL
diff --git a/src/util/buf.h b/src/util/buf.h
index 06d01ba..26a2f35 100644
--- a/src/util/buf.h
+++ b/src/util/buf.h
@@ -51,6 +51,7 @@ void virBufferStrcat(const virBufferPtr buf, ...)
void virBufferEscapeString(const virBufferPtr buf, const char *format, const char *str);
void virBufferEscapeSexpr(const virBufferPtr buf, const char *format, const char *str);
void virBufferURIEncodeString (const virBufferPtr buf, const char *str);
+void virBufferQuoteString(const virBufferPtr buf, const char *str);
# define virBufferAddLit(buf_, literal_string_) \
virBufferAdd (buf_, "" literal_string_ "", sizeof literal_string_ -
1)
--
1.7.5.4