From a5dc0e62b77614e9a51029fd000092ac8473110c Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Mon, 17 Oct 2016 15:37:36 +0200
Subject: [PATCH] Replaced init script by systemd unit

Daemonization is handled by systemd.
---
 compctld.c             |  17 +----
 debian/changelog       |   2 +
 debian/compctl.init    | 139 -----------------------------------------
 debian/compctl.service |  10 +++
 debian/dirs            |   1 -
 5 files changed, 13 insertions(+), 156 deletions(-)
 delete mode 100644 debian/compctl.init
 create mode 100644 debian/compctl.service

diff --git a/compctld.c b/compctld.c
index 5e41ff4..34aad67 100644
--- a/compctld.c
+++ b/compctld.c
@@ -111,24 +111,9 @@ mprintf(int fd, char *fmt, ...)
 int
 main(int argc, char *argv[])
 {
-	/* Do this while everyone can still see the error. */
-	cgroup_init();
-
-	pid_t p = fork();
-	if (p < 0) {
-		perror("fork");
-		exit(EXIT_FAILURE);
-	}
-	if (p > 0)
-		exit(EXIT_SUCCESS);
-
-	fclose(stderr);
-	fclose(stdout);
-	fclose(stdin);
 	openlog("compctl", LOG_PID, LOG_DAEMON);
 	cgroup_perror = logperror;
-
-	setsid();
+	cgroup_init();
 
 	int s = socket(AF_UNIX, SOCK_STREAM, 0);
 	/* TODO: Protect against double execution? */
diff --git a/debian/changelog b/debian/changelog
index 7ae41aa..1f85aa8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,6 +3,8 @@ compctl (1.2-1) stable; urgency=medium
   * Compctl now does not break other managers of cgroups
     (in particular systemd).
 
+  * Init script replaced by systemd unit.
+
  -- Martin Mares <mares@kam.mff.cuni.cz>  Mon, 17 Oct 2016 15:12:08 +0200
 
 compctl (1.1-1) unstable; urgency=low
diff --git a/debian/compctl.init b/debian/compctl.init
deleted file mode 100644
index 41e27fe..0000000
--- a/debian/compctl.init
+++ /dev/null
@@ -1,139 +0,0 @@
-#!/bin/sh
-### BEGIN INIT INFO
-# Provides:          compctl
-# Required-Start:    $local_fs $remote_fs
-# Required-Stop:     $remote_fs
-# Default-Start:     2 3 4 5
-# Default-Stop:      0 1 6
-# Short-Description: Computations under control - control daemon
-# Description:       This daemon handles the priviledged cgroup management
-#                    tasks for compctl.
-### END INIT INFO
-
-# Author: Petr Baudis <pasky@ucw.cz>
-
-# PATH should only include /usr/* if it runs after the mountnfs.sh script
-PATH=/sbin:/usr/sbin:/bin:/usr/bin
-DESC=compctl             # Introduce a short description here
-NAME=compctl             # Introduce the short server's name here
-DAEMON=/usr/sbin/compctld # Introduce the server's location here
-DAEMON_ARGS=""            # Arguments to run the daemon with
-PIDFILE=
-SCRIPTNAME=/etc/init.d/$NAME
-
-# Exit if the package is not installed
-[ -x $DAEMON ] || exit 0
-
-# Read configuration variable file if it is present
-[ -r /etc/default/$NAME ] && . /etc/default/$NAME
-
-# Load the VERBOSE setting and other rcS variables
-. /lib/init/vars.sh
-
-# Define LSB log_* functions.
-# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
-. /lib/lsb/init-functions
-
-#
-# Function that starts the daemon/service
-#
-do_start()
-{
-	# Return
-	#   0 if daemon has been started
-	#   1 if daemon was already running
-	#   2 if daemon could not be started
-	start-stop-daemon --start --quiet --exec $DAEMON --test > /dev/null \
-		|| return 1
-	start-stop-daemon --start --quiet --exec $DAEMON -- \
-		$DAEMON_ARGS \
-		|| return 2
-	# Add code here, if necessary, that waits for the process to be ready
-	# to handle requests from services started subsequently which depend
-	# on this one.  As a last resort, sleep for some time.
-}
-
-#
-# Function that stops the daemon/service
-#
-do_stop()
-{
-	# Return
-	#   0 if daemon has been stopped
-	#   1 if daemon was already stopped
-	#   2 if daemon could not be stopped
-	#   other if a failure occurred
-	start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --exec $DAEMON
-	RETVAL="$?"
-	[ "$RETVAL" = 2 ] && return 2
-	# Wait for children to finish too if this is a daemon that forks
-	# and if the daemon is only ever run from this initscript.
-	# If the above conditions are not satisfied then add some other code
-	# that waits for the process to drop all resources that could be
-	# needed by services started subsequently.  A last resort is to
-	# sleep for some time.
-	start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
-	[ "$?" = 2 ] && return 2
-	return "$RETVAL"
-}
-
-
-case "$1" in
-  start)
-    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC " "$NAME"
-    do_start
-    case "$?" in
-		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
-		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
-	esac
-  ;;
-  stop)
-	[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
-	do_stop
-	case "$?" in
-		0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
-		2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
-	esac
-	;;
-  status)
-       status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
-       ;;
-  #reload|force-reload)
-	#
-	# If do_reload() is not implemented then leave this commented out
-	# and leave 'force-reload' as an alias for 'restart'.
-	#
-	#log_daemon_msg "Reloading $DESC" "$NAME"
-	#do_reload
-	#log_end_msg $?
-	#;;
-  restart|force-reload)
-	#
-	# If the "reload" option is implemented then remove the
-	# 'force-reload' alias
-	#
-	log_daemon_msg "Restarting $DESC" "$NAME"
-	do_stop
-	case "$?" in
-	  0|1)
-		do_start
-		case "$?" in
-			0) log_end_msg 0 ;;
-			1) log_end_msg 1 ;; # Old process is still running
-			*) log_end_msg 1 ;; # Failed to start
-		esac
-		;;
-	  *)
-	  	# Failed to stop
-		log_end_msg 1
-		;;
-	esac
-	;;
-  *)
-	#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
-	echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
-	exit 3
-	;;
-esac
-
-:
diff --git a/debian/compctl.service b/debian/compctl.service
new file mode 100644
index 0000000..55c6b8f
--- /dev/null
+++ b/debian/compctl.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Computations under control - control daemon
+After=network.target
+ConditionPathExists=!/etc/compctl-unlimited
+
+[Service]
+ExecStart=/usr/sbin/compctld
+
+[Install]
+WantedBy=multi-user.target
diff --git a/debian/dirs b/debian/dirs
index 101d7da..1948002 100644
--- a/debian/dirs
+++ b/debian/dirs
@@ -1,5 +1,4 @@
 usr/bin
 usr/sbin
-etc/init.d
 usr/share/man/man1
 usr/share/doc/compctl
-- 
GitLab