Introduce virStringStripIPv6Brackets
Helper function to strip the brackets from an IPv6 address. Tested by viruritest.
This commit is contained in:
parent
4d1852c485
commit
6c31911a96
@ -2004,6 +2004,7 @@ virStringSortCompare;
|
|||||||
virStringSortRevCompare;
|
virStringSortRevCompare;
|
||||||
virStringSplit;
|
virStringSplit;
|
||||||
virStringSplitCount;
|
virStringSplitCount;
|
||||||
|
virStringStripIPv6Brackets;
|
||||||
virStrncpy;
|
virStrncpy;
|
||||||
virStrndup;
|
virStrndup;
|
||||||
virStrToDouble;
|
virStrToDouble;
|
||||||
|
@ -929,3 +929,26 @@ virStringReplace(const char *haystack,
|
|||||||
|
|
||||||
return virBufferContentAndReset(&buf);
|
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';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -268,4 +268,6 @@ char *virStringReplace(const char *haystack,
|
|||||||
const char *newneedle)
|
const char *newneedle)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
||||||
|
|
||||||
|
void virStringStripIPv6Brackets(char *str);
|
||||||
|
|
||||||
#endif /* __VIR_STRING_H__ */
|
#endif /* __VIR_STRING_H__ */
|
||||||
|
@ -182,22 +182,10 @@ virURIParse(const char *uri)
|
|||||||
if (VIR_STRDUP(ret->user, xmluri->user) < 0)
|
if (VIR_STRDUP(ret->user, xmluri->user) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* First check: does it even make sense to jump inside */
|
/* Strip square bracket from an IPv6 address.
|
||||||
if (ret->server != NULL &&
|
* The function modifies the string in-place. Even after such
|
||||||
ret->server[0] == '[') {
|
* modification, it is OK to free the URI with xmlFreeURI. */
|
||||||
size_t length = strlen(ret->server);
|
virStringStripIPv6Brackets(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() */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virURIParseParams(ret) < 0)
|
if (virURIParseParams(ret) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -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
|
static int
|
||||||
mymain(void)
|
mymain(void)
|
||||||
{
|
{
|
||||||
@ -731,6 +761,25 @@ mymain(void)
|
|||||||
NULL) < 0)
|
NULL) < 0)
|
||||||
ret = -1;
|
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;
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user