]> git.ipfire.org Git - thirdparty/dbus.git/commitdiff
build: Show a warning if the system bus socket is not interoperable
authorSimon McVittie <smcv@collabora.com>
Wed, 18 May 2022 15:13:36 +0000 (16:13 +0100)
committerSimon McVittie <smcv@collabora.com>
Tue, 11 Oct 2022 16:14:11 +0000 (17:14 +0100)
We would like to start using ${runstatedir}/dbus/system_bus_socket,
so that distributors who make /var/run a symbolic link to /run will
usually get their dbus-daemon listening on /run/dbus/system_bus_socket,
which has some advantages in corner cases, such as when /var is mediated
by an automounter or is unmounted during system shutdown.

Unfortunately, the interoperable path in the D-Bus Specification is
/var/run/dbus/system_bus_socket for historical reasons (D-Bus is older
than /run), and older versions of Slackware are known to have had /run
and /var/run as distinct directories. Do a check during configuration
to catch systems configured like this and show a warning.

When cross-compiling, this assumes that the system where dbus is built
(the build system in Autotools/Meson, or the "host" in CMake terminology)
has its /var/run and /run set up in a way that is compatible with the
system where dbus will run (the host system in Autotools/Meson, or the
"target" in CMake terminology). This is not 100% correct, but seems good
enough for a warning that will hopefully only trigger for misguided OS
distributors.

Signed-off-by: Simon McVittie <smcv@collabora.com>
CMakeLists.txt
Makefile.am
configure.ac
meson.build
tools/check-runstatedir.sh [new file with mode: 0755]

index 28017a4ec72f00d813b91bb4a8bb95e2c5bf87de..6996f61e62a15d3f0aa3dccd59253d14f65f5a8a 100644 (file)
@@ -599,6 +599,18 @@ set(DBUS_SYSTEM_PID_FILE ${DBUS_RUNSTATEDIR}/dbus/pid)
 # address.
 set(DBUS_SYSTEM_BUS_DEFAULT_ADDRESS "unix:path=${DBUS_RUNSTATEDIR}/dbus/system_bus_socket" CACHE STRING "system bus default address")
 
+# This check assumes that the disposition of /run and /var/run on the
+# system where we're building is the same as on the system we're building
+# for, so we can't usefully do this check if we're building for Windows,
+# or if we're cross-building for Unix on a Windows machine.
+#
+# The check is shared between Autotools and CMake.
+# Because we only run it on Unix, it's fine to make it a shell script.
+if(UNIX AND (NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows"))
+    execute_process(
+        COMMAND "${CMAKE_SOURCE_DIR}/tools/check-runstatedir.sh" "${DBUS_RUNSTATEDIR}/dbus/system_bus_socket")
+endif()
+
 if(WIN32)
     set(DBUS_SESSION_BUS_LISTEN_ADDRESS "autolaunch:" CACHE STRING "session bus default listening address")
     set(DBUS_SESSION_BUS_CONNECT_ADDRESS "autolaunch:" CACHE STRING "session bus fallback address for clients")
index ae2d648dbe60394e6d998b5ae9d73cc1a5a15132..81f3c91ed67e4d216a8f9f7b922c603982538565 100644 (file)
@@ -37,6 +37,7 @@ EXTRA_DIST =                  \
        test/CMakeLists.txt \
        test/name-test/CMakeLists.txt \
        tools/CMakeLists.txt \
+       tools/check-runstatedir.sh \
        cmake \
        $(NULL)
 
index 3abbafc5ad66c7e1bda211014f9b366c762968b8..ca7043443e2b0b3d94125af62d57c76981c9f024 100644 (file)
@@ -1340,6 +1340,10 @@ AS_IF([! test -z "$with_system_socket"],
    DBUS_SYSTEM_SOCKET=${EXPANDED_LOCALSTATEDIR}/run/dbus/system_bus_socket
    ])
 
+dnl The actual check script is shared between Autotools and CMake.
+AS_IF([test "$dbus_win" != yes],
+    [${CONFIG_SHELL-/bin/sh} "${srcdir}/tools/check-runstatedir.sh" "$DBUS_SYSTEM_SOCKET"])
+
 AC_SUBST(DBUS_SYSTEM_SOCKET)
 AC_DEFINE_UNQUOTED(DBUS_SYSTEM_SOCKET,"$DBUS_SYSTEM_SOCKET",[The name of the socket the system bus listens on by default])
 
index 20e9dbc6d53d53c1521a43c42ae94e5cd3b655cf..caaaccf20780f7dbd0492ec794d5ab5c18e01257 100644 (file)
@@ -831,6 +831,25 @@ if system_socket == ''
         /'run'/'dbus'/'system_bus_socket'
     )
 endif
