答复: The dbus_message_has_interface method r eturn false, my service can't start, please h elp!
刘铁罡 <liutiegang-/1jvY0umbYJWk0Htik3J/[email protected]>
| Newsgroups | gmane.comp.freedesktop.dbus |
|---|---|
| Message-ID | <[email protected]> |
Dear all, Attached is my session.conf file. Thanks. Tiegang 发件人: 刘铁罡 发送时间: 2017年2月27日 15:02 收件人: '[email protected]' 主题: The dbus_message_has_interface method return false, my service can't start, please help! Dear all, I am investigating on DBUS porting on QNX. DBus-daemon can be run now. And then I download the dbus-example.c on http://www.matthew.ath.cx/misc/dbus. Compile and run dbus_example_g. My running steps are: 1. #DBUS_VERSION=1 dbus-daemon --print-address --config-file=/home/test/dbus/share/dbus-1/session.conf --nofork & 2. #export DBUS_SESSION_BUS_ADDRESS=unix:path=/home/test/dbus/temp/dbus-WmaQFMvqxD,guid=7a9055f9b14393e3276108b958b3b792 3. #./dbus_example_g receive In daemon process, I got the null connection, I debug into the source code, find the following clue, please see the red lines. dbus_message_has_interface (DBusMessage *message, const char *iface) { const char *msg_interface; msg_interface = dbus_message_get_interface (message); // msg_interface is Org.freedesktop.dbus.local, but iface is org.freedesktop.dbus.peer if (msg_interface == NULL) { if (iface == NULL) { return TRUE; } else { return FALSE; } } if (iface == NULL) { return FALSE; } if (strcmp (msg_interface, iface) == 0) //org.freedesktop.dbus.local!=org.freedesktop.dbus.peer return TRUE; return FALSE; } So static DBusHandlerResult _dbus_connection_peer_filter_unlocked_no_update (DBusConnection *connection, DBusMessage *message) { …… if (!dbus_message_has_interface (message, DBUS_INTERFACE_PEER)) { return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; //quit, so the following Ping and GetMachineId can’t be run! } …… if (dbus_message_is_method_call (message, DBUS_INTERFACE_PEER, "Ping")) { …… } else if (dbus_message_is_method_call (message, DBUS_INTERFACE_PEER, "GetMachineId")) { …… } Any help will be appreciated. Thanks! Tiegang _______________________________________________ dbus mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dbus
session.conf
(application/octet-stream, 5.1 KB)
<!-- This configuration file controls the per-user-login-session message bus.
Add a session-local.conf and edit that rather than changing this
file directly. -->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<!-- Our well-known bus type, don't change this -->
<type>session</type>
<!-- If we fork, keep the user's original umask to avoid affecting
the behavior of child processes. -->
<keep_umask/>
<listen>unix:tmpdir=/home/test/dbus/temp</listen>
<!-- On Unix systems, the most secure authentication mechanism is
EXTERNAL, which uses credential-passing over Unix sockets.
This authentication mechanism is not available on Windows,
is not suitable for use with the tcp: or nonce-tcp: transports,
and will not work on obscure flavours of Unix that do not have
a supported credentials-passing mechanism. On those platforms/transports,
comment out the <auth> element to allow fallback to DBUS_COOKIE_SHA1. -->
<auth>EXTERNAL</auth>
<standard_session_servicedirs />
<policy context="default">
<!-- All users can connect to session bus -->
<allow user="*"/>
<!-- Signals and reply messages (method returns, errors) are allowed
by default -->
<allow send_type="signal"/>
<allow send_requested_reply="true" send_type="method_return"/>
<allow send_requested_reply="true" send_type="error"/>
<!-- All messages may be received by default -->
<allow receive_type="method_call"/>
<allow receive_type="method_return"/>
<allow receive_type="error"/>
<allow receive_type="signal"/>
<!-- Allow anyone to talk to the message bus -->
<allow send_destination="org.freedesktop.DBus"
send_interface="org.freedesktop.DBus" />
<allow send_destination="org.freedesktop.DBus"
send_interface="org.freedesktop.DBus.Introspectable"/>
<!-- But disallow some specific bus services -->
</policy>
<!-- Only systemd, which runs as root, may report activation failures. -->
<policy user="root">
<allow send_destination="org.freedesktop.DBus"
send_interface="org.freedesktop.DBus"/>
</policy>
<policy user="root">
<allow send_destination="org.freedesktop.DBus"
send_interface="org.freedesktop.systemd1.Activator"/>
</policy>
<!-- root may monitor the system bus. -->
<policy user="root">
<allow send_destination="org.freedesktop.DBus"
send_interface="org.freedesktop.DBus.Monitoring"/>
</policy>
<!-- If the Stats interface was enabled at compile-time, root may use it.
Copy this into system.local.conf or system.d/*.conf if you want to
enable other privileged users to view statistics and debug info -->
<policy user="root">
<allow send_destination="org.freedesktop.DBus"
send_interface="org.freedesktop.DBus.Debug.Stats"/>
</policy>
<!-- Include legacy configuration location -->
<include ignore_missing="yes">/home/test/dbus/etc/dbus-1/session.conf</include>
<!-- Config files are placed here that among other things,
further restrict the above policy for specific services. -->
<includedir>session.d</includedir>
<includedir>/home/test/dbus/etc/dbus-1/session.d</includedir>
<!-- This is included last so local configuration can override what's
in this standard file -->
<include ignore_missing="yes">/home/test/dbus/etc/dbus-1/session-local.conf</include>
<include if_selinux_enabled="yes" selinux_root_relative="yes">contexts/dbus_contexts</include>
<!-- For the session bus, override the default relatively-low limits
with essentially infinite limits, since the bus is just running
as the user anyway, using up bus resources is not something we need
to worry about. In some cases, we do set the limits lower than
"all available memory" if exceeding the limit is almost certainly a bug,
having the bus enforce a limit is nicer than a huge memory leak. But the
intent is that these limits should never be hit. -->
<!-- the memory limits are 1G instead of say 4G because they can't exceed 32-bit signed int max -->
<limit name="max_incoming_bytes">1000000000</limit>
<limit name="max_incoming_unix_fds">250000000</limit>
<limit name="max_outgoing_bytes">1000000000</limit>
<limit name="max_outgoing_unix_fds">250000000</limit>
<limit name="max_message_size">1000000000</limit>
<!-- We do not override max_message_unix_fds here since the in-kernel
limit is also relatively low -->
<limit name="service_start_timeout">120000</limit>
<limit name="auth_timeout">240000</limit>
<limit name="pending_fd_timeout">150000</limit>
<limit name="max_completed_connections">100000</limit>
<limit name="max_incomplete_connections">10000</limit>
<limit name="max_connections_per_user">100000</limit>
<limit name="max_pending_service_starts">10000</limit>
<limit name="max_names_per_connection">50000</limit>
<limit name="max_match_rules_per_connection">50000</limit>
<limit name="max_replies_per_connection">50000</limit>
</busconfig>