]> nmode's Git Repositories - signal-cli/commitdiff
Shut down when dbus daemon connection goes away unexpectedly
authorAsamK <asamk@gmx.de>
Sun, 29 Jun 2025 09:21:31 +0000 (11:21 +0200)
committerAsamK <asamk@gmx.de>
Sun, 29 Jun 2025 09:22:30 +0000 (11:22 +0200)
Fixes #1800

src/main/java/org/asamk/signal/dbus/DbusHandler.java

index b6799de741900e42a0bf3abbf26d8998992f3b40..2ed6d11fdf3d307bec4fdba5b6c4a725991783c8 100644 (file)
@@ -1,17 +1,21 @@
 package org.asamk.signal.dbus;
 
 import org.asamk.signal.DbusConfig;
 package org.asamk.signal.dbus;
 
 import org.asamk.signal.DbusConfig;
+import org.asamk.signal.Shutdown;
 import org.asamk.signal.commands.exceptions.CommandException;
 import org.asamk.signal.commands.exceptions.CommandException;
+import org.asamk.signal.commands.exceptions.IOErrorException;
 import org.asamk.signal.commands.exceptions.UnexpectedErrorException;
 import org.asamk.signal.commands.exceptions.UserErrorException;
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.manager.MultiAccountManager;
 import org.asamk.signal.commands.exceptions.UnexpectedErrorException;
 import org.asamk.signal.commands.exceptions.UserErrorException;
 import org.asamk.signal.manager.Manager;
 import org.asamk.signal.manager.MultiAccountManager;
+import org.freedesktop.dbus.connections.IDisconnectCallback;
 import org.freedesktop.dbus.connections.impl.DBusConnection;
 import org.freedesktop.dbus.connections.impl.DBusConnectionBuilder;
 import org.freedesktop.dbus.exceptions.DBusException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.freedesktop.dbus.connections.impl.DBusConnection;
 import org.freedesktop.dbus.connections.impl.DBusConnectionBuilder;
 import org.freedesktop.dbus.exceptions.DBusException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
 import java.util.ArrayList;
 import java.util.List;
 
@@ -94,7 +98,9 @@ public class DbusHandler implements AutoCloseable {
         final var busType = isDbusSystem ? DBusConnection.DBusBusType.SYSTEM : DBusConnection.DBusBusType.SESSION;
         logger.debug("Starting DBus server on {} bus: {}", busType, busname);
         try {
         final var busType = isDbusSystem ? DBusConnection.DBusBusType.SYSTEM : DBusConnection.DBusBusType.SESSION;
         logger.debug("Starting DBus server on {} bus: {}", busType, busname);
         try {
-            dBusConnection = DBusConnectionBuilder.forType(busType).build();
+            dBusConnection = DBusConnectionBuilder.forType(busType)
+                    .withDisconnectCallback(new DisconnectCallback())
+                    .build();
             dbusRunner.run(dBusConnection);
         } catch (DBusException e) {
             throw new UnexpectedErrorException("Dbus command failed: " + e.getMessage(), e);
             dbusRunner.run(dBusConnection);
         } catch (DBusException e) {
             throw new UnexpectedErrorException("Dbus command failed: " + e.getMessage(), e);
@@ -141,4 +147,13 @@ public class DbusHandler implements AutoCloseable {
 
         void run(DBusConnection connection) throws DBusException;
     }
 
         void run(DBusConnection connection) throws DBusException;
     }
+
+    private static final class DisconnectCallback implements IDisconnectCallback {
+
+        @Override
+        public void disconnectOnError(IOException ex) {
+            logger.debug("DBus daemon disconnected unexpectedly, shutting down");
+            Shutdown.triggerShutdown(new IOErrorException("Unexpected dbus daemon disconnect", ex));
+        }
+    }
 }
 }