summaryrefslogtreecommitdiff
path: root/main/http.c
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2010-07-08 22:08:07 +0000
committerMark Michelson <mmichelson@digium.com>2010-07-08 22:08:07 +0000
commitcd4ebd336f6fdd1fe5d2ad57f06654a9678d88d4 (patch)
treec05335b563c3f7cb9a3edbf3e101d8e1b80e0be4 /main/http.c
parent816f26c16ce6cf03cf97b7d0e7af64837283e79d (diff)
Add IPv6 to Asterisk.
This adds a generic API for accommodating IPv6 and IPv4 addresses within Asterisk. While many files have been updated to make use of the API, chan_sip and the RTP code are the files which actually support IPv6 addresses at the time of this commit. The way has been paved for easier upgrading for other files in the near future, though. Big thanks go to Simon Perrault, Marc Blanchet, and Jean-Philippe Dionne for their hard work on this. (closes issue #17565) Reported by: russell Patches: asteriskv6-test-report.pdf uploaded by russell (license 2) Review: https://reviewboard.asterisk.org/r/743 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@274783 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/http.c')
-rw-r--r--main/http.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/main/http.c b/main/http.c
index dcbfc4d66..6390297e5 100644
--- a/main/http.c
+++ b/main/http.c
@@ -316,12 +316,12 @@ static int httpstatus_callback(struct ast_tcptls_session_instance *ser,
ast_str_append(&out, 0, "<tr><td><i>Prefix</i></td><td><b>%s</b></td></tr>\r\n", prefix);
ast_str_append(&out, 0, "<tr><td><i>Bind Address</i></td><td><b>%s</b></td></tr>\r\n",
- ast_inet_ntoa(http_desc.old_address.sin_addr));
- ast_str_append(&out, 0, "<tr><td><i>Bind Port</i></td><td><b>%d</b></td></tr>\r\n",
- ntohs(http_desc.old_address.sin_port));
+ ast_sockaddr_stringify_addr(&http_desc.old_address));
+ ast_str_append(&out, 0, "<tr><td><i>Bind Port</i></td><td><b>%s</b></td></tr>\r\n",
+ ast_sockaddr_stringify_port(&http_desc.old_address));
if (http_tls_cfg.enabled) {
- ast_str_append(&out, 0, "<tr><td><i>SSL Bind Port</i></td><td><b>%d</b></td></tr>\r\n",
- ntohs(https_desc.old_address.sin_port));
+ ast_str_append(&out, 0, "<tr><td><i>SSL Bind Port</i></td><td><b>%s</b></td></tr>\r\n",
+ ast_sockaddr_stringify_port(&https_desc.old_address));
}
ast_str_append(&out, 0, "<tr><td colspan=\"2\"><hr></td></tr>\r\n");
for (v = get_vars; v; v = v->next) {
@@ -989,6 +989,8 @@ static int __ast_http_load(int reload)
char newprefix[MAX_PREFIX] = "";
struct http_uri_redirect *redirect;
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
+ struct sockaddr_in tmp = {0,};
+ struct sockaddr_in tmp2 = {0,};
cfg = ast_config_load2("http.conf", "http", config_flags);
if (cfg == CONFIG_STATUS_FILEMISSING || cfg == CONFIG_STATUS_FILEUNCHANGED || cfg == CONFIG_STATUS_FILEINVALID) {
@@ -996,11 +998,13 @@ static int __ast_http_load(int reload)
}
/* default values */
- memset(&http_desc.local_address, 0, sizeof(http_desc.local_address));
- http_desc.local_address.sin_port = htons(8088);
+ tmp.sin_family = AF_INET;
+ tmp.sin_port = htons(8088);
+ ast_sockaddr_from_sin(&http_desc.local_address, &tmp);
- memset(&https_desc.local_address, 0, sizeof(https_desc.local_address));
- https_desc.local_address.sin_port = htons(8089);
+ tmp2.sin_family = AF_INET;
+ tmp2.sin_port = htons(8089);
+ ast_sockaddr_from_sin(&https_desc.local_address, &tmp2);
http_tls_cfg.enabled = 0;
if (http_tls_cfg.certfile) {
@@ -1038,10 +1042,15 @@ static int __ast_http_load(int reload)
} else if (!strcasecmp(v->name, "enablestatic")) {
newenablestatic = ast_true(v->value);
} else if (!strcasecmp(v->name, "bindport")) {
- http_desc.local_address.sin_port = htons(atoi(v->value));
+ ast_sockaddr_set_port(&http_desc.local_address,
+ atoi(v->value));
} else if (!strcasecmp(v->name, "bindaddr")) {
if ((hp = ast_gethostbyname(v->value, &ahp))) {
- memcpy(&http_desc.local_address.sin_addr, hp->h_addr, sizeof(http_desc.local_address.sin_addr));
+ ast_sockaddr_to_sin(&http_desc.local_address,
+ &tmp);
+ memcpy(&tmp.sin_addr, hp->h_addr, sizeof(tmp.sin_addr));
+ ast_sockaddr_from_sin(&http_desc.local_address,
+ &tmp);
} else {
ast_log(LOG_WARNING, "Invalid bind address '%s'\n", v->value);
}
@@ -1062,11 +1071,15 @@ static int __ast_http_load(int reload)
ast_config_destroy(cfg);
}
/* if the https addres has not been set, default is the same as non secure http */
- if (!https_desc.local_address.sin_addr.s_addr) {
- https_desc.local_address.sin_addr = http_desc.local_address.sin_addr;
+ ast_sockaddr_to_sin(&http_desc.local_address, &tmp);
+ ast_sockaddr_to_sin(&https_desc.local_address, &tmp2);
+ if (!tmp2.sin_addr.s_addr) {
+ tmp2.sin_addr = tmp.sin_addr;
+ ast_sockaddr_from_sin(&https_desc.local_address, &tmp2);
}
- if (enabled) {
- http_desc.local_address.sin_family = https_desc.local_address.sin_family = AF_INET;
+ if (!enabled) {
+ http_desc.local_address.ss.ss_family = 0;
+ https_desc.local_address.ss.ss_family = 0;
}
if (strcmp(prefix, newprefix)) {
ast_copy_string(prefix, newprefix, sizeof(prefix));
@@ -1084,6 +1097,7 @@ static char *handle_show_http(struct ast_cli_entry *e, int cmd, struct ast_cli_a
{
struct ast_http_uri *urih;
struct http_uri_redirect *redirect;
+ struct sockaddr_in tmp;
switch (cmd) {
case CLI_INIT:
@@ -1101,16 +1115,17 @@ static char *handle_show_http(struct ast_cli_entry *e, int cmd, struct ast_cli_a
}
ast_cli(a->fd, "HTTP Server Status:\n");
ast_cli(a->fd, "Prefix: %s\n", prefix);
- if (!http_desc.old_address.sin_family) {
+ ast_sockaddr_to_sin(&http_desc.old_address, &tmp);
+ if (!tmp.sin_family) {
ast_cli(a->fd, "Server Disabled\n\n");
} else {
ast_cli(a->fd, "Server Enabled and Bound to %s:%d\n\n",
- ast_inet_ntoa(http_desc.old_address.sin_addr),
- ntohs(http_desc.old_address.sin_port));
+ ast_inet_ntoa(tmp.sin_addr), ntohs(tmp.sin_port));
if (http_tls_cfg.enabled) {
+ ast_sockaddr_to_sin(&https_desc.old_address, &tmp);
ast_cli(a->fd, "HTTPS Server Enabled and Bound to %s:%d\n\n",
- ast_inet_ntoa(https_desc.old_address.sin_addr),
- ntohs(https_desc.old_address.sin_port));
+ ast_inet_ntoa(tmp.sin_addr),
+ ntohs(tmp.sin_port));
}
}