summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorMark Spencer <markster@digium.com>2004-12-28 21:20:18 +0000
committerMark Spencer <markster@digium.com>2004-12-28 21:20:18 +0000
commitb1b8802edd8b637d26ffdf0fa4efd72e31307e8e (patch)
treeff1a3d626a07eb45a2a194baf565fc7e3362d0a8 /channels
parent886ebab04abc45d2478a6a51b690ceca4a5e9df0 (diff)
Make it possible to configure an externhost and not just an externip (bug #3069)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4573 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rwxr-xr-xchannels/chan_sip.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 8c4365954..7012a9f21 100755
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -564,6 +564,9 @@ static int global_canreinvite = REINVITE_INVITE;
static struct sockaddr_in bindaddr;
static struct sockaddr_in externip;
+static char externhost[256] = "";
+static time_t externexpire = 0;
+static int externrefresh = 10;
static struct ast_ha *localaddr;
static struct ast_frame *sip_read(struct ast_channel *ast);
@@ -636,6 +639,16 @@ static int ast_sip_ouraddrfor(struct in_addr *them, struct in_addr *us)
*/
struct sockaddr_in theirs;
theirs.sin_addr = *them;
+ if (externexpire && (time(NULL) >= externexpire)) {
+ struct ast_hostent ahp;
+ struct hostent *hp;
+ time(&externexpire);
+ externexpire += externrefresh;
+ if ((hp = ast_gethostbyname(externhost, &ahp))) {
+ memcpy(&externip, hp->h_addr, sizeof(externip));
+ } else
+ ast_log(LOG_NOTICE, "Warning: Re-lookup of '%s' failed!\n", externhost);
+ }
if (localaddr && externip.sin_addr.s_addr &&
ast_apply_ha(localaddr, &theirs)) {
char iabuf[INET_ADDRSTRLEN];
@@ -8837,6 +8850,9 @@ static int reload_config(void)
strncpy(default_context, DEFAULT_CONTEXT, sizeof(default_context) - 1);
default_language[0] = '\0';
default_fromdomain[0] = '\0';
+ externhost[0] = '\0';
+ externexpire = 0;
+ externrefresh = 10;
strncpy(default_useragent, DEFAULT_USERAGENT, sizeof(default_useragent) - 1);
strncpy(default_notifymime, DEFAULT_NOTIFYMIME, sizeof(default_notifymime) - 1);
global_realm[sizeof(global_realm)-1] = '\0';
@@ -9008,6 +9024,19 @@ static int reload_config(void)
ast_log(LOG_WARNING, "Invalid address for externip keyword: %s\n", v->value);
else
memcpy(&externip.sin_addr, hp->h_addr, sizeof(externip.sin_addr));
+ externexpire = 0;
+ } else if (!strcasecmp(v->name, "externhost")) {
+ strncpy(externhost, v->value, sizeof(externhost) - 1);
+ if (!(hp = ast_gethostbyname(externhost, &ahp)))
+ ast_log(LOG_WARNING, "Invalid address for externhost keyword: %s\n", externhost);
+ else
+ memcpy(&externip.sin_addr, hp->h_addr, sizeof(externip.sin_addr));
+ time(&externexpire);
+ } else if (!strcasecmp(v->name, "externrefresh")) {
+ if (sscanf(v->value, "%i", &externrefresh) != 1) {
+ ast_log(LOG_WARNING, "Invalid externrefresh value '%s', must be an integer >0 at line %d\n", v->value, v->lineno);
+ externrefresh = 10;
+ }
} else if (!strcasecmp(v->name, "allow")) {
ast_parse_allow_disallow(&prefs, &global_capability, v->value, 1);
} else if (!strcasecmp(v->name, "disallow")) {