summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--Makefile-man.am2
-rw-r--r--Makefile.am15
-rw-r--r--man/systemd-socket-proxyd.xml (renamed from man/systemd-saproxy.xml)26
l---------src/socket-proxy/Makefile (renamed from src/saproxy/Makefile)0
-rw-r--r--src/socket-proxy/socket-proxyd.c (renamed from src/saproxy/saproxy.c)87
6 files changed, 60 insertions, 72 deletions
diff --git a/.gitignore b/.gitignore
index 22485b42d6..f5acfce0a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -71,7 +71,7 @@
/systemd-reply-password
/systemd-rfkill
/systemd-run
-/systemd-saproxy
+/systemd-socket-proxyd
/systemd-shutdown
/systemd-shutdownd
/systemd-sleep
diff --git a/Makefile-man.am b/Makefile-man.am
index 6b286bc48e..54798450fa 100644
--- a/Makefile-man.am
+++ b/Makefile-man.am
@@ -66,7 +66,7 @@ MANPAGES += \
man/systemd-nspawn.1 \
man/systemd-remount-fs.service.8 \
man/systemd-run.1 \
- man/systemd-saproxy.1 \
+ man/systemd-socket-proxyd.1 \
man/systemd-shutdownd.service.8 \
man/systemd-sleep.conf.5 \
man/systemd-suspend.service.8 \
diff --git a/Makefile.am b/Makefile.am
index 4a399c5236..05f6f90291 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -299,8 +299,7 @@ bin_PROGRAMS = \
systemd-detect-virt \
systemd-delta \
systemd-analyze \
- systemd-run \
- systemd-saproxy
+ systemd-run
dist_bin_SCRIPTS = \
src/kernel-install/kernel-install
@@ -321,7 +320,8 @@ rootlibexec_PROGRAMS = \
systemd-fsck \
systemd-ac-power \
systemd-sysctl \
- systemd-sleep
+ systemd-sleep \
+ systemd-socket-proxyd
systemgenerator_PROGRAMS = \
systemd-getty-generator \
@@ -3167,10 +3167,10 @@ EXTRA_DIST += \
# ------------------------------------------------------------------------------
-systemd_saproxy_SOURCES = \
- src/saproxy/saproxy.c
+systemd_socket_proxyd_SOURCES = \
+ src/socket-proxy/socket-proxyd.c
-systemd_saproxy_LDADD = \
+systemd_socket_proxyd_LDADD = \
libsystemd-shared.la \
libsystemd-logs.la \
libsystemd-journal-internal.la \
@@ -3178,9 +3178,6 @@ systemd_saproxy_LDADD = \
libsystemd-daemon.la \
libsystemd-bus.la
-systemd_saproxy_CFLAGS = \
- $(AM_CFLAGS)
-
# ------------------------------------------------------------------------------
if ENABLE_COREDUMP
systemd_coredump_SOURCES = \
diff --git a/man/systemd-saproxy.xml b/man/systemd-socket-proxyd.xml
index ff8218c1e2..90b3b1c3a4 100644
--- a/man/systemd-saproxy.xml
+++ b/man/systemd-socket-proxyd.xml
@@ -20,9 +20,9 @@
You should have received a copy of the GNU Lesser General Public License
along with systemd; If not, see <http://www.gnu.org/licenses/>.
-->
-<refentry id="systemd-saproxy">
+<refentry id="systemd-socket-proxyd">
<refentryinfo>
- <title>systemd-saproxy</title>
+ <title>systemd-socket-proxyd</title>
<productname>systemd</productname>
<authorgroup>
<author>
@@ -34,23 +34,23 @@
</authorgroup>
</refentryinfo>
<refmeta>
- <refentrytitle>systemd-saproxy</refentrytitle>
+ <refentrytitle>systemd-socket-proxyd</refentrytitle>
<manvolnum>1</manvolnum>
</refmeta>
<refnamediv>
- <refname>systemd-saproxy</refname>
+ <refname>systemd-socket-proxyd</refname>
<refpurpose>Inherit a socket. Bidirectionally
proxy.</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
- <command>systemd-saproxy</command>
+ <command>systemd-socket-proxyd</command>
<arg choice="opt" rep="repeat">OPTIONS</arg>
<arg choice="plain"><replaceable>HOSTNAME-OR-IP</replaceable></arg>
<arg choice="plain"><replaceable>PORT-OR-SERVICE</replaceable></arg>
</cmdsynopsis>
<cmdsynopsis>
- <command>systemd-saproxy</command>
+ <command>systemd-socket-proxyd</command>
<arg choice="opt" rep="repeat">OPTIONS</arg>
<arg choice="plain"><replaceable>UNIX-DOMAIN-SOCKET-PATH</replaceable>
</arg>
@@ -59,7 +59,7 @@
<refsect1>
<title>Description</title>
<para>
- <command>systemd-saproxy</command> provides a proxy
+ <command>systemd-socket-proxyd</command> provides a proxy
to socket-activate services that do not yet support
native socket activation. On behalf of the daemon,
the proxy inherits the socket from systemd, accepts
@@ -68,7 +68,7 @@
data between the two.</para>
<para>This utility's behavior is similar to
<citerefentry><refentrytitle>socat</refentrytitle><manvolnum>1</manvolnum> </citerefentry>.
- The main differences for <command>systemd-saproxy</command>
+ The main differences for <command>systemd-socket-proxyd</command>
are support for socket activation with
<literal>Accept=false</literal> and an event-driven
design that scales better with the number of
@@ -102,7 +102,7 @@
invoked indirectly, for
example with a shell script
rather than with
- <option>ExecStart=/usr/bin/systemd-saproxy</option>
+ <option>ExecStart=/usr/bin/systemd-socket-proxyd</option>
</para>
</listitem>
</varlistentry>
@@ -137,7 +137,7 @@ After=nginx.service
Requires=nginx.service
[Service]
-ExecStart=/usr/bin/systemd-saproxy /tmp/nginx.sock
+ExecStart=/usr/bin/systemd-socket-proxyd /tmp/nginx.sock
PrivateTmp=true
PrivateNetwork=true]]>
</programlisting>
@@ -190,14 +190,14 @@ After=syslog.target remote-fs.target nss-lookup.target
[Service]
ExecStartPre=/usr/sbin/nginx -t
-ExecStart=/usr/bin/saproxy-nginx.sh
+ExecStart=/usr/bin/socket-proxyd-nginx.sh
PrivateTmp=true
PrivateNetwork=true]]>
</programlisting>
</example>
<example label="shell script">
<title>
- /usr/bin/saproxy-nginx.sh</title>
+ /usr/bin/socket-proxyd-nginx.sh</title>
<programlisting>
<![CDATA[#!/bin/sh
/usr/sbin/nginx
@@ -205,7 +205,7 @@ while [ ! -f /tmp/nginx.pid ]
do
/usr/bin/inotifywait /tmp/nginx.pid
done
-/usr/bin/systemd-saproxy --ignore-env localhost 8080]]>
+/usr/bin/systemd-socket-proxyd --ignore-env localhost 8080]]>
</programlisting>
</example>
<example label="nginx configuration">
diff --git a/src/saproxy/Makefile b/src/socket-proxy/Makefile
index d0b0e8e008..d0b0e8e008 120000
--- a/src/saproxy/Makefile
+++ b/src/socket-proxy/Makefile
diff --git a/src/saproxy/saproxy.c b/src/socket-proxy/socket-proxyd.c
index 6504d09251..59216038db 100644
--- a/src/saproxy/saproxy.c
+++ b/src/socket-proxy/socket-proxyd.c
@@ -31,11 +31,12 @@
#include <sys/un.h>
#include <unistd.h>
-#include "log.h"
#include "sd-daemon.h"
#include "sd-event.h"
+#include "log.h"
#include "socket-util.h"
#include "util.h"
+#include "event-util.h"
#define BUFFER_SIZE 16384
#define _cleanup_freeaddrinfo_ _cleanup_(freeaddrinfop)
@@ -65,7 +66,7 @@ struct connection {
static void free_connection(struct connection *c) {
log_debug("Freeing fd=%d (conn %p).", c->fd, c);
sd_event_source_unref(c->w);
- close(c->fd);
+ close_nointr_nofail(c->fd);
free(c);
}
@@ -354,13 +355,13 @@ static int accept_cb(sd_event_source *s, int fd, uint32_t revents, void *userdat
assert(revents & EPOLLIN);
- c_server_to_client = malloc0(sizeof(struct connection));
+ c_server_to_client = new0(struct connection, 1);
if (c_server_to_client == NULL) {
log_oom();
goto fail;
}
- c_client_to_server = malloc0(sizeof(struct connection));
+ c_client_to_server = new0(struct connection, 1);
if (c_client_to_server == NULL) {
log_oom();
goto fail;
@@ -372,19 +373,12 @@ static int accept_cb(sd_event_source *s, int fd, uint32_t revents, void *userdat
goto fail;
}
- c_client_to_server->fd = accept(fd, (struct sockaddr *) &sa, &salen);
+ c_client_to_server->fd = accept4(fd, (struct sockaddr *) &sa, &salen, SOCK_NONBLOCK|SOCK_CLOEXEC);
if (c_client_to_server->fd < 0) {
log_error("Error accepting client connection.");
goto fail;
}
- /* Unlike on BSD, client sockets do not inherit nonblocking status
- * from the listening socket. */
- r = fd_nonblock(c_client_to_server->fd, true);
- if (r < 0) {
- log_error("Error %d marking client connection as nonblocking: %s", r, strerror(-r));
- goto fail;
- }
if (sa.sa.sa_family == AF_INET || sa.sa.sa_family == AF_INET6) {
char sa_str[INET6_ADDRSTRLEN];
@@ -424,35 +418,37 @@ fail:
finish:
/* Preserve the main loop even if a single proxy setup fails. */
- return 0;
+ return 1;
}
static int run_main_loop(struct proxy *proxy) {
+ _cleanup_event_source_unref_ sd_event_source *w_accept = NULL;
+ _cleanup_event_unref_ sd_event *e = NULL;
int r = EXIT_SUCCESS;
- struct sd_event *e = NULL;
- sd_event_source *w_accept = NULL;
r = sd_event_new(&e);
- if (r < 0)
- goto finish;
+ if (r < 0) {
+ log_error("Failed to allocate event loop: %s", strerror(-r));
+ return r;
+ }
r = fd_nonblock(proxy->listen_fd, true);
- if (r < 0)
- goto finish;
+ if (r < 0) {
+ log_error("Failed to make listen file descriptor non-blocking: %s", strerror(-r));
+ return r;
+ }
log_debug("Initializing main listener fd=%d", proxy->listen_fd);
- sd_event_add_io(e, proxy->listen_fd, EPOLLIN, accept_cb, proxy, &w_accept);
+ r = sd_event_add_io(e, proxy->listen_fd, EPOLLIN, accept_cb, proxy, &w_accept);
+ if (r < 0) {
+ log_error("Failed to add event IO source: %s", strerror(-r));
+ return r;
+ }
log_debug("Initialized main listener. Entering loop.");
- sd_event_loop(e);
-
-finish:
- sd_event_source_unref(w_accept);
- sd_event_unref(e);
-
- return r;
+ return sd_event_loop(e);
}
static int help(void) {
@@ -470,7 +466,7 @@ static int help(void) {
}
static void version(void) {
- puts(PACKAGE_STRING " saproxy");
+ puts(PACKAGE_STRING " socket-proxyd");
}
static int parse_argv(int argc, char *argv[], struct proxy *p) {
@@ -559,21 +555,21 @@ int main(int argc, char *argv[]) {
p.listen_fd = SD_LISTEN_FDS_START;
if (!p.ignore_env) {
- int n;
- n = sd_listen_fds(1);
- if (n == 0) {
- log_error("Found zero inheritable sockets. Are you sure this is running as a socket-activated service?");
- r = EXIT_FAILURE;
- goto finish;
- } else if (n < 0) {
- log_error("Error %d while finding inheritable sockets: %s", n, strerror(-n));
- r = EXIT_FAILURE;
- goto finish;
- } else if (n > 1) {
- log_error("Can't listen on more than one socket.");
- r = EXIT_FAILURE;
- goto finish;
- }
+ int n;
+ n = sd_listen_fds(1);
+ if (n == 0) {
+ log_error("Found zero inheritable sockets. Are you sure this is running as a socket-activated service?");
+ r = EXIT_FAILURE;
+ goto finish;
+ } else if (n < 0) {
+ log_error("Error %d while finding inheritable sockets: %s", n, strerror(-n));
+ r = EXIT_FAILURE;
+ goto finish;
+ } else if (n > 1) {
+ log_error("Can't listen on more than one socket.");
+ r = EXIT_FAILURE;
+ goto finish;
+ }
}
/* @TODO: Check if this proxy can work with datagram sockets. */
@@ -586,12 +582,7 @@ int main(int argc, char *argv[]) {
log_info("Starting the socket activation proxy with listener fd=%d.", p.listen_fd);
r = run_main_loop(&p);
- if (r < 0) {
- log_error("Error %d from main loop.", r);
- goto finish;
- }
finish:
- log_close();
return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
}