[systemd-devel] Multicast signaling with sd-bus questions

Mantas Mikulėnas grawity at gmail.com
Thu Jan 7 22:36:01 PST 2016


On Fri, Jan 8, 2016 at 2:37 AM, Gorman, Brian (Vancouver) <bgorman at hp.com>
wrote:

> Hi all, I am in the process of considering using sd-bus to coordinate a
> system-wide multicast messaging system between daemons. At this time I only
> have resources to look into using libsystemd without system running. It
> seems the sd-bus documentation is very sparse compared to sd-event – does
> this mean sd-bus is more immature?
>
>
>
> My initial goal is to be able to select() on dbus-signals. Unfortunately
> my dbus experience is quite minimal, and I am not sure what this will take.
> Here is my initial attempt adapted from Lennarts tutorial – I have no idea
> if this is the right approach I was hoping if this list could perhaps
> provide some guidance as I suspect I am doing a few things wrong.
>
>
>
> int main(int argc, char *argv[]) {
>
>     sd_bus_slot *slot = NULL;
>
>     sd_bus *bus = NULL;
>
>     int r;
>
>     int fd;
>
>     fd_set rd_fdset;
>
>     int my_user_data;
>
>
>
>     /* Connect to the system bus this time */
>
>     r = sd_bus_open_system(&bus);
>
>     if (r < 0) {
>
>         fprintf(stderr, "Failed to connect to bus: %s\n", strerror(-r));
>
>         goto finish;
>
>     }
>
>         r = sd_bus_request_name(bus, "Test.Me", 0);
>
>         if (r < 0) {
>
>                 fprintf(stderr, "Failed to acquire service name: %s\n",
> strerror(-r));
>
>                 goto finish;
>
>         }
>
>
>
>     r = sd_bus_add_match(
>
>             bus,
>
>             slot,
>
>             "type='signal',"
>
>             "sender='testsignal',"
>
>             "interface='Japan.Reset',"
>
>             "member='Test',"
>
>             "path='/Japan'",
>
>             my_signal_callback,
>
>             my_user_data);
>
>
>
>     fd = sd_bus_get_fd(bus);
>
>     if (fd < 0)
>
>         assert(0);
>
>     FD_ZERO(&rd_fdset);
>
>     FD_SET(fd, &rd_fdset);
>
>     for (;;) {
>
> select(fd +1, &rd_fdset, NULL, NULL,NULL);
>
>             r = sd_bus_process(bus, NULL);
>
>             if (r < 0) {
>
>                     fprintf(stderr, "Failed to process bus: %s\n",
> strerror(-r));
>
>                     goto finish;
>
>
> }
>
>     }
>

You really seem to be intent on using select() rather than an existing
event loop or, at least, standard poll(); curious why.


> From here I was hoping to run something like “dbus-send –system
> –dest=Test.Me –print-reply /Japan Japan.Reset.Test string:”Hello””
>

You're sending a method call here, not a signal. (And signals wouldn't have
a reply to --print; that's the main difference from methods.) Try
`dbus-send --type=signal` or `gdbus emit`.

Also, the 'sender' field is always a bus name (not sure but I think it's
always the unique ":1.x" name), so "sender='testsignal'," would never match
dbus-send (or anything at all).

It currently get errors about DBUs complaining that Test.Me was not
> provided in any .service files when executing the above command.
>

It says that because there's no connection who has claimed the "Test.Me"
bus name, so dbus-daemon is trying to auto-start the apropriate daemon. On
the system bus, AFAIK, the default policy only allows whitelisted names to
be claimed, and usually only by root.

See the various dbus-daemon config drop-ins at /etc/dbus-1/system.d/, for
example. (Many of them also try to whitelist the available method calls at
dbus-daemon level, although that's not required – some services check
credentials manually or use polkit.)

For development & debugging, you could use the session bus, which has no
such restrictions.

(That said, I'm not sure why sd_bus_request_name would have succeeded in
that case?)

-- 
Mantas Mikulėnas <grawity at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/systemd-devel/attachments/20160108/6bb7cd51/attachment-0001.html>


More information about the systemd-devel mailing list