From: Simon McVittie Date: Wed, 18 May 2022 15:13:36 +0000 (+0100) Subject: build: Show a warning if the system bus socket is not interoperable X-Git-Tag: dbus-1.15.4~32^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e5d8d0c19ad932dad44b3302c90ba692d3a9017a;p=thirdparty%2Fdbus.git build: Show a warning if the system bus socket is not interoperable 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 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 28017a4ec..6996f61e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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") diff --git a/Makefile.am b/Makefile.am index ae2d648db..81f3c91ed 100644 --- a/Makefile.am +++ b/Makefile.am @@ -37,6 +37,7 @@ EXTRA_DIST = \ test/CMakeLists.txt \ test/name-test/CMakeLists.txt \ tools/CMakeLists.txt \ + tools/check-runstatedir.sh \ cmake \ $(NULL) diff --git a/configure.ac b/configure.ac index 3abbafc5a..ca7043443 100644 --- a/configure.ac +++ b/configure.ac @@ -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]) diff --git a/meson.build b/meson.build index 20e9dbc6d..caaaccf20 100644 --- a/meson.build +++ b/meson.build @@ -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 index 000000000..75eb713d5 --- /dev/null +++ b/tools/check-runstatedir.sh @@ -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