MAJOR: systemd-wrapper: get rid of the wrapper

The master worker mode obsoletes the systemd-wrapper, to ensure that
nobody uses it anymore, the code has been removed.
diff --git a/Makefile b/Makefile
index 5b5ecca..1c90a3e 100644
--- a/Makefile
+++ b/Makefile
@@ -61,8 +61,7 @@
 #          by "haproxy -vv" in CFLAGS.
 #   SILENT_DEFINE may be used to specify other defines which will not be
 #     reported by "haproxy -vv".
-#   EXTRA   is used to force building or not building some extra tools. By
-#           default on Linux 2.6+, it contains "haproxy-systemd-wrapper".
+#   EXTRA   is used to force building or not building some extra tools.
 #   DESTDIR is not set by default and is used for installation only.
 #           It might be useful to set DESTDIR if you want to install haproxy
 #           in a sandbox.
@@ -175,7 +174,7 @@
 DEFINE =
 SILENT_DEFINE =
 
-#### extra programs to build (eg: haproxy-systemd-wrapper)
+#### extra programs to build
 # Force this to enable building extra programs or to disable them.
 # It's automatically appended depending on the targets.
 EXTRA =
@@ -266,7 +265,6 @@
   USE_TPROXY      = implicit
   USE_LIBCRYPT    = implicit
   USE_FUTEX       = implicit
-  EXTRA          += haproxy-systemd-wrapper
   USE_DL          = implicit
 else
 ifeq ($(TARGET),linux2628)
@@ -282,7 +280,6 @@
   USE_FUTEX       = implicit
   USE_CPU_AFFINITY= implicit
   ASSUME_SPLICE_WORKS= implicit
-  EXTRA          += haproxy-systemd-wrapper
   USE_DL          = implicit
 else
 ifeq ($(TARGET),solaris)
@@ -835,7 +832,6 @@
 OBJS += src/trace.o
 endif
 
-WRAPPER_OBJS = src/haproxy-systemd-wrapper.o
 
 # Not used right now
 LIB_EBTREE = $(EBTREE_DIR)/libebtree.a
@@ -850,9 +846,6 @@
 haproxy: $(OPTIONS_OBJS) $(EBTREE_OBJS) $(OBJS)
 	$(LD) $(LDFLAGS) -o $@ $^ $(LDOPTS)
 
-haproxy-systemd-wrapper: $(WRAPPER_OBJS)
-	$(LD) $(LDFLAGS) -o $@ $^ $(LDOPTS)
-
 $(LIB_EBTREE): $(EBTREE_OBJS)
 	$(AR) rv $@ $^
 
@@ -875,11 +868,6 @@
 	      -DBUILD_OPTIONS='"$(strip $(BUILD_OPTIONS))"' \
 	       -c -o $@ $<
 
-src/haproxy-systemd-wrapper.o:	src/haproxy-systemd-wrapper.c $(DEP)
-	$(CC) $(COPTS) \
-	      -DSBINDIR='"$(strip $(SBINDIR))"' \
-	       -c -o $@ $<
-
 src/dlmalloc.o: $(DLMALLOC_SRC) $(DEP)
 	$(CC) $(COPTS) -DDEFAULT_MMAP_THRESHOLD=$(DLMALLOC_THRES) -c -o $@ $<
 
@@ -915,14 +903,12 @@
 	done
 	-rmdir "$(DESTDIR)$(DOCDIR)"
 	rm -f "$(DESTDIR)$(SBINDIR)"/haproxy
