<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, Jan 8, 2016 at 2:37 AM, Gorman, Brian (Vancouver) <span dir="ltr"><<a href="mailto:bgorman@hp.com" target="_blank">bgorman@hp.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">





<div lang="EN-US" link="#0563C1" vlink="#954F72">
<div>
<p class="MsoNormal">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?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">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.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">int main(int argc, char *argv[]) {<u></u><u></u></p>
<p class="MsoNormal">    sd_bus_slot *slot = NULL;<u></u><u></u></p>
<p class="MsoNormal">    sd_bus *bus = NULL;<u></u><u></u></p>
<p class="MsoNormal">    int r;<u></u><u></u></p>
<p class="MsoNormal">    int fd;<u></u><u></u></p>
<p class="MsoNormal">    fd_set rd_fdset;<u></u><u></u></p>
<p class="MsoNormal">    int my_user_data;<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">    /* Connect to the system bus this time */<u></u><u></u></p>
<p class="MsoNormal">    r = sd_bus_open_system(&bus);<u></u><u></u></p>
<p class="MsoNormal">    if (r < 0) {<u></u><u></u></p>
<p class="MsoNormal">        fprintf(stderr, "Failed to connect to bus: %s\n", strerror(-r));<u></u><u></u></p>
<p class="MsoNormal">        goto finish;<u></u><u></u></p>
<p class="MsoNormal">    }<u></u><u></u></p>
<p class="MsoNormal">        r = sd_bus_request_name(bus, "Test.Me", 0);<u></u><u></u></p>
<p class="MsoNormal">        if (r < 0) {<u></u><u></u></p>
<p class="MsoNormal">                fprintf(stderr, "Failed to acquire service name: %s\n", strerror(-r));<u></u><u></u></p>
<p class="MsoNormal">                goto finish;<u></u><u></u></p>
<p class="MsoNormal">        }<u></u><u></u></p>
<p class="MsoNormal">    <u></u><u></u></p>
<p class="MsoNormal">    r = sd_bus_add_match(<u></u><u></u></p>
<p class="MsoNormal">            bus,<u></u><u></u></p>
<p class="MsoNormal">            slot,<u></u><u></u></p>
<p class="MsoNormal">            "type='signal',"<u></u><u></u></p>
<p class="MsoNormal">            "sender='testsignal',"<u></u><u></u></p>
<p class="MsoNormal">            "interface='Japan.Reset',"<u></u><u></u></p>
<p class="MsoNormal">            "member='Test',"<u></u><u></u></p>
<p class="MsoNormal">            "path='/Japan'",<u></u><u></u></p>
<p class="MsoNormal">            my_signal_callback,<u></u><u></u></p>
<p class="MsoNormal">            my_user_data);<u></u><u></u></p>
<p class="MsoNormal">    <u></u><u></u></p>
<p class="MsoNormal">    fd = sd_bus_get_fd(bus);<u></u><u></u></p>
<p class="MsoNormal">    if (fd < 0)<u></u><u></u></p>
<p class="MsoNormal">        assert(0);<u></u><u></u></p>
<p class="MsoNormal">    FD_ZERO(&rd_fdset);<u></u><u></u></p>
<p class="MsoNormal">    FD_SET(fd, &rd_fdset);<u></u><u></u></p>
<p class="MsoNormal">    for (;;) {<u></u><u></u></p>
<p class="MsoNormal" style="text-indent:0.5in">select(fd +1, &rd_fdset, NULL, NULL,NULL);<u></u><u></u></p>
<p class="MsoNormal">            r = sd_bus_process(bus, NULL);<u></u><u></u></p>
<p class="MsoNormal">            if (r < 0) {<u></u><u></u></p>
<p class="MsoNormal">                    fprintf(stderr, "Failed to process bus: %s\n", strerror(-r));<u></u><u></u></p>
<p class="MsoNormal">                    goto finish;<u></u><u></u></p>
<p class="MsoNormal">            }                                                               
<u></u><u></u></p>
<p class="MsoNormal">    }</p></div></div></blockquote><div><br></div><div>You really seem to be intent on using select() rather than an existing event loop or, at least, standard poll(); curious why.</div><div>  </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="#0563C1" vlink="#954F72"><p class="MsoNormal"><u></u></p>
<p class="MsoNormal">From here I was hoping to run something like “dbus-send –system –dest=Test.Me –print-reply /Japan Japan.Reset.Test string:”Hello””</p></div></blockquote><div><br></div><div>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`.</div><div><br></div><div>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).</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="#0563C1" vlink="#954F72"><div>
<p class="MsoNormal">It currently get errors about DBUs complaining that Test.Me was not provided in any .service files when executing the above command.</p></div></div></blockquote><div><br></div><div>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.</div><div><br></div><div>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.)</div><div><br></div><div>For development & debugging, you could use the session bus, which has no such restrictions.</div><div><br></div><div>(That said, I'm not sure why sd_bus_request_name would have succeeded in that case?)</div></div><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Mantas Mikulėnas <<a href="mailto:grawity@gmail.com" target="_blank">grawity@gmail.com</a>></div></div>
</div></div>