int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port, int *family) { int ret=ASN_OK; struct ast_sockaddr addr; const char *host=NULL; ret = ast_getsockname(socket, &addr); if(ret != 0) return ASN_E_INVSOCKET; host = ast_sockaddr_stringify_addr(&addr); if(host && strlen(host) < (unsigned)len) strcpy(ip, host); else{ OOTRACEERR1("Error:Insufficient buffer for ip address - " "ooSocketGetIpAndPort\n"); return -1; } *port = ast_sockaddr_port(&addr); if (family) { if (ast_sockaddr_is_ipv6(&addr) && !ast_sockaddr_is_ipv4_mapped(&addr)) *family = 6; else *family = 4; } return ASN_OK; }
struct ast_json *ast_json_ipaddr(const struct ast_sockaddr *addr, enum ast_transport transport_type) { struct ast_str *string = ast_str_alloca(64); if (!string) { return NULL; } ast_str_set(&string, 0, (ast_sockaddr_is_ipv4(addr) || ast_sockaddr_is_ipv4_mapped(addr)) ? "IPV4/" : "IPV6/"); if (transport_type) { char *transport_string = NULL; /* NOTE: None will be applied if multiple transport types are specified in transport_type */ switch(transport_type) { case AST_TRANSPORT_UDP: transport_string = "UDP"; break; case AST_TRANSPORT_TCP: transport_string = "TCP"; break; case AST_TRANSPORT_TLS: transport_string = "TLS"; break; case AST_TRANSPORT_WS: transport_string = "WS"; break; case AST_TRANSPORT_WSS: transport_string = "WSS"; break; } if (transport_string) { ast_str_append(&string, 0, "%s/", transport_string); } } ast_str_append(&string, 0, "%s", ast_sockaddr_stringify_addr(addr)); ast_str_append(&string, 0, "/%s", ast_sockaddr_stringify_port(addr)); return ast_json_string_create(ast_str_buffer(string)); }
static void dump_addr(char *output, int maxlen, void *value, int len) { struct ast_sockaddr addr; if (len == (int)sizeof(struct sockaddr_in)) { addr.ss.ss_family = AF_INET; } else if (len == (int) sizeof(struct sockaddr_in6)) { addr.ss.ss_family = AF_INET6; } else { ast_copy_string(output, "Invalid Address", maxlen); return; } memcpy(&addr, value, len); addr.len = len; snprintf(output, maxlen, "%s %s", ast_sockaddr_is_ipv4(&addr) || ast_sockaddr_is_ipv4_mapped(&addr) ? "IPV4" : "IPV6", ast_sockaddr_stringify(&addr)); }
int ast_sockaddr_ipv4_mapped(const struct ast_sockaddr *addr, struct ast_sockaddr *ast_mapped) { const struct sockaddr_in6 *sin6; struct sockaddr_in sin4; if (!ast_sockaddr_is_ipv6(addr)) { return 0; } if (!ast_sockaddr_is_ipv4_mapped(addr)) { return 0; } sin6 = (const struct sockaddr_in6*)&addr->ss; memset(&sin4, 0, sizeof(sin4)); sin4.sin_family = AF_INET; sin4.sin_port = sin6->sin6_port; sin4.sin_addr.s_addr = ((uint32_t *)&sin6->sin6_addr)[3]; ast_sockaddr_from_sin(ast_mapped, &sin4); return 1; }