检查D-Bus对象是否存在

时间:2017-10-05 10:52:39

标签: c glib dbus gio

我目前正在使用GDBus与ConsoleKit交谈。我使用ConsoleKit2 XML文件和gdbus-codegen来生成代码。一切都很好。但是如何检查对象是否存在?例如,我想看看是否有/org/freedesktop/ConsoleKit/Session2(只是一个例子,我知道我可以枚举Seat对象中的所有Sessions)。

我尝试使用org.freedesktop.DBus.Peer.Ping功能,但会返回

dbus-send --system --print-reply --reply-timeout=2000 --type=method_call --dest=org.freedesktop.DBus /org/freedesktop/ConsoleKit/Seat1  org.freedesktop.DBus.Peer.Ping

Error org.freedesktop.DBus.Error.AccessDenied: Rejected send message, 1 matched rules; type="method_call", sender=":1.168" (uid=1000 pid=18279 comm="dbus-send --system --print-reply --reply-timeout=2") interface="org.freedesktop.DBus.Peer" member="Ping" error name="(unset)" requested_reply="0" destination="org.freedesktop.DBus" (bus)

1 个答案:

答案 0 :(得分:1)

您有多个选项,按照从最优先到最不可取的顺序列出:

  1. 使用GetSessions()枚举座位对象中的所有会话。
  2. 尝试在该会话的对象路径上调用所需的方法,并查看它是否因org.freedesktop.DBus.Error错误而失败。
  3. 调用/org/freedesktop/ConsoleKit上的Introspect()方法并解析生成的XML blob中的<node>元素,以查看当前对象路径层次结构。
  4. 第一个选项可能是最容易实现的,并且您打算如何使用ConsoleKit API。请注意,座位和会话编号不是确定性的,因此您不应该只对代码中的会话对象路径进行硬编码,因为该路径可能会在将来的启动时发生更改。

    另请注意,正如ConsoleKit website所述,不推荐使用ConsoleKit而使用systemd-logind,您应该考虑使用它。