Re: [systemd-devel] sd-bus example code for SetLinkDNS()
On 21.07.2017 14:44, Tilman Baumann wrote: > On 21.07.2017 14:35, Lennart Poettering wrote: >> On Wed, 19.07.17 11:20, Tilman Baumann (til...@baumann.name) wrote: >> > >> My guess is that I can have it easier if I somehow use >>> sd_bus_message_append() to assemble the message. But I don't see a clear >>> path either. >> >> You have to do something like this: >> >> sd_bus_message_new_method(..., ); >> sd_bus_message_append(m, "i", ifindex); >> sd_bus_message_open_container(m, 'a', '(iay)'); >> for (i = 0; i < n_addresses; i++) { >> sd_bus_message_open_container(m, '(', "iay")); >> sd_bus_message_append(m, "i", addresses[i].sin_family); >> sd_bus_message_append_array(m, 'y', [i].ip_addr, >> sizeof(addresses[i].ip_addr)); >> sd_bus_message_close_container(m); >> } >> sd_bus_message_close_container(m); >> sd_bus_message_send(..., m); >> sd_bus_message_unref(m); And here the working solution for the permanent record. r = sd_bus_message_new_method_call( bus, , "org.freedesktop.resolve1", "/org/freedesktop/resolve1", "org.freedesktop.resolve1.Manager", "SetLinkDNS"); r = sd_bus_message_append(m, "i", if_index); r = sd_bus_message_open_container(m, 'a', "(iay)"); for (int i = 0; i < addresses_size; i++) { fprintf(stderr, "server %d\n", i); r = sd_bus_message_open_container(m, 'r', "iay"); r = sd_bus_message_append(m, "i", addresses[i].sin_family); r = sd_bus_message_append_array(m, 'y', [i].ip_addr, sizeof(addresses[i].ip_addr)); r = sd_bus_message_close_container(m); } r = sd_bus_message_close_container(m); r = sd_bus_call(bus, m, 0, , ); ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] sd-bus example code for SetLinkDNS()
On 21.07.2017 14:35, Lennart Poettering wrote: > On Wed, 19.07.17 11:20, Tilman Baumann (til...@baumann.name) wrote: > >> My guess is that I can have it easier if I somehow use >> sd_bus_message_append() to assemble the message. But I don't see a clear >> path either. > > You have to do something like this: > > sd_bus_message_new_method(..., ); > sd_bus_message_append(m, "i", ifindex); > sd_bus_message_open_container(m, 'a', '(iay)'); > for (i = 0; i < n_addresses; i++) { > sd_bus_message_open_container(m, '(', "iay")); > sd_bus_message_append(m, "i", addresses[i].sin_family); > sd_bus_message_append_array(m, 'y', [i].ip_addr, > sizeof(addresses[i].ip_addr)); > sd_bus_message_close_container(m); > } > sd_bus_message_close_container(m); > sd_bus_message_send(..., m); > sd_bus_message_unref(m); > > (not tested, just written down from the top of my head, and of course, > don't forget to add proper error checking) Phantastic, thanks Lennart ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] sd-bus example code for SetLinkDNS()
On Wed, 19.07.17 11:20, Tilman Baumann (til...@baumann.name) wrote: > Hi folks, > > I'm trying to teach a vpn software (openfortivpn) how to properly set up > DNS in a systemd-resolve environment. > > I'm trying to set up a equivalent to this in C. > busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 > org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' 16 2 2 4 10 10 10 > 10 2 4 10 10 10 11 > [https://gist.github.com/tbaumann/d484efb2e27613654a52dbe11cfe53b8] > > I came up with this quick proof of concept code based on the example > code in the sd-bus docu. > Of course it segfaults. No surprise, I have done nothing to hint at the > length of the inner byte array. (ay) > > I was unable to find any example code that would give me a hint on how > to pass such more complex data structures into sd_bus_call_method() > > int SetLinkDNSv4(sd_bus *bus, int if_index, struct in_addr ns1, struct > in_addr ns2) { > sd_bus_error error = SD_BUS_ERROR_NULL; > sd_bus_message *m = NULL; > int r; > struct dns_address { > int sin_family; > struct in_addr ip_addr; > }; > struct dns_address addresses[2]; > > > addresses[0].sin_family = AF_INET; > addresses[0].ip_addr = ns1; > addresses[1].sin_family = AF_INET; > addresses[1].ip_addr = ns2; > > r = sd_bus_call_method(bus, > "org.freedesktop.resolve1", /* > service to contact */ > "/org/freedesktop/resolve1", /* object > path */ > "org.freedesktop.resolve1.Manager", /* > interface name */ > "SetLinkDNS", /* method > name */ > , /* object > to return error in */ > , /* return > message on success */ > "ia(iay)",/* input > signature */ > if_index, > 2,/* Array > size */ > addresses); > } > > [Full code: > https://gist.github.com/tbaumann/0f466c984c858767c966458d53483697] > > My guess is that I can have it easier if I somehow use > sd_bus_message_append() to assemble the message. But I don't see a clear > path either. You have to do something like this: sd_bus_message_new_method(..., ); sd_bus_message_append(m, "i", ifindex); sd_bus_message_open_container(m, 'a', '(iay)'); for (i = 0; i < n_addresses; i++) { sd_bus_message_open_container(m, '(', "iay")); sd_bus_message_append(m, "i", addresses[i].sin_family); sd_bus_message_append_array(m, 'y', [i].ip_addr, sizeof(addresses[i].ip_addr)); sd_bus_message_close_container(m); } sd_bus_message_close_container(m); sd_bus_message_send(..., m); sd_bus_message_unref(m); (not tested, just written down from the top of my head, and of course, don't forget to add proper error checking) Lennart -- Lennart Poettering, Red Hat ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel
Re: [systemd-devel] sd-bus example code for SetLinkDNS()
Any hint? I would be happy to just see some similar code that deals with arrays of complex structures. If I see a example that is similar, I'm sure I can learn from it. So if anybody knows of a code example that does that... Thanks On 19.07.2017 11:20, Tilman Baumann wrote: > Hi folks, > > I'm trying to teach a vpn software (openfortivpn) how to properly set up > DNS in a systemd-resolve environment. > > I'm trying to set up a equivalent to this in C. > busctl call org.freedesktop.resolve1 /org/freedesktop/resolve1 > org.freedesktop.resolve1.Manager SetLinkDNS 'ia(iay)' 16 2 2 4 10 10 10 > 10 2 4 10 10 10 11 > [https://gist.github.com/tbaumann/d484efb2e27613654a52dbe11cfe53b8] > > I came up with this quick proof of concept code based on the example > code in the sd-bus docu. > Of course it segfaults. No surprise, I have done nothing to hint at the > length of the inner byte array. (ay) > > I was unable to find any example code that would give me a hint on how > to pass such more complex data structures into sd_bus_call_method() > > int SetLinkDNSv4(sd_bus *bus, int if_index, struct in_addr ns1, struct > in_addr ns2) { > sd_bus_error error = SD_BUS_ERROR_NULL; > sd_bus_message *m = NULL; > int r; > struct dns_address { > int sin_family; > struct in_addr ip_addr; > }; > struct dns_address addresses[2]; > > > addresses[0].sin_family = AF_INET; > addresses[0].ip_addr = ns1; > addresses[1].sin_family = AF_INET; > addresses[1].ip_addr = ns2; > > r = sd_bus_call_method(bus, > "org.freedesktop.resolve1", /* > service to contact */ > "/org/freedesktop/resolve1", /* object > path */ > "org.freedesktop.resolve1.Manager", /* > interface name */ > "SetLinkDNS", /* method > name */ > , /* object > to return error in */ > , /* return > message on success */ > "ia(iay)",/* input > signature */ > if_index, > 2,/* Array > size */ > addresses); > } > > [Full code: > https://gist.github.com/tbaumann/0f466c984c858767c966458d53483697] > > My guess is that I can have it easier if I somehow use > sd_bus_message_append() to assemble the message. But I don't see a clear > path either. > > Also, the length of the array can be one or two. So that bit is variable > too. > > Thanks for any hints > Tilman Baumann > ___ > systemd-devel mailing list > systemd-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/systemd-devel > ___ systemd-devel mailing list systemd-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/systemd-devel