Hey On Thu, Apr 20, 2017 at 12:06 PM, David Härdeman <da...@hardeman.nu> wrote: > Hi, > > I'm implementing a server which creates an ObjectManager using the > sd-bus API and there seems to be some differences between how gdbus and > sd-bus implements the API. > > I implemented a simple ObjectManager at /org/gnome/TestManager which > exports objects /org/gnome/TestManager/fooX with interface > org.gnome.TestManager.Device. > > Under sd-bus, if an object is removed, the following signal is > generated: > > signal time=1492642227.714223 sender=:1.104 -> destination=(null destination) > serial=90 path=/org/gnome/TestManager; > interface=org.freedesktop.DBus.ObjectManager; > member=InterfacesRemoved > object path "/org/gnome/TestManager/foo0" > array [ > string "org.freedesktop.DBus.Peer" > string "org.freedesktop.DBus.Introspectable" > string "org.freedesktop.DBus.Properties" > string "org.freedesktop.DBus.ObjectManager" > string "org.gnome.TestManager.Device" > ] > > If I implement the same simple server in gdbus, the signal is instead: > > signal time=1492642227.714223 sender=:1.104 -> destination=(null destination) > serial=90 path=/org/gnome/TestManager; > interface=org.freedesktop.DBus.ObjectManager; > member=InterfacesRemoved > object path "/org/gnome/TestManager/foo0" > array [ > string "org.gnome.TestManager.Device" > ] > > The corresponding signals are also generated when an object is added. > > Beside simply being different, this difference seems to confuse gdbus. > If I create a test client, it will report that any object which is > already existing when I start the client has 1 interface and any object > which is added/removed subsequently is reported as having 5 interfaces, > 4 of which are nameless (this would appear to be one or more gdbus > bug(s)). > > This bug in gdbus also means that it doesn't correctly catch the removal > of an object which existed at the time the client was started (because > of the interface count mismatch). > > Anyway, gdbus bugs aside, it seems that the interfaces reported by > sd-bus should match what gdbus does? (assuming, of course, that gdbus > can be considered the "reference" implementation).
Does the appended patch fix your issue? (line-breaks might be screwed, sorry) Thanks David diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c index 9bd07ffca..b6f5afe1b 100644 --- a/src/libsystemd/sd-bus/bus-objects.c +++ b/src/libsystemd/sd-bus/bus-objects.c @@ -1057,6 +1057,22 @@ static int object_manager_serialize_path( if (r < 0) return r; + r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.Peer", 0); + if (r < 0) + return r; + + r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.Introspectable", 0); + if (r < 0) + return r; + + r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.Properties", 0); + if (r < 0) + return r; + + r = sd_bus_message_append(reply, "{sa{sv}}", "org.freedesktop.DBus.ObjectManager", 0); + if (r < 0) + return r; + found_something = true; } _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel