<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Dec 29, 2016 at 8:44 AM, Erik Falor <span dir="ltr"><<a href="mailto:ewfalor@gmail.com" target="_blank">ewfalor@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I wish to use sd-bus to query upowerd for my battery's remaining percentage. I<br>
have begun by adapting the example program from Lennart's blog post introducing<br>
the sd-bus API:<br>
<br>
        <a href="http://0pointer.net/blog/the-new-sd-bus-api-of-systemd.html" rel="noreferrer" target="_blank">http://0pointer.net/blog/the-<wbr>new-sd-bus-api-of-systemd.html</a><br>
<br>
However, I cannot succeed in adapting it to my needs. I can read the value of<br>
the Percentage property with<br>
<br>
        $ busctl introspect org.freedesktop.UPower /org/freedesktop/UPower/<wbr>devices/battery_BAT0<br>
<br>
This shows me that the Percentage is a double value, and that the Get() method<br>
of the org.freedesktop.DBus.<wbr>Properties interface returns a variant value.<br>
<br>
I can also retrieve the desired datum with busctl:<br>
<br>
        $ busctl call org.freedesktop.UPower               \<br>
                /org/freedesktop/UPower/<wbr>devices/battery_BAT0   \<br>
                org.freedesktop.DBus.<wbr>Properties Get            \<br>
                ss org.freedesktop.UPower.Device Percentage<br>
<br>
I can make the equivalent method call using the sd-bus API from the C program,<br>
but the program errors out at the call to sd_bus_message_read().<br>
<br>
When I tell sd_bus_message_read() that my message is of variant type "v", it<br>
fails with -EINVAL. When I instead give it "d", it fails with -ENXIO.<br>
<br>
What does sd_bus_message_read() expect in the 2nd argument? Or am I doing<br>
something else wrong?<br></blockquote><div><br></div><div>variant is a "container" type – you must first call sd_bus_message_enter_container() before you can access the inner value:</div><div><br></div><div>    sd_bus_message_enter_container(m, 'v', "d");</div><div>    sd_bus_message_read(m, "d", &out);</div><div><br></div><div>For convenience you also have sd_bus_get_property() which even does the method call for you.</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>