[systemd-devel] sd-bus example code for SetLinkDNS()

Tilman Baumann tilman at baumann.name
Wed Jul 19 09:20:53 UTC 2017


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


More information about the systemd-devel mailing list