<p dir="ltr">First, are you actually switching your bus connection to monitor mode? In kdbus (and probably even in future DBus) there is a distinct monitor mode which must be enabled to capture other peers' bus traffic. Adding a match is not enough for that.</p>
<p dir="ltr">Second, your approach won't work anyway. There *won't be* method_calls for services that are started as dependencies, there won't be method calls for socket-activated services, there won't be method calls for DBus-activated services, there probably won't be even a single Start call during the entire boot process. Systemd won't bother calling itself over DBus for that.</p>
<p dir="ltr">Instead, why not use the *signals* that systemd sends, for exactly such purposes? You'll need to call Subscribe() to enable them.</p>
<p dir="ltr">See also what Plymouth does for its splash screen.</p>

<br><div class="gmail_quote"><div dir="ltr">On Tue, Jun 30, 2015, 12:15 Thomas Schmidt <<a href="mailto:t.schmidt@md-network.de" target="_blank">t.schmidt@md-network.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
for an embedded project I’m implementing a bootsplash application which should as well display service names are starting.<br>
This is based on kdbus and uses the sd-bus API to communicate with systemd (for example boot process percentage property is polled).<br>
Now I try to monitor the kdbus (system bus) to capture the events which indicate that a service was started. (works very well for testing with "busctl monitor“ tool).<br>
I assumed that the method_call „StartUnit“ would be a good indicator, so I tried to monitor for those messages by using following code (shortened and only significant parts copied here):<br>
<br>
-.-.-.-.-.-.-.-.-.-.-. schnipp -.-.-.-.-.-.-.-.-.-.-<br>
<br>
r = sd_bus_open_system(&bus);<br>
…<br>
r = sd_bus_add_match(bus, NULL, "", do_something_callback,  NULL); /* should not filter anything, I expect it triggers on any message */<br>
…<br>
<br>
for (;;) {<br>
        sd_bus_message *m = NULL;<br>
<br>
                r = sd_bus_process(bus, &m);<br>
                if (r < 0) {<br>
                        fprintf(stderr, "Failed to process bus: %s\n", strerror(-r));<br>
                        goto finish;<br>
                }<br>
<br>
                if (r > 0) /* we processed a request, try to process another one, right-away */<br>
                        continue;<br>
<br>
                /* Wait for the next request to process */<br>
                r = sd_bus_wait(bus, (uint64_t) -1);<br>
                if (r < 0) {<br>
                        fprintf(stderr, "Failed to wait on bus: %s\n", strerror(-r));<br>
                        goto finish;<br>
                }<br>
<br>
}<br>
…<br>
<br>
-.-.-.-.-.-.-.-.-.-.-. schnapp -.-.-.-.-.-.-.-.-.-.-<br>
<br>
The interesting thing is that this code only sees „signal“ type  messages - but not any other like „method_call“.<br>
<br>
I did extensive testing, tried different code variants, for example by processing "sd_bus_message *m“ directly in the for loop with „sd_bus_message_is_method_call“ - but the effect is the same I don’t get „method_call“ as an event.<br>
<br>
Is there any suggestion what could be the reason ? (is that generally the right way what I try here to do ?)<br>
<br>
Many thanks for any feedback which points me to the right direction<br>
Kind Regards<br>
Thomas Schmidt<br>
<br>
<br>
_______________________________________________<br>
systemd-devel mailing list<br>
<a href="mailto:systemd-devel@lists.freedesktop.org" target="_blank">systemd-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/systemd-devel" rel="noreferrer" target="_blank">http://lists.freedesktop.org/mailman/listinfo/systemd-devel</a><br>
</blockquote></div>