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 */ &error, /* object to return error in */ &m, /* 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