diff --git a/lib/socket.cpp b/lib/socket.cpp index bd8a5275..2abbf2fd 100644 --- a/lib/socket.cpp +++ b/lib/socket.cpp @@ -436,13 +436,21 @@ void Socket::Buffer::clear(){ } void Socket::Connection::setBoundAddr(){ + //If a bound address was set through environment (e.g. HTTPS output), restore it from there. + char * envbound = getenv("MIST_BOUND_ADDR"); + if (envbound){ + boundaddr = envbound; + return; + } + //If we can't read the address, don't try if (!isTrueSocket){ boundaddr = ""; return; } + //Otherwise, read from socket pointer. Works for both SSL and non-SSL sockets, and real sockets passed as fd's, but not for non-sockets (duh) struct sockaddr_in6 tmpaddr; socklen_t len = sizeof(tmpaddr); - if (!getsockname(sSend, (sockaddr *)&tmpaddr, &len)){ + if (!getsockname(getSocket(), (sockaddr *)&tmpaddr, &len)){ static char addrconv[INET6_ADDRSTRLEN]; if (tmpaddr.sin6_family == AF_INET6){ boundaddr = inet_ntop(AF_INET6, &(tmpaddr.sin6_addr), addrconv, INET6_ADDRSTRLEN); @@ -649,12 +657,18 @@ void Socket::Connection::drop(){ /// Returns internal socket number. int Socket::Connection::getSocket(){ +#ifdef SSL + if (sslConnected){return server_fd->fd;} +#endif if (sSend != -1){return sSend;} return sRecv; } /// Returns non-piped internal socket number. int Socket::Connection::getPureSocket(){ +#ifdef SSL + if (sslConnected){return server_fd->fd;} +#endif if (!isTrueSocket){return -1;} return sSend; } @@ -790,6 +804,8 @@ void Socket::Connection::open(std::string host, int port, bool nonblock, bool wi } } sslConnected = true; + isTrueSocket = true; + setBoundAddr(); Blocking = true; if (nonblock){setBlocking(false);} DONTEVEN_MSG("SSL connect success"); diff --git a/src/output/output_https.cpp b/src/output/output_https.cpp index 3b2fd15c..b1e41df6 100644 --- a/src/output/output_https.cpp +++ b/src/output/output_https.cpp @@ -111,7 +111,9 @@ namespace Mist{ } args.push_back(""); Util::Procs::socketList.insert(fd[0]); + setenv("MIST_BOUND_ADDR", myConn.getBoundAddress().c_str(), 1); pid_t http_proc = Util::Procs::StartPiped(args, &(fd[1]), &(fd[1]), &fderr); + unsetenv("MIST_BOUND_ADDR"); close(fd[1]); if (http_proc < 2){ FAIL_MSG("Could not spawn MistOutHTTP process for SSL connection!");