diff options
Diffstat (limited to 'unix/x0vncserver/x0vncserver.cxx')
-rw-r--r-- | unix/x0vncserver/x0vncserver.cxx | 81 |
1 files changed, 54 insertions, 27 deletions
diff --git a/unix/x0vncserver/x0vncserver.cxx b/unix/x0vncserver/x0vncserver.cxx index f87eb61e..5e9a7a57 100644 --- a/unix/x0vncserver/x0vncserver.cxx +++ b/unix/x0vncserver/x0vncserver.cxx @@ -38,6 +38,9 @@ #include <rfb/Timer.h> #include <network/TcpSocket.h> #include <network/UnixSocket.h> +#ifdef HAVE_SYSTEMD_H +# include <systemd/sd-daemon.h> +#endif #include <signal.h> #include <X11/X.h> @@ -113,6 +116,25 @@ static void CleanupSignalHandler(int /*sig*/) caughtSignal = true; } +#ifdef HAVE_SYSTEMD_H +static int createSystemdListeners(std::list<SocketListener*> *listeners) +{ + int count = sd_listen_fds(0); + + for (int i = 0; i < count; ++i) { + /* systemd sockets start at FD 3 */ + listeners->push_back(new TcpListener(3 + i)); + } + + return count; +} +#else +static int createSystemdListeners(std::list<SocketListener*> *) +{ + return 0; +} +#endif + class FileTcpFilter : public TcpFilter { @@ -300,35 +322,40 @@ int main(int argc, char** argv) VNCServerST server(desktopName, &desktop); - if (rfbunixpath.getValueStr()[0] != '\0') { - listeners.push_back(new network::UnixListener(rfbunixpath, rfbunixmode)); - vlog.info("Listening on %s (mode %04o)", (const char*)rfbunixpath, (int)rfbunixmode); - } - - if ((int)rfbport != -1) { - std::list<network::SocketListener*> tcp_listeners; - const char *addr = interface; - - if (strcasecmp(addr, "all") == 0) - addr = 0; - if (localhostOnly) - createLocalTcpListeners(&tcp_listeners, (int)rfbport); - else - createTcpListeners(&tcp_listeners, addr, (int)rfbport); - - if (!tcp_listeners.empty()) { - listeners.splice (listeners.end(), tcp_listeners); - vlog.info("Listening for VNC connections on %s interface(s), port %d", - localhostOnly ? "local" : (const char*)interface, - (int)rfbport); + if (createSystemdListeners(&listeners)) { + // When systemd is in charge of listeners, do not listen to anything else + vlog.info("Listening on systemd sockets"); + } else { + if (rfbunixpath.getValueStr()[0] != '\0') { + listeners.push_back(new network::UnixListener(rfbunixpath, rfbunixmode)); + vlog.info("Listening on %s (mode %04o)", (const char*)rfbunixpath, (int)rfbunixmode); } - FileTcpFilter fileTcpFilter(hostsFile); - if (strlen(hostsFile) != 0) - for (std::list<SocketListener*>::iterator i = listeners.begin(); - i != listeners.end(); - i++) - (*i)->setFilter(&fileTcpFilter); + if ((int)rfbport != -1) { + std::list<network::SocketListener*> tcp_listeners; + const char *addr = interface; + + if (strcasecmp(addr, "all") == 0) + addr = 0; + if (localhostOnly) + createLocalTcpListeners(&tcp_listeners, (int)rfbport); + else + createTcpListeners(&tcp_listeners, addr, (int)rfbport); + + if (!tcp_listeners.empty()) { + listeners.splice (listeners.end(), tcp_listeners); + vlog.info("Listening for VNC connections on %s interface(s), port %d", + localhostOnly ? "local" : (const char*)interface, + (int)rfbport); + } + + FileTcpFilter fileTcpFilter(hostsFile); + if (strlen(hostsFile) != 0) + for (std::list<SocketListener*>::iterator i = listeners.begin(); + i != listeners.end(); + i++) + (*i)->setFilter(&fileTcpFilter); + } } if (listeners.empty()) { |