dbus示例 - on_name_acquired之后的on_name_lost

时间:2018-04-17 11:22:55

标签: c dbus

我能够使用dbus作为客户端,但如果我编译https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-server.c 在调用on_name_lost回调之后调用on_name_acquired回调。 我做的唯一更改是我使用G_BUS_TYPE_SYSTEM而不是G_BUS_TYPE_SESSION

我只是猜测这是一些身份验证问题。

1 个答案:

答案 0 :(得分:0)

与会话总线不同,系统总线具有安全策略,可防止任意进程在总线上声明任意已知名称。您需要为系统总线安装configuration file以允许您的服务拥有一个名称:

  

a时检查具有ownown_prefix属性的规则   连接尝试拥有一个众所周知的总线名称。作为一个特例,   own="*"匹配任何知名的公交车名称。着名的会话巴士   通常允许任何连接拥有任何名称,而众所周知   系统总线通常不允许任何连接拥有任何名称,   除非进一步配置允许。系统服务   将拥有一个名称必须安装允许他们这样做的配置,   通常通过<policy user="some-system-user"><allow own="…"/></policy>形式的规则。

这意味着在/usr/share/dbus-1/system.d/org.mydomain.MyService1.conf

中安装如下配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE busconfig PUBLIC
 "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <!-- Only my-service-user can own the service -->
  <policy user="my-service-user">
    <allow own="org.mydomain.MyService1"/>
  </policy>

  <!-- Anyone can send messages to the service -->
  <policy context="default">
    <allow send_destination="org.mydomain.MyService1"/>
  </policy>
</busconfig>

然后,您必须以my-service-user用户身份运行服务流程。

D-Bus API design tutorial section on security policies是相关阅读。