From a3fdc6f1200aef4f161607bb9f62e07d5d85b9e6 Mon Sep 17 00:00:00 2001 From: "Archie L. Cobbs" Date: Sat, 16 Feb 2013 16:01:34 -0600 Subject: [PATCH] Allow binding address to be specified via --bindaddr flag. --- man/tvheadend.1 | 4 ++++ src/htsp_server.c | 6 +++--- src/htsp_server.h | 2 +- src/http.c | 4 ++-- src/http.h | 2 +- src/main.c | 6 ++++-- src/tcp.c | 12 +++++++++--- src/tcp.h | 2 +- 8 files changed, 25 insertions(+), 13 deletions(-) diff --git a/man/tvheadend.1 b/man/tvheadend.1 index 47fb3c5a..7b1e03f3 100644 --- a/man/tvheadend.1 +++ b/man/tvheadend.1 @@ -13,6 +13,10 @@ Media player. .SH OPTIONS All arguments are optional. .TP +\fB\-b\fR \fIaddress\fR, \fB\-\-bindaddr\fR \fIaddress\fR +Specify an interface IP address on which incoming HTTP and HTSP connections +will be accepted. By default, connections are accepted on all interfaces. +.TP \fB\-f Fork and become a background process (deamon). Default no. .TP diff --git a/src/htsp_server.c b/src/htsp_server.c index ad7bb1a3..7e5d8c0d 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -1966,12 +1966,12 @@ htsp_serve(int fd, void *opaque, struct sockaddr_storage *source, * Fire up HTSP server */ void -htsp_init(void) +htsp_init(const char *bindaddr) { extern int tvheadend_htsp_port_extra; - htsp_server = tcp_server_create(tvheadend_htsp_port, htsp_serve, NULL); + htsp_server = tcp_server_create(bindaddr, tvheadend_htsp_port, htsp_serve, NULL); if(tvheadend_htsp_port_extra) - htsp_server_2 = tcp_server_create(tvheadend_htsp_port_extra, htsp_serve, NULL); + htsp_server_2 = tcp_server_create(bindaddr, tvheadend_htsp_port_extra, htsp_serve, NULL); } /* ************************************************************************** diff --git a/src/htsp_server.h b/src/htsp_server.h index a82cca12..77002cac 100644 --- a/src/htsp_server.h +++ b/src/htsp_server.h @@ -22,7 +22,7 @@ #include "epg.h" #include "dvr/dvr.h" -void htsp_init(void); +void htsp_init(const char *bindaddr); void htsp_channel_update_current(channel_t *ch); diff --git a/src/http.c b/src/http.c index c668a02f..98562d74 100644 --- a/src/http.c +++ b/src/http.c @@ -816,7 +816,7 @@ http_serve(int fd, void *opaque, struct sockaddr_storage *peer, * Fire up HTTP server */ void -http_server_init(void) +http_server_init(const char *bindaddr) { - http_server = tcp_server_create(tvheadend_webui_port, http_serve, NULL); + http_server = tcp_server_create(bindaddr, tvheadend_webui_port, http_serve, NULL); } diff --git a/src/http.h b/src/http.h index 9e3d061c..08878b46 100644 --- a/src/http.h +++ b/src/http.h @@ -133,7 +133,7 @@ http_path_t *http_path_add(const char *path, void *opaque, -void http_server_init(void); +void http_server_init(const char *bindaddr); int http_access_verify(http_connection_t *hc, int mask); diff --git a/src/main.c b/src/main.c index 33db93b7..e163e029 100644 --- a/src/main.c +++ b/src/main.c @@ -376,6 +376,7 @@ main(int argc, char **argv) *opt_dvb_raw = NULL, #endif *opt_rawts = NULL, + *opt_bindaddr = NULL, *opt_subscribe = NULL; cmdline_opt_t cmdline_opts[] = { { 0, NULL, "Generic Options", OPT_BOOL, NULL }, @@ -383,6 +384,7 @@ main(int argc, char **argv) { 'v', "version", "Show version infomation", OPT_BOOL, &opt_version }, { 0, NULL, "Service Configuration", OPT_BOOL, NULL }, + { 'b', "bindaddr", "Specify bind address", OPT_STR, &opt_bindaddr}, { 'c', "config", "Alternate config path", OPT_STR, &opt_config }, { 'f', "fork", "Fork and run as daemon", OPT_BOOL, &opt_fork }, { 'u', "user", "Run as user", OPT_STR, &opt_user }, @@ -625,7 +627,7 @@ main(int argc, char **argv) #endif tcp_server_init(opt_ipv6); - http_server_init(); + http_server_init(opt_bindaddr); webui_init(); serviceprobe_init(); @@ -643,7 +645,7 @@ main(int argc, char **argv) dvr_init(); - htsp_init(); + htsp_init(opt_bindaddr); if(opt_rawts != NULL) rawts_init(opt_rawts); diff --git a/src/tcp.c b/src/tcp.c index 5ccf1bac..0a9dbd7a 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -499,7 +499,7 @@ tcp_server_loop(void *aux) * */ void * -tcp_server_create(int port, tcp_server_callback_t *start, void *opaque) +tcp_server_create(const char *bindaddr, int port, tcp_server_callback_t *start, void *opaque) { int fd, x; struct epoll_event e; @@ -515,14 +515,19 @@ tcp_server_create(int port, tcp_server_callback_t *start, void *opaque) memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_flags = AI_PASSIVE; + if (bindaddr != NULL) + hints.ai_flags |= AI_NUMERICHOST; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; - x = getaddrinfo(NULL, portBuf, &hints, &res); + x = getaddrinfo(bindaddr, portBuf, &hints, &res); free(portBuf); - if(x != 0) + if(x != 0) { + fprintf(stderr, "getaddrinfo: %s: %s", bindaddr != NULL ? bindaddr : "*", + x == EAI_SYSTEM ? strerror(errno) : gai_strerror(x)); return NULL; + } ressave = res; while(res) @@ -553,6 +558,7 @@ tcp_server_create(int port, tcp_server_callback_t *start, void *opaque) if(x != 0) { + fprintf(stderr, "bind: %s: %s", bindaddr != NULL ? bindaddr : "*", strerror(errno)); close(fd); return NULL; } diff --git a/src/tcp.h b/src/tcp.h index 0c061e43..98649f0b 100644 --- a/src/tcp.h +++ b/src/tcp.h @@ -32,7 +32,7 @@ typedef void (tcp_server_callback_t)(int fd, void *opaque, struct sockaddr_storage *peer, struct sockaddr_storage *self); -void *tcp_server_create(int port, tcp_server_callback_t *start, void *opaque); +void *tcp_server_create(const char *bindaddr, int port, tcp_server_callback_t *start, void *opaque); int tcp_read(int fd, void *buf, size_t len);