diff --git a/src/irc/proxy/listen.c b/src/irc/proxy/listen.c index 5531720c..811d747f 100644 --- a/src/irc/proxy/listen.c +++ b/src/irc/proxy/listen.c @@ -538,15 +538,32 @@ static LISTEN_REC *find_listen(const char *ircnet, int port) static void add_listen(const char *ircnet, int port) { LISTEN_REC *rec; + IPADDR ip4, ip6, *my_ip; - if (port <= 0 || *ircnet == '\0') return; + if (port <= 0 || *ircnet == '\0') + return; + + /* bind to specific host/ip? */ + my_ip = NULL; + if (*settings_get_str("irssiproxy_bind") != '\0') { + if (net_gethostbyname(settings_get_str("irssiproxy_bind"), + &ip4, &ip6) != 0) { + printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, + "Proxy: can not resolve '%s' - aborting", + settings_get_str("irssiproxy_bind")); + return; + } + + my_ip = ip6.family == 0 ? &ip4 : ip4.family == 0 || + settings_get_bool("resolve_prefer_ipv6") ? &ip6 : &ip4; + } rec = g_new0(LISTEN_REC, 1); rec->ircnet = g_strdup(ircnet); rec->port = port; - /* start listening */ - rec->handle = net_listen(NULL, &rec->port); + rec->handle = net_listen(my_ip, &rec->port); + if (rec->handle == NULL) { printtext(NULL, NULL, MSGLEVEL_CLIENTERROR, "Proxy: Listen in port %d failed: %s", diff --git a/src/irc/proxy/proxy.c b/src/irc/proxy/proxy.c index f75a5b39..2240f63b 100644 --- a/src/irc/proxy/proxy.c +++ b/src/irc/proxy/proxy.c @@ -27,6 +27,7 @@ void irc_proxy_init(void) { settings_add_str("irssiproxy", "irssiproxy_ports", ""); settings_add_str("irssiproxy", "irssiproxy_password", ""); + settings_add_str("irssiproxy", "irssiproxy_bind", ""); if (*settings_get_str("irssiproxy_password") == '\0') { /* no password - bad idea! */