/* * inetntop: return the : notation of a given IPv6 internet number. * or the dotted-decimal notation for IPv4 * make sure the compressed representation (rfc 1884) isn't used. * * (c) 2000 Kurt Roeckx , Licensed under GNU GPL v2. */ char *inetntop(int af, const void *in, char *out, size_t the_size) { static char local_dummy[128]; if (the_size > sizeof(local_dummy)) { the_size = sizeof(local_dummy); } if (!inet_ntop(af, in, local_dummy, the_size)) { /* good that every function calling this one * checks the return value ... NOT */ return NULL; } /* quick and dirty hack to give ipv4 just ipv4 instead of * ::ffff:ipv4 - Q */ if (af == AF_INET6 && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)in)) { char *p; if (!(p = strstr(local_dummy, ":ffff:")) && !(p = strstr(local_dummy, ":FFFF:"))) { return NULL; /* crash and burn */ } strcpy(out, p + 6); return out; } if (strstr(local_dummy, "::")) { char cnt = 0, *cp = local_dummy, *op = out; while (*cp) { if (*cp == ':') cnt += 1; if (*cp++ == '.') { cnt += 1; break; } } cp = local_dummy; while (*cp) { *op++ = *cp++; if (*(cp-1) == ':' && *cp == ':') { if ((cp-1) == local_dummy) { op--; *op++ = '0'; *op++ = ':'; } *op++ = '0'; while (cnt++ < 7) { *op++ = ':'; *op++ = '0'; } } } if (*(op-1)==':') *op++ = '0'; *op = '\0'; } else bcopy(local_dummy, out, the_size); return out; }