diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 630a66342a6dd49e5ae9dc8a43df38623df31a63..a41f173b9b7ccce184108108b63bbcf3fab25942 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -635,6 +635,8 @@ struct iax2_registry { struct ast_sockaddr us; /*!< Who the server thinks we are */ struct ast_dnsmgr_entry *dnsmgr; /*!< DNS refresh manager */ AST_LIST_ENTRY(iax2_registry) entry; + int port; + char hostname[]; }; static AST_LIST_HEAD_STATIC(registrations, iax2_registry); @@ -8564,6 +8566,17 @@ static int iax2_do_register(struct iax2_registry *reg); static void __iax2_do_register_s(const void *data) { struct iax2_registry *reg = (struct iax2_registry *)data; + + if (ast_sockaddr_isnull(®->addr)) { + reg->addr.ss.ss_family = AST_AF_UNSPEC; + ast_dnsmgr_lookup(reg->hostname, ®->addr, ®->dnsmgr, srvlookup ? "_iax._udp" : NULL); + if (!ast_sockaddr_port(®->addr)) { + ast_sockaddr_set_port(®->addr, reg->port); + } else { + reg->port = ast_sockaddr_port(®->addr); + } + } + reg->expire = -1; iax2_do_register(reg); } @@ -8796,8 +8809,9 @@ static int iax2_append_register(const char *hostname, const char *username, { struct iax2_registry *reg; - if (!(reg = ast_calloc(1, sizeof(*reg)))) + if (!(reg = ast_calloc(1, sizeof(*reg) + strlen(hostname) + 1))) { return -1; + } reg->addr.ss.ss_family = AST_AF_UNSPEC; if (ast_dnsmgr_lookup(hostname, ®->addr, ®->dnsmgr, srvlookup ? "_iax._udp" : NULL) < 0) { @@ -8806,13 +8820,24 @@ static int iax2_append_register(const char *hostname, const char *username, } ast_copy_string(reg->username, username, sizeof(reg->username)); + strcpy(reg->hostname, hostname); /* Note: This is safe */ - if (secret) + if (secret) { ast_copy_string(reg->secret, secret, sizeof(reg->secret)); + } reg->expire = -1; reg->refresh = IAX_DEFAULT_REG_EXPIRE; - ast_sockaddr_set_port(®->addr, porta ? atoi(porta) : IAX_DEFAULT_PORTNO); + + reg->port = ast_sockaddr_port(®->addr); + + if (!porta && !reg->port) { + reg->port = IAX_DEFAULT_PORTNO; + } else if (porta) { + sscanf(porta, "%5d", ®->port); + } + + ast_sockaddr_set_port(®->addr, reg->port); AST_LIST_LOCK(®istrations); AST_LIST_INSERT_HEAD(®istrations, reg, entry); @@ -12167,6 +12192,9 @@ static int iax2_do_register(struct iax2_registry *reg) (5 * reg->refresh / 6) * 1000, iax2_do_register_s, reg); return -1; } + if (!ast_sockaddr_port(®->addr) && reg->port) { + ast_sockaddr_set_port(®->addr, reg->port); + } if (!reg->callno) {