[PATCH] wpa_supplicant: send a dbus reply only if requested by the caller

Dan Williams dcbw
Mon Feb 9 09:33:35 PST 2009


On Mon, 2009-02-09 at 17:32 +0100, Helmut Schaa wrote:
> Am Montag, 9. Februar 2009 schrieb Dan Williams:
> > On Mon, 2009-02-09 at 17:12 +0100, Helmut Schaa wrote:
> > > wpa_supplicant should not send a dbus reply as response to a method call if
> > > no reply was requested by the caller. Sending a reply even if not requested
> > > is basically no problem but triggers dbus warnings like the one below.
> > > 
> > > Feb  9 07:31:23 linux-gvjr dbus-daemon: Rejected send message, 2 matched rules;
> > > type="error", sender=":1.129" (uid=0 pid=30228 comm="/usr/sbin/wpa_supplicant
> > > -c /etc/wpa_supplicant/wp") interface="(unset)" member="(unset)" error
> > > name="fi.epitest.hostap.WPASupplicant.InvalidInterface" requested_reply=0
> > > destination=":1.128" (uid=0 pid=30226 comm="/usr/sbin/NetworkManager "))
> > 
> > Seems fine to me; upstream dbus devs recommend that language bindings
> > handle the no-reply bits themselves, but of course since we're not using
> > bindings here 
> 
> Exactly.
> 
> > (since wpa_supplicant itself can't link to glib or qt or 
> > whatever) it's got to be done manually.
> > 
> > Marcel and I have talked about implementing a replacement dbus interface
> > that would also support introspection;
> 
> Introspection would be indeed cool.
> 
> > which would probably fix many of 
> > these warnings.
> 
> Agreed.
> 
> > Might be a good time to start using a dbus helper 
> > library too.
> 
> Do you have something in mind already?

Not at this time; I'm not aware of a slightly higher-level C binding on
top of libdbus that doesn't use a mainloop we can link wpa_supplicant
to.  We actually don't want anything that uses an external mainloop,
because we'd need to use eloop internally.  Some nice things to make
easier: dict handling, object creation/registration, multiple interfaces
implemented by the same object, introspection based on what methods an
object supports, etc.  Maybe something like:

dbus_ctx = cdbus_context_create(DBUS_BUS_SYSTEM);
cdbus_context_register_bus_name(dbus_ctx, "fi.w1.Supplicant");

...

obj = cdbus_object_new (dbus_ctx, "/fi/w1/Supplicant");
cdbus_object_register_method(obj,
                             "fi.w1.Supplicant",
                             "DoSomething",
                             "b", /* return value */
                             "uua{sv}", /* arguments */
                             wpas_dbus_do_something,
                             <user data>);

obj2 = cdbus_object_new (dbus_ctx, "/fi/w1/Supplicant/Network/1");
cdbus_object_register_property(obj2,
                               "fi.w1.Supplicant.Network",
                               "Ssid",
                               "ay", /* signature */
                               wpas_dbus_network_get_ssid,
                               <user data>);

cdbus_object_register_signal(obj2,
                             "fi.w1.Supplicant.Network",
                             "Event",
                             "u");

...

DBusMessage *msg;
msg = cdbus_object_new_signal(obj2, "fi.w1.Supplicant.Network", "Event");
/* add arguments here with dbus_message_append */
cdbus_object_emit_signal(obj2, msg);

that sort of thing.

Dan





More information about the Hostap mailing list