mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
Merged revisions 59259 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r59259 | russell | 2007-03-27 13:05:46 -0500 (Tue, 27 Mar 2007) | 12 lines Merged revisions 59258 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r59258 | russell | 2007-03-27 13:04:02 -0500 (Tue, 27 Mar 2007) | 4 lines Fix the use of the "sourceaddress" option when "bindaddr" is set to 0.0.0.0 instead of having each interface explicitly listed. (issue #7874, patch by stevens) ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@59260 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -185,6 +185,7 @@ static int srvlookup = 0;
|
|||||||
static int timingfd = -1; /* Timing file descriptor */
|
static int timingfd = -1; /* Timing file descriptor */
|
||||||
|
|
||||||
static struct ast_netsock_list *netsock;
|
static struct ast_netsock_list *netsock;
|
||||||
|
static struct ast_netsock_list *outsock; /*!< used if sourceaddress specified and bindaddr == INADDR_ANY */
|
||||||
static int defaultsockfd = -1;
|
static int defaultsockfd = -1;
|
||||||
|
|
||||||
int (*iax2_regfunk)(const char *username, int onoff) = NULL;
|
int (*iax2_regfunk)(const char *username, int onoff) = NULL;
|
||||||
@@ -8456,20 +8457,40 @@ static int peer_set_srcaddr(struct iax2_peer *peer, const char *srcaddr)
|
|||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
/* ip address valid. */
|
/* ip address valid. */
|
||||||
sin.sin_port = htons(port);
|
sin.sin_port = htons(port);
|
||||||
sock = ast_netsock_find(netsock, &sin);
|
if (!(sock = ast_netsock_find(netsock, &sin)))
|
||||||
|
sock = ast_netsock_find(outsock, &sin);
|
||||||
if (sock) {
|
if (sock) {
|
||||||
sockfd = ast_netsock_sockfd(sock);
|
sockfd = ast_netsock_sockfd(sock);
|
||||||
nonlocal = 0;
|
nonlocal = 0;
|
||||||
|
} else {
|
||||||
|
unsigned int orig_saddr = sin.sin_addr.s_addr;
|
||||||
|
/* INADDR_ANY matches anyway! */
|
||||||
|
sin.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
if (ast_netsock_find(netsock, &sin)) {
|
||||||
|
sin.sin_addr.s_addr = orig_saddr;
|
||||||
|
sock = ast_netsock_bind(outsock, io, srcaddr, port, tos, socket_read, NULL);
|
||||||
|
if (sock) {
|
||||||
|
sockfd = ast_netsock_sockfd(sock);
|
||||||
|
ast_netsock_unref(sock);
|
||||||
|
nonlocal = 0;
|
||||||
|
} else {
|
||||||
|
nonlocal = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
peer->sockfd = sockfd;
|
peer->sockfd = sockfd;
|
||||||
|
|
||||||
if (nonlocal) {
|
if (nonlocal == 1) {
|
||||||
ast_log(LOG_WARNING, "Non-local or unbound address specified (%s) in sourceaddress for '%s', reverting to default\n",
|
ast_log(LOG_WARNING, "Non-local or unbound address specified (%s) in sourceaddress for '%s', reverting to default\n",
|
||||||
srcaddr, peer->name);
|
srcaddr, peer->name);
|
||||||
return -1;
|
return -1;
|
||||||
|
} else if (nonlocal == 2) {
|
||||||
|
ast_log(LOG_WARNING, "Unable to bind to sourceaddress '%s' for '%s', reverting to default\n",
|
||||||
|
srcaddr, peer->name);
|
||||||
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
if (option_debug)
|
if (option_debug)
|
||||||
ast_log(LOG_DEBUG, "Using sourceaddress %s for '%s'\n", srcaddr, peer->name);
|
ast_log(LOG_DEBUG, "Using sourceaddress %s for '%s'\n", srcaddr, peer->name);
|
||||||
@@ -9274,6 +9295,15 @@ static int set_config(char *config_file, int reload)
|
|||||||
ast_netsock_unref(ns);
|
ast_netsock_unref(ns);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (reload) {
|
||||||
|
ast_netsock_release(outsock);
|
||||||
|
outsock = ast_netsock_list_alloc();
|
||||||
|
if (!outsock) {
|
||||||
|
ast_log(LOG_ERROR, "Could not allocate outsock list.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ast_netsock_init(outsock);
|
||||||
|
}
|
||||||
|
|
||||||
if (min_reg_expire > max_reg_expire) {
|
if (min_reg_expire > max_reg_expire) {
|
||||||
ast_log(LOG_WARNING, "Minimum registration interval of %d is more than maximum of %d, resetting minimum to %d\n",
|
ast_log(LOG_WARNING, "Minimum registration interval of %d is more than maximum of %d, resetting minimum to %d\n",
|
||||||
@@ -10142,6 +10172,7 @@ static int __unload_module(void)
|
|||||||
usleep(10000);
|
usleep(10000);
|
||||||
|
|
||||||
ast_netsock_release(netsock);
|
ast_netsock_release(netsock);
|
||||||
|
ast_netsock_release(outsock);
|
||||||
for (x=0;x<IAX_MAX_CALLS;x++)
|
for (x=0;x<IAX_MAX_CALLS;x++)
|
||||||
if (iaxs[x])
|
if (iaxs[x])
|
||||||
iax2_destroy(x);
|
iax2_destroy(x);
|
||||||
@@ -10224,9 +10255,17 @@ static int load_module(void)
|
|||||||
sched_context_destroy(sched);
|
sched_context_destroy(sched);
|
||||||
return AST_MODULE_LOAD_FAILURE;
|
return AST_MODULE_LOAD_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_netsock_init(netsock);
|
ast_netsock_init(netsock);
|
||||||
|
|
||||||
|
outsock = ast_netsock_list_alloc();
|
||||||
|
if (!outsock) {
|
||||||
|
ast_log(LOG_ERROR, "Could not allocate outsock list.\n");
|
||||||
|
io_context_destroy(io);
|
||||||
|
sched_context_destroy(sched);
|
||||||
|
return AST_MODULE_LOAD_FAILURE;
|
||||||
|
}
|
||||||
|
ast_netsock_init(outsock);
|
||||||
|
|
||||||
ast_cli_register_multiple(cli_iax2, sizeof(cli_iax2) / sizeof(struct ast_cli_entry));
|
ast_cli_register_multiple(cli_iax2, sizeof(cli_iax2) / sizeof(struct ast_cli_entry));
|
||||||
|
|
||||||
ast_register_application(papp, iax2_prov_app, psyn, pdescrip);
|
ast_register_application(papp, iax2_prov_app, psyn, pdescrip);
|
||||||
|
Reference in New Issue
Block a user