-	rm -f "$(DESTDIR)$(SBINDIR)"/haproxy-systemd-wrapper
 
 clean:
 	rm -f *.[oas] src/*.[oas] ebtree/*.[oas] haproxy test .build_opts .build_opts.new
 	for dir in . src include/* doc ebtree; do rm -f $$dir/*~ $$dir/*.rej $$dir/core; done
 	rm -f haproxy-$(VERSION).tar.gz haproxy-$(VERSION)$(SUBVERS).tar.gz
 	rm -f haproxy-$(VERSION) haproxy-$(VERSION)$(SUBVERS) nohup.out gmon.out
-	rm -f haproxy-systemd-wrapper
 
 tags:
 	find src include \( -name '*.c' -o -name '*.h' \) -print0 | \
diff --git a/contrib/systemd/haproxy.service.in b/contrib/systemd/haproxy.service.in
index ca38d70..81b4951 100644
--- a/contrib/systemd/haproxy.service.in
+++ b/contrib/systemd/haproxy.service.in
@@ -7,7 +7,7 @@
 # socket if you want seamless reloads.
 Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid"
 ExecStartPre=@SBINDIR@/haproxy -f $CONFIG -c -q
-ExecStart=@SBINDIR@/haproxy-systemd-wrapper -f $CONFIG -p $PIDFILE
+ExecStart=@SBINDIR@/haproxy -W -f $CONFIG -p $PIDFILE
 ExecReload=@SBINDIR@/haproxy -f $CONFIG -c -q
 ExecReload=/bin/kill -USR2 $MAINPID
 KillMode=mixed
diff --git a/src/haproxy-systemd-wrapper.c b/src/haproxy-systemd-wrapper.c
deleted file mode 100644
index 457f5bd..0000000
--- a/src/haproxy-systemd-wrapper.c
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Wrapper to make haproxy systemd-compliant.
- *
- * Copyright 2013 Marc-Antoine Perennou <Marc-Antoine@Perennou.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- */
-
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/wait.h>
-
-#define REEXEC_FLAG "HAPROXY_SYSTEMD_REEXEC"
-#define SD_DEBUG "<7>"
-#define SD_NOTICE "<5>"
-
-static volatile sig_atomic_t caught_signal;
-
-static char *pid_file = "/run/haproxy.pid";
-static int wrapper_argc;
-static char **wrapper_argv;
-
-static void setup_signal_handler();
-static void pause_signal_handler();
-static void reset_signal_handler();
-
-
-/* returns the path to the haproxy binary into <buffer>, whose size indicated
- * in <buffer_size> must be at least 1 byte long.
- */
-static void locate_haproxy(char *buffer, size_t buffer_size)
-{
-	char *end = NULL;
-	int len;
-
-	len = readlink("/proc/self/exe", buffer, buffer_size - 1);
-	if (len == -1)
-		goto fail;
-
-	buffer[len] = 0;
-	end = strrchr(buffer, '/');
-	if (end == NULL)
-		goto fail;
-
-	if (strcmp(end + strlen(end) - 16, "-systemd-wrapper") == 0) {
-		end[strlen(end) - 16] = '\0';
-		return;
-	}
-
-	end[1] = '\0';
-	strncpy(end + 1, "haproxy", buffer + buffer_size - (end + 1));
-	buffer[buffer_size - 1] = '\0';
-	return;
- fail:
-	strncpy(buffer, "/usr/sbin/haproxy", buffer_size);
-	buffer[buffer_size - 1] = '\0';
-	return;
-}
-
-/* Note: this function must not exit in case of error (except in the child), as
- * it is only dedicated the starting a new haproxy process. By keeping the
- * process alive it will ensure that future signal delivery may get rid of
- * the issue. If the first startup fails, the wrapper will notice it and
- * return an error thanks to wait() returning ECHILD.
- */
-static void spawn_haproxy(char **pid_strv, int nb_pid)
-{
-	char haproxy_bin[512];
-	pid_t pid;
-	int main_argc;
-	char **main_argv;
-	int pipefd[2];
-	char fdstr[20];
-	int ret;
-
-	main_argc = wrapper_argc - 1;
-	main_argv = wrapper_argv + 1;
-
-	if (pipe(pipefd) != 0) {
-		fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to create a pipe, please try again later.\n");
-		return;
-	}
-
-	pid = fork();
-	if (!pid) {
-		char **argv;
-		char *stats_socket = NULL;
-		int i;
-		int argno = 0;
-
-		/* 3 for "haproxy -Ds -sf" */
-		if (nb_pid > 0)
-			stats_socket = getenv("HAPROXY_STATS_SOCKET");
-		argv = calloc(4 + main_argc + nb_pid + 1 +
-		    (stats_socket != NULL ? 2 : 0), sizeof(char *));
-		if (!argv) {
-			fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to calloc(), please try again later.\n");
-			exit(1);
-		}
-
-		reset_signal_handler();
-
-		close(pipefd[0]); /* close the read side */
-
-		snprintf(fdstr, sizeof(fdstr), "%d", pipefd[1]);
-		if (setenv("HAPROXY_WRAPPER_FD", fdstr, 1) != 0) {
-			fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to setenv(), please try again later.\n");
-			exit(1);
-		}
-
-		locate_haproxy(haproxy_bin, 512);
-		argv[argno++] = haproxy_bin;
-		for (i = 0; i < main_argc; ++i)
-			argv[argno++] = main_argv[i];
-		argv[argno++] = "-Ds";
-		if (nb_pid > 0) {
-			argv[argno++] = "-sf";
-			for (i = 0; i < nb_pid; ++i)
-				argv[argno++] = pid_strv[i];
-			if (stats_socket != NULL) {
-				argv[argno++] = "-x";
-				argv[argno++] = stats_socket;
-			}
-		}
-		argv[argno] = NULL;
-
-		fprintf(stderr, SD_DEBUG "haproxy-systemd-wrapper: executing ");
-		for (i = 0; argv[i]; ++i)
-			fprintf(stderr, "%s ", argv[i]);
-		fprintf(stderr, "\n");
-
-		execv(argv[0], argv);
-		fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: execv(%s) failed, please try again later.\n", argv[0]);
-		exit(1);
-	}
-	else if (pid == -1) {
-		fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: failed to fork(), please try again later.\n");
-	}
-
-	/* The parent closes the write side and waits for the child to close it
-	 * as well. Also deal the case where the fd would unexpectedly be 1 or 2
-	 * by silently draining all data.
-	 */
-	close(pipefd[1]);
-
-	do {
-		char c;
-		ret = read(pipefd[0], &c, sizeof(c));
-	} while ((ret > 0) || (ret == -1 && errno == EINTR));
-	/* the child has finished starting up */
-	close(pipefd[0]);
-}
-
-static int read_pids(char ***pid_strv)
-{
-	FILE *f = fopen(pid_file, "r");
-	int read = 0, allocated = 8;
-	char pid_str[10];
-
-	if (!f)
-		return 0;
-
-	*pid_strv = malloc(allocated * sizeof(char *));
-	while (1 == fscanf(f, "%s\n", pid_str)) {
-		if (read == allocated) {
-			allocated *= 2;
-			*pid_strv = realloc(*pid_strv, allocated * sizeof(char *));
-		}
-		(*pid_strv)[read++] = strdup(pid_str);
-	}
-
-	fclose(f);
-
-	return read;
-}
-
-static void signal_handler(int signum)
-{
-	if (caught_signal != SIGINT && caught_signal != SIGTERM)
-		caught_signal = signum;
-}
-
-static void setup_signal_handler()
-{
-	struct sigaction sa;
-
-	memset(&sa, 0, sizeof(struct sigaction));
-	sa.sa_handler = &signal_handler;
-	sigaction(SIGUSR2, &sa, NULL);
-	sigaction(SIGHUP, &sa, NULL);
-	sigaction(SIGINT, &sa, NULL);
-	sigaction(SIGTERM, &sa, NULL);
-}
-
-static void pause_signal_handler()
-{
-	signal(SIGUSR2, SIG_IGN);
-	signal(SIGHUP,  SIG_IGN);
-	signal(SIGINT,  SIG_DFL);
-	signal(SIGTERM, SIG_DFL);
-}
-
-static void reset_signal_handler()
-{
-	signal(SIGUSR2, SIG_DFL);
-	signal(SIGHUP,  SIG_DFL);
-	signal(SIGINT,  SIG_DFL);
-	signal(SIGTERM, SIG_DFL);
-}
-
-/* handles SIGUSR2 and SIGHUP only */
-static void do_restart(int sig)
-{
-	setenv(REEXEC_FLAG, "1", 1);
-	fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: re-executing on %s.\n",
-	        sig == SIGUSR2 ? "SIGUSR2" : "SIGHUP");
-
-	/* don't let the other process take one of those signals by accident */
-	pause_signal_handler();
-	execv(wrapper_argv[0], wrapper_argv);
-	/* failed, let's reinstall the signal handler and continue */
-	setup_signal_handler();
-	fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: re-exec(%s) failed.\n", wrapper_argv[0]);
-}
-
-/* handles SIGTERM and SIGINT only */
-static void do_shutdown(int sig)
-{
-	int i, pid;
-	char **pid_strv = NULL;
-	int nb_pid = read_pids(&pid_strv);
-	for (i = 0; i < nb_pid; ++i) {
-		pid = atoi(pid_strv[i]);
-		if (pid > 0) {
-			fprintf(stderr, SD_DEBUG "haproxy-systemd-wrapper: %s -> %d.\n",
-			        sig == SIGTERM ? "SIGTERM" : "SIGINT", pid);
-			kill(pid, sig);
-			free(pid_strv[i]);
-		}
-	}
-	free(pid_strv);
-}
-
-static void init(int argc, char **argv)
-{
-	while (argc > 1) {
-		if ((*argv)[0] == '-' && (*argv)[1] == 'p') {
-			pid_file = *(argv + 1);
-		}
-		--argc; ++argv;
-	}
-}
-
-int main(int argc, char **argv)
-{
-	int status;
-
-	setup_signal_handler();
-
-	wrapper_argc = argc;
-	wrapper_argv = argv;
-
-	--argc; ++argv;
-	init(argc, argv);
-
-	if (getenv(REEXEC_FLAG) != NULL) {
-		/* We are being re-executed: restart HAProxy gracefully */
-		int i;
-		char **pid_strv = NULL;
-		int nb_pid = read_pids(&pid_strv);
-
-		unsetenv(REEXEC_FLAG);
-		spawn_haproxy(pid_strv, nb_pid);
-
-		for (i = 0; i < nb_pid; ++i)
-			free(pid_strv[i]);
-		free(pid_strv);
-	}
-	else {
-		/* Start a fresh copy of HAProxy */
-		spawn_haproxy(NULL, 0);
-	}
-
-	status = -1;
-	while (caught_signal || wait(&status) != -1 || errno == EINTR) {
-		int sig = caught_signal;
-
-		if (caught_signal == SIGUSR2 || caught_signal == SIGHUP) {
-			caught_signal = 0;
-			do_restart(sig);
-		}
-		else if (caught_signal == SIGINT || caught_signal == SIGTERM) {
-			caught_signal = 0;
-			do_shutdown(sig);
-		}
-	}
-
-	/* return either exit code or signal+128 */
-	if (WIFEXITED(status))
-		status = WEXITSTATUS(status);
-	else if (WIFSIGNALED(status))
-		status = 128 + WTERMSIG(status);
-	else if (WIFSTOPPED(status))
-		status = 128 + WSTOPSIG(status);
-	else
-		status = 255;
-
-	fprintf(stderr, SD_NOTICE "haproxy-systemd-wrapper: exit, haproxy RC=%d\n",
-			status);
-	return status;
-}