Skip to content

Commit 0160299

Browse files
committed
Add support for httpd systemd socket activation
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/local/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]>
1 parent 33bb72d commit 0160299

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

libvncserver/httpd.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@
6363
#include <tcpd.h>
6464
#endif
6565

66+
#ifdef LIBVNCSERVER_WITH_SYSTEMD
67+
#include <systemd/sd-daemon.h>
68+
#endif
69+
6670

6771
#define NOT_FOUND_STR "HTTP/1.0 404 Not found\r\nConnection: close\r\n\r\n" \
6872
"<HEAD><TITLE>File Not Found</TITLE></HEAD>\n" \
@@ -100,6 +104,33 @@ rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen)
100104
if (!rfbScreen->httpDir)
101105
return;
102106

107+
#ifdef LIBVNCSERVER_WITH_SYSTEMD
108+
if (sd_listen_fds(0) == 2) {
109+
rfbSocket sock = SD_LISTEN_FDS_START + 1;
110+
if (sd_is_socket(sock, AF_UNSPEC, 0, 0)) {
111+
rfbErr("Systemd socket activation passed 'accept=yes' inetd style socket. Only passing listening sockets is supported for http socket\n");
112+
} else if (sd_is_socket(sock, AF_UNSPEC, 0, 1)) {
113+
struct sockaddr_storage sa;
114+
int sa_len = sizeof(sa);
115+
char hoststr[NI_MAXHOST];
116+
char portstr[NI_MAXSERV];
117+
118+
if (getsockname(sock, (struct sockaddr *) &sa, &sa_len) == 0
119+
&& getnameinfo((struct sockaddr *)&sa, sa_len, hoststr, sizeof(hoststr),
120+
portstr, sizeof(portstr), NI_NUMERICHOST | NI_NUMERICSERV) == 0) {
121+
rfbLog("Socket activation through systemd. Listening for HTTP connections on %s:%s\n", hoststr, portstr);
122+
rfbScreen->port = atoi(portstr);
123+
} else {
124+
rfbLogPerror("Error retrieving nameinfo of socket received from systemd\n");
125+
}
126+
127+
rfbScreen->httpListenSock = sock;
128+
}
129+
130+
return;
131+
}
132+
#endif
133+
103134
if (rfbScreen->httpPort == 0) {
104135
rfbScreen->httpPort = rfbScreen->port-100;
105136
}

libvncserver/sockets.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
178178
rfbScreen->socketState = RFB_SOCKET_READY;
179179

180180
#ifdef LIBVNCSERVER_WITH_SYSTEMD
181-
if (sd_listen_fds(0) == 1)
181+
if (sd_listen_fds(0) == 1 || sd_listen_fds(0) == 2)
182182
{
183183
rfbSocket sock = SD_LISTEN_FDS_START + 0;
184184
if (sd_is_socket(sock, AF_UNSPEC, 0, 0))
@@ -202,7 +202,6 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen)
202202
rfbScreen->listenSock = sock;
203203
FD_SET(rfbScreen->listenSock, &(rfbScreen->allFds));
204204
rfbScreen->maxFd = rfbScreen->listenSock;
205-
rfbProcessNewConnection(rfbScreen);
206205
}
207206
return;
208207
}

0 commit comments

Comments
 (0)