Helper function to strip the brackets from an IPv6 address.
Tested by viruritest.
---
src/libvirt_private.syms | 1 +
src/util/virstring.c | 22 ++++++++++++++++++++++
src/util/virstring.h | 2 ++
src/util/viruri.c | 20 ++++----------------
tests/virstringtest.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 78 insertions(+), 16 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index d6265ac..c5397dd 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2004,6 +2004,7 @@ virStringSortCompare;
virStringSortRevCompare;
virStringSplit;
virStringSplitCount;
+virStringStripIPv6Brackets;
virStrncpy;
virStrndup;
virStrToDouble;
diff --git a/src/util/virstring.c b/src/util/virstring.c
index 54c0b6f..0cb7f3f 100644
--- a/src/util/virstring.c
+++ b/src/util/virstring.c
@@ -929,3 +929,25 @@ virStringReplace(const char *haystack,
return virBufferContentAndReset(&buf);
}
+
+/**
+ * virStringStripIPv6Brackets:
+ * @str: the string to strip
+ *
+ * Modify the string in-place to remove the leading and closing brackets
+ * from an IPv6 address.
+ */
+void
+virStringStripIPv6Brackets(char *str)
+{
+ size_t len;
+
+ if (!str)
+ return;
+
+ len = strlen(str);
+ if (str[0] == '[' && str[len-1] == ']' && strchr(str,
':')) {
+ memmove(&str[0], &str[1], len - 2);
+ str[len - 2] = '\0';
+ }
+}
diff --git a/src/util/virstring.h b/src/util/virstring.h
index b82ef2a..40ebaeb 100644
--- a/src/util/virstring.h
+++ b/src/util/virstring.h
@@ -268,4 +268,6 @@ char *virStringReplace(const char *haystack,
const char *newneedle)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
+void virStringStripIPv6Brackets(char *str);
+
#endif /* __VIR_STRING_H__ */
diff --git a/src/util/viruri.c b/src/util/viruri.c
index 23d86c5..6166c37 100644
--- a/src/util/viruri.c
+++ b/src/util/viruri.c
@@ -182,22 +182,10 @@ virURIParse(const char *uri)
if (VIR_STRDUP(ret->user, xmluri->user) < 0)
goto error;
- /* First check: does it even make sense to jump inside */
- if (ret->server != NULL &&
- ret->server[0] == '[') {
- size_t length = strlen(ret->server);
-
- /* We want to modify the server string only if there are
- * square brackets on both ends and inside there is IPv6
- * address. Otherwise we could make a mistake by modifying
- * something other than an IPv6 address. */
- if (ret->server[length - 1] == ']' && strchr(ret->server,
':')) {
- memmove(&ret->server[0], &ret->server[1], length - 2);
- ret->server[length - 2] = '\0';
- }
- /* Even after such modification, it is completely ok to free
- * the uri with xmlFreeURI() */
- }
+ /* Strip square bracket from an IPv6 address.
+ * The function modifies the string in-place. Even after such
+ * modification, it is OK to free the URI with xmlFreeURI. */
+ virStringStripIPv6Brackets(ret->server);
if (virURIParseParams(ret) < 0)
goto error;
diff --git a/tests/virstringtest.c b/tests/virstringtest.c
index 10fad2c..841531f 100644
--- a/tests/virstringtest.c
+++ b/tests/virstringtest.c
@@ -522,6 +522,36 @@ testVirStringFreeListCount(const void *opaque ATTRIBUTE_UNUSED)
}
+struct testStripIPv6BracketsData {
+ const char *string;
+ const char *result;
+};
+
+static int testStripIPv6Brackets(const void *args)
+{
+ const struct testStripIPv6BracketsData *data = args;
+ int ret = -1;
+ char *res = NULL;
+
+ if (VIR_STRDUP(res, data->string) < 0)
+ goto cleanup;
+
+ virStringStripIPv6Brackets(res);
+
+ if (STRNEQ_NULLABLE(res, data->result)) {
+ fprintf(stderr, "Returned '%s', expected '%s'\n",
+ NULLSTR(res), NULLSTR(data->result));
+ goto cleanup;
+ }
+
+ ret = 0;
+
+ cleanup:
+ VIR_FREE(res);
+ return ret;
+}
+
+
static int
mymain(void)
{
@@ -731,6 +761,25 @@ mymain(void)
NULL) < 0)
ret = -1;
+#define TEST_STRIP_IPV6_BRACKETS(str, res) \
+ do { \
+ struct testStripIPv6BracketsData stripData = { \
+ .string = str, \
+ .result = res, \
+ }; \
+ if (virtTestRun("Strip brackets from IPv6 " #str, \
+ testStripIPv6Brackets, &stripData) < 0) \
+ ret = -1; \
+ } while (0)
+
+ TEST_STRIP_IPV6_BRACKETS(NULL, NULL);
+ TEST_STRIP_IPV6_BRACKETS("[]", "[]");
+ TEST_STRIP_IPV6_BRACKETS("[:]", ":");
+ TEST_STRIP_IPV6_BRACKETS("[::1]", "::1");
+ TEST_STRIP_IPV6_BRACKETS("[hello:", "[hello:");
+ TEST_STRIP_IPV6_BRACKETS(":hello]", ":hello]");
+ TEST_STRIP_IPV6_BRACKETS(":[]:", ":[]:");
+
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
--
2.0.4