Add support for 2001:DB8::8:800:200C:417A

Fix #8
This commit is contained in:
0x1eef 2023-09-22 16:20:27 -03:00
parent c41c1eda34
commit 1f0c95508e
2 changed files with 20 additions and 2 deletions

View file

@ -11,6 +11,7 @@ static const char SEP = ':';
static int has_consecutive_chars(const char *str, char c, int n); static int has_consecutive_chars(const char *str, char c, int n);
static char* expand(const char *str, size_t strlen, char *new_str, size_t headlen); static char* expand(const char *str, size_t strlen, char *new_str, size_t headlen);
static size_t get_offset(char *tail);
int int
isinetaddr6(const char *str) isinetaddr6(const char *str)
@ -66,10 +67,12 @@ static char*
expand(const char *str, size_t strlen, char *new_str, size_t headlen) expand(const char *str, size_t strlen, char *new_str, size_t headlen)
{ {
char *ptr = new_str; char *ptr = new_str;
char *tail = (char*) &str[headlen + 2];
size_t taillen = (strlen - headlen) - 2; size_t taillen = (strlen - headlen) - 2;
size_t bodylen = MAX_STRLEN - taillen; size_t bodylen = MAX_STRLEN - taillen;
size_t i = headlen + 2; size_t i = headlen + 2;
size_t j = headlen; size_t j = headlen;
size_t offset = get_offset(tail);
while (i++ < strlen) { while (i++ < strlen) {
if (has_consecutive_chars(&str[i], SEP, 2)) { if (has_consecutive_chars(&str[i], SEP, 2)) {
@ -78,9 +81,23 @@ expand(const char *str, size_t strlen, char *new_str, size_t headlen)
} }
memcpy(ptr, &str[0], headlen); memcpy(ptr, &str[0], headlen);
ptr += headlen; ptr += headlen;
while (++j < bodylen) { while (++j < bodylen-offset) {
*ptr++ = j % 5 == 0 ? ':' : '0'; *ptr++ = j % 5 == 0 ? ':' : '0';
} }
memcpy(ptr, &str[headlen + 2], taillen); memcpy(ptr, tail, taillen);
return new_str; return new_str;
} }
static size_t
get_offset(char *tail)
{
size_t offset = 0;
while (*tail++ != SEP) {
offset++;
if (*tail == '\0' || offset == 4) {
offset = 0;
break;
}
}
return offset;
}

View file

@ -22,6 +22,7 @@ const char *valid[] = {
"2001:DB8:0:0:8:800:200C:417A", "2001:DB8:0:0:8:800:200C:417A",
/* valid IPv6 (double colon) */ /* valid IPv6 (double colon) */
"2001:DB8::8:800:200C:417A",
"fe80::c001:a0ff:fe12:3456", "fe80::c001:a0ff:fe12:3456",
"2001:0db8::1", "2001:0db8::1",
"2001:abcd:ef01:2345::", "2001:abcd:ef01:2345::",