static CHAR8 *str2ip6(CHAR8 *str) { UINT8 i, j, p; size_t len; CHAR8 *a, *b, t; static UINT16 ip[8]; for(i=0; i < 8; i++) { ip[i] = 0; } len = strlen(str); a = b = str; for(i=p=0; i < len; i++, b++) { if (*b != ':') continue; *b = '\0'; ip[p++] = str2ns(a); *b = ':'; a = b + 1; if ( *(b+1) == ':' ) break; } a = b = (str + len); for(j=len, p=7; j > i; j--, a--) { if (*a != ':') continue; t = *b; *b = '\0'; ip[p--] = str2ns(a+1); *b = t; b = a; } return (CHAR8 *)ip; }
static CHAR8 *str2ip6(CHAR8 *str) { UINT8 i = 0, j = 0, p = 0; size_t len = 0, dotcount = 0; enum { MAX_IP6_DOTS = 7 }; CHAR8 *a = NULL, *b = NULL, t = 0; static UINT16 ip[8]; memset(ip, 0, sizeof(ip)); /* Count amount of ':' to prevent overflows. * max. count = 7. Returns an invalid ip6 that * can be checked against */ for (a = str; *a != 0; ++a) { if (*a == ':') ++dotcount; } if (dotcount > MAX_IP6_DOTS) return (CHAR8 *)ip; len = strlen(str); a = b = str; for (i = p = 0; i < len; i++, b++) { if (*b != ':') continue; *b = '\0'; ip[p++] = str2ns(a); *b = ':'; a = b + 1; if (b[1] == ':' ) break; } a = b = (str + len); for (j = len, p = 7; j > i; j--, a--) { if (*a != ':') continue; t = *b; *b = '\0'; ip[p--] = str2ns(a+1); *b = t; b = a; } return (CHAR8 *)ip; }