+
+# This check assumes that the disposition of /run and /var/run on the
+# system where we're building is the same as on the system we're building
+# for, so we can't usefully do this check if we're building for Windows,
+# or if we're cross-building for Unix on a Windows machine.
+#
+# The check is shared between Autotools, CMake and Meson.
+# Because we only run it on Unix, it's fine to make it a shell script.
+if platform_unix and build_machine.system() != 'windows'
+    msg = run_command(
+        find_program('tools/check-runstatedir.sh'),
+        system_socket,
+        check: false,
+    ).stdout()
+    if msg != ''
+        warning(msg)
+    endif
+endif
+
 data_config.set('DBUS_SYSTEM_SOCKET', system_socket)
 
 ## System bus only listens on local domain sockets, and never
diff --git a/tools/check-runstatedir.sh b/tools/check-runstatedir.sh
new file mode 100755 (executable)
index 0000000..75eb713
--- /dev/null
@@ -0,0 +1,77 @@
+#!/bin/sh
+# Copyright 2022 Collabora Ltd.
+# SPDX-License-Identifier: MIT
+
+# Usage: check-runstatedir.sh /run/dbus/system_bus_socket
+
+set -e
+set -u
+
+same_file () {
+    # Many shells implement test -ef (test whether two names point to
+    # the same file), but POSIX doesn't require it, so fall back to
+    # comparing realpath output if necessary. We prefer test -ef if
+    # available, since it does the right thing for bind-mounts, not just
+    # symlinks
+    if test / -ef / 2>/dev/null; then
+        test  "$1" -ef "$2"
+    else
+        test "$(realpath "$1")" = "$(realpath "$2")"
+    fi
+}
+
+if [ -e /run ] && [ -e /var/run ] && ! same_file /run /var/run; then
+    echo
+    echo "WARNING: /run and /var/run are not the same directory."
+    echo "| Tools that do not agree on whether a socket is in /run or in"
+    echo "| /var/run will fail to interoperate."
+    echo "| Ask your OS distributor to make these two directories equivalent"
+    echo "| via a symbolic link or bind mount: there is no useful reason to"
+    echo "| make them different."
+    echo
+fi
+
+system_socket="$1"
+
+case "$system_socket" in
+    (/run/dbus/system_bus_socket)
+        # --with-system-socket=/run/dbus/system_bus_socket
+        if ! same_file /run /var/run; then
+            echo
+            echo "WARNING: system bus socket: /run/dbus/system_bus_socket"
+            echo "| The system bus has been configured to listen on"
+            echo "| /run/dbus/system_bus_socket, but /run is not the same"
+            echo "| as /var/run on this system."
+            echo "|"
+            echo "| Most D-Bus implementations will expect to find the D-Bus"
+            echo "| system bus socket at /var/run/dbus/system_bus_socket."
+            echo "| Consider creating a symbolic link."
+            echo
+        fi
+        ;;
+
+    (/var/run/dbus/system_bus_socket)
+        # e.g. --localstatedir=/var
+        if ! same_file /run /var/run; then
+            echo
+            echo "NOTE: system bus socket: /var/run/dbus/system_bus_socket"
+            echo "| The system bus has been configured to listen on"
+            echo "| /var/run/dbus/system_bus_socket, but /run is not the same"
+            echo "| as /var/run on this system."
+            echo "|"
+            echo "| Some D-Bus implementations might expect to find the"
+            echo "| D-Bus system bus socket at /run/dbus/system_bus_socket."
+            echo "| Consider creating a symbolic link."
+            echo
+        fi
+        ;;
+
+    (*)
+        # e.g. --prefix=/opt/dbus
+        echo
+        echo "NOTE: system bus listens on $system_socket"
+        echo "| This build of dbus will not interoperate with the well-known"
+        echo "| system bus socket, /var/run/dbus/system_bus_socket."
+        echo
+        ;;
+esac