Skip to content

Commit

Permalink
Add support for httpd systemd socket activation
Browse files Browse the repository at this point in the history
If a second socket is passed through systemd, assume it is meant
for httpd use.

Using it requires systemd units among the lines of:

/lib/systemd/system/x11vnc.service

==
[Unit]
Description=VNC server
Requires=x11vnc.socket

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -httpdir /usr/share/novnc -no6 -xkb -repeat -auth guess -display WAIT:0 -forever -shared
==

/lib/systemd/system/x11vnc.socket

==
[Unit]
Description=VNC server socket

[Socket]
ListenStream=5900
ListenStream=80

[Install]
WantedBy=sockets.target
==

systemctl enable --now x11vnc.socket

Signed-off-by: Floris Bos <[email protected]>
  • Loading branch information
maxnet committed Dec 12, 2021
1 parent 33bb72d commit 1c24496
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
30 changes: 30 additions & 0 deletions libvncserver/httpd.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@
#include <tcpd.h>
#endif

#ifdef LIBVNCSERVER_WITH_SYSTEMD
#include <systemd/sd-daemon.h>
#endif


#define NOT_FOUND_STR "HTTP/1.0 404 Not found\r\nConnection: close\r\n\r\n" \
"<HEAD><TITLE>File Not Found</TITLE></HEAD>\n" \
Expand Down Expand Up @@ -100,6 +104,32 @@ rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen)
if (!rfbScreen->httpDir)
return;

#ifdef LIBVNCSERVER_WITH_SYSTEMD
if (sd_listen_fds(0) == 2) {
rfbSocket sock = SD_LISTEN_FDS_START + 1;
if (sd_is_socket(sock, AF_UNSPEC, 0, 0)) {
rfbErr("Systemd socket activation passed 'accept=yes' inetd style socket. Only passing listening sockets is supported for http socket\n");
} else if (sd_is_socket(sock, AF_UNSPEC, 0, 1)) {
struct sockaddr_storage sa;
int sa_len = sizeof(sa);
char hoststr[NI_MAXHOST];
char portstr[NI_MAXSERV];

if (getsockname(sock, (struct sockaddr *) &sa, &sa_len) == 0
&& getnameinfo((struct sockaddr *)&sa, sa_len, hoststr, sizeof(hoststr),
portstr, sizeof(portstr), NI_NUMERICHOST | NI_NUMERICSERV) == 0) {
rfbLog("Socket activation through systemd. Listening for HTTP connections on %s:%s\n", hoststr, portstr);
} else {
rfbLogPerror("Error retrieving nameinfo of socket received from systemd\n");
}

rfbScreen->httpListenSock = sock;
}

return;
}
#endif

if (rfbScreen->httpPort == 0) {
rfbScreen->httpPort = rfbScreen->port-100;
}
Expand Down
3 changes: 1 addition & 2 deletions libvncserver/sockets.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
rfbScreen->socketState = RFB_SOCKET_READY;

#ifdef LIBVNCSERVER_WITH_SYSTEMD
if (sd_listen_fds(0) == 1)
if (sd_listen_fds(0) == 1 || sd_listen_fds(0) == 2)
{
rfbSocket sock = SD_LISTEN_FDS_START + 0;
if (sd_is_socket(sock, AF_UNSPEC, 0, 0))
Expand All @@ -202,7 +202,6 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
rfbScreen->listenSock = sock;
FD_SET(rfbScreen->listenSock, &(rfbScreen->allFds));
rfbScreen->maxFd = rfbScreen->listenSock;
rfbProcessNewConnection(rfbScreen);
}
return;
}
Expand Down

0 comments on commit 1c24496

Please sign in to comment.