-#define SEQ 4711
-
-static int read_reply(int fd, struct address **list, unsigned *n_list) {
- ssize_t bytes;
- struct cmsghdr *cmsg;
- struct ucred *ucred;
- struct nlmsghdr *p;
- uint8_t cred_buffer[CMSG_SPACE(sizeof(struct ucred))];
- struct {
- struct nlmsghdr hdr;
- struct ifaddrmsg ifaddrmsg;
- uint8_t payload[16*1024];
- } resp;
- struct iovec iov = {
- .iov_base = &resp,
- .iov_len = sizeof(resp),
- };
- struct msghdr msg = {
- .msg_name = NULL,
- .msg_namelen = 0,
- .msg_iov = &iov,
- .msg_iovlen = 1,
- .msg_control = cred_buffer,
- .msg_controllen = sizeof(cred_buffer),
- .msg_flags = 0,
- };
-
- assert(fd >= 0);
- assert(list);
-
- bytes = recvmsg(fd, &msg, 0);
- if (bytes < 0)
- return -errno;
-
- cmsg = CMSG_FIRSTHDR(&msg);
- if (!cmsg || cmsg->cmsg_type != SCM_CREDENTIALS)
- return -EIO;
-
- ucred = (struct ucred*) CMSG_DATA(cmsg);
- if (ucred->uid != 0 || ucred->pid != 0)
- return 0;
-
- for (p = &resp.hdr; bytes > 0; p = NLMSG_NEXT(p, bytes)) {
- struct ifaddrmsg *ifaddrmsg;
- struct rtattr *a;
- size_t l;
- void *local = NULL, *address = NULL;
-
- if (!NLMSG_OK(p, (size_t) bytes))
- return -EIO;
-
- if (p->nlmsg_seq != SEQ)
- continue;
-
- if (p->nlmsg_type == NLMSG_DONE)
- return 1;
+int ifconf_acquire_addresses(struct address **_list, unsigned *_n_list) {
+ _cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
+ _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
+ sd_rtnl_message *m;
+ _cleanup_free_ struct address *list = NULL;
+ struct address *new_list = NULL;
+ unsigned n_list = 0;
+ int r;