struct sockaddr_in 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);
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);
}
{
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 = AF_INET;
if (ast_dnsmgr_lookup(hostname, ®->addr, ®->dnsmgr, srvlookup ? "_iax._udp" : NULL) < 0) {
}
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);
AST_LIST_UNLOCK(®istrations);
-
+
return 0;
}
(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) {
struct sockaddr_in reg_addr;