chiark / gitweb /
Prep v231.3: Add --with-cgroup-controller=name to configure
authorSven Eden <yamakuzure@gmx.net>
Thu, 29 Jun 2017 09:14:20 +0000 (11:14 +0200)
committerSven Eden <yamakuzure@gmx.net>
Thu, 29 Jun 2017 09:24:50 +0000 (11:24 +0200)
This option can be used, if elogind is built while a different cgroup
controller than planned is active.
A valid scenario could be a gentoo user switching from systemd to
openrc+elogind.

README
configure.ac

diff --git a/README b/README
index 3d323cfb68267f8c9476b33da7e2c9ae832d6106..dabcacb6f697777a211f0c852bc6dbf835f0d4a2 100644 (file)
--- a/README
+++ b/README
@@ -116,6 +116,32 @@ flag.
 
 The PAM module is called pam_elogind.so, not pam_systemd.so.
 
+Elogind and the running cgroup controller
+-----------------------------------------
+While 'configure' runs, it will detect which controller is in place.
+If no controller is in place, configure will determine, that elogind
+should be its own controller, which will be a very limited one.
+
+This approach shoudl generally work, but if you just have no cgroup
+controller in place, yet, or if you are currently switching to
+another one, this approach will fail.
+
+In this case you can do one of the two following things:
+
+ 1) Boot your system with the target init system and cgroup
+    controller, before configuring and building elogind, or
+ 2) Use the --with-cgroup-controller=name option.
+
+Example: If you plan to use openrc, but openrc has not yet booted
+         the machine, you can use
+         --with-cgroup-controller=openrc
+         to let elogind know that openrc will be the controller
+         in charge.
+
+However, if you set the controller at configure time to something
+different than is in place, elogind will not start until that
+controller is actively used as the primary controller.
+
 License
 -------
 
index 563340653ec1a4b039eab02dcbd38285b0a2c311..2848827d0500a6181d768abf61e78196fd6f757f 100644 (file)
@@ -111,20 +111,52 @@ fi
 
 
 # ------------------------------------------------------------------------------
-# Find running cgroup controller
+# Let users set the cgroup controller to use, in case the target controller
+# isn't currently running the show.
+# Example: Gentoo Linux, user wants to switch from systemd to openrc+elogind,
+#          and emerges elogind before having booted the machine with openrc.
+#          See: https://github.com/elogind/elogind/issues/18
 with_cgroupctrl=
-AS_IF(  [test -f /proc/self/cgroup], [
-        # If the init system is a cgroup controler, it will be position 1.
-        # Secondary controllers, like cgmanager, do not work.
-        with_cgroupctrl=`grep "^1:name=" /proc/self/cgroup | cut -d ':' -f 2`
-        AS_IF(  [test -z "$with_cgroupctrl"], [
-                # Try to be our own cgroup controller
-                with_cgroupctrl="name=elogind"
+AC_ARG_WITH([cgroup-controller],
+            AS_HELP_STRING([--with-cgroup-controller=name],
+            [Set the name of the cgroup controller to use.
+             Use this when the autodetection fails, or you plan to use your system with a different controller than the one in place now.
+             The value 'auto' (default) detects the running controller.
+             The values 'none' and 'elogind' will cause elogind to be its own (very limited) controller.
+             When elogind shall be its own controller, there *MUST NOT* be any other controller running!
+             Another popular controller would be 'openrc'.]),
+            [with_cgroupctrl=$withval],
+            [with_cgroupctrl=auto])
+
+# ------------------------------------------------------------------------------
+# Find running cgroup controller, if none was set
+AS_IF(  [test "x$with_cgroupctrl" = "xauto"], [
+        AS_IF([test -f /proc/self/cgroup], [
+                # If the init system is a cgroup controler, it will be position 1.
+                # Secondary controllers, like cgmanager, do not work.
+                with_cgroupctrl=`grep "^1:name=" /proc/self/cgroup | \
+                        sed -n 's/.*=//p' | sed -e 's/:.*$//'`
+                AS_IF(  [test -z "$with_cgroupctrl"], [
+                        # Try to be our own cgroup controller
+                        with_cgroupctrl="elogind"
+                        ])
+        ], [
+                # 'auto' but no cgroup fs is a problem.
+                with_cgroupctrl=""
         ])
 ])
-AS_IF(  [test -z "$with_cgroupctrl"],
-        AC_MSG_ERROR([No running cgroup controller found]))
 
+# If the user specified 'none', switch to 'elogind'.
+# 'none' is allowed, as this means "there is no controller now"
+AS_IF(  [test "x$with_cgroupctrl" = "xnone"], [with_cgroupctrl=elogind])
+
+# If this was not possible, /proc/self/cgroup not mounted yet, and 'auto'
+# chosen, error out.
+AS_IF(  [test -z "$with_cgroupctrl"],
+        AC_MSG_ERROR([No running cgroup controller found]), [
+        # Otherwise add the 'name=' prefix
+        with_cgroupctrl="name=$with_cgroupctrl"
+])
 
 # ------------------------------------------------------------------------------
 address_sanitizer_cflags=