char * netsnmp_ipv6_fmtaddr(const char *prefix, netsnmp_transport *t, void *data, int len) { struct sockaddr_in6 *to = NULL; char addr[INET6_ADDRSTRLEN]; char tmp[INET6_ADDRSTRLEN + 18]; DEBUGMSGTL(("netsnmp_ipv6", "fmtaddr: t = %p, data = %p, len = %d\n", t, data, len)); if (data != NULL && len == sizeof(struct sockaddr_in6)) { to = (struct sockaddr_in6 *) data; } else if (t != NULL && t->data != NULL) { to = (struct sockaddr_in6 *) t->data; } if (to == NULL) { snprintf(tmp, sizeof(tmp), "%s: unknown", prefix); } else { char scope_id[IF_NAMESIZE + 1] = ""; #if defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID) if (to->sin6_scope_id && netsnmp_if_indextoname(to->sin6_scope_id, &scope_id[1])) { scope_id[0] = '%'; } #endif snprintf(tmp, sizeof(tmp), "%s: [%s%s]:%hu", prefix, inet_ntop(AF_INET6, (void *) &(to->sin6_addr), addr, INET6_ADDRSTRLEN), scope_id, ntohs(to->sin6_port)); } tmp[sizeof(tmp)-1] = '\0'; return strdup(tmp); }
char * netsnmp_ipv6_fmtaddr(const char *prefix, netsnmp_transport *t, void *data, int len) { struct sockaddr_in6 *to = NULL; char addr[INET6_ADDRSTRLEN]; char tmp[INET6_ADDRSTRLEN + 18]; DEBUGMSGTL(("netsnmp_ipv6", "fmtaddr: t = %p, data = %p, len = %d\n", t, data, len)); if (data != NULL && len == sizeof(struct sockaddr_in6)) { to = (struct sockaddr_in6 *) data; } else if (t != NULL && t->data != NULL) { to = (struct sockaddr_in6 *) t->data; } if (to == NULL) { snprintf(tmp, sizeof(tmp), "%s: unknown", prefix); } else if (t && t->flags & NETSNMP_TRANSPORT_FLAG_C) { int flags = 0; if (!(t->flags & NETSNMP_TRANSPORT_FLAG_HOSTNAME)) flags |= NI_NUMERICHOST; int res = getnameinfo((struct sockaddr *)to, sizeof(struct sockaddr_in6), tmp, sizeof(tmp), NULL, 0, flags); if (res == EAI_AGAIN) { flags |= NI_NUMERICHOST; res = getnameinfo((struct sockaddr *)to, sizeof(struct sockaddr_in6), tmp, sizeof(tmp), NULL, 0, flags); } DEBUGMSGTL(("netsnmp_ipv6", "flags=%d, res=%d, tmp=%s\n", flags, res, tmp)); if (res != 0) return NULL; } else { char scope_id[IF_NAMESIZE + 1] = ""; #if defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID) if (to->sin6_scope_id && netsnmp_if_indextoname(to->sin6_scope_id, &scope_id[1])) { scope_id[0] = '%'; } #endif snprintf(tmp, sizeof(tmp), "%s: [%s%s]:%hu", prefix, inet_ntop(AF_INET6, (void *) &(to->sin6_addr), addr, INET6_ADDRSTRLEN), scope_id, ntohs(to->sin6_port)); } tmp[sizeof(tmp)-1] = '\0'; return strdup(tmp); }