- memset(&iov, 0, sizeof(iov));
- iov.iov_base = &nlreq;
- iov.iov_len = sizeof(nlreq);
-
- memset(&msg, 0, sizeof(msg));
- msg.msg_name = &nladdr;
- msg.msg_namelen = sizeof(nladdr);
- msg.msg_iov = &iov;
- msg.msg_iovlen = 1;
-
- if (sendmsg(rtnl_fd, &msg, 0) < 0) {
- error("get_ppp_stats_rtnetlink: sendmsg(RTM_GETSTATS): %m (line %d)", __LINE__);
- goto err;
- }
-
- /* We just need to repoint to IOV ... everything else stays the same */
- iov.iov_base = &nlresp;
- iov.iov_len = sizeof(nlresp);
-
- nlresplen = recvmsg(rtnl_fd, &msg, 0);
-
- if (nlresplen < 0) {
- error("get_ppp_stats_rtnetlink: recvmsg(RTM_GETSTATS): %m (line %d)", __LINE__);
- goto err;
- }
-
- if (nlresplen < sizeof(nlresp.nlh)) {
- error("get_ppp_stats_rtnetlink: Netlink response message was incomplete (line %d)", __LINE__);
- goto err;
- }
-
- if (nlresp.nlh.nlmsg_type == NLMSG_ERROR) {
- if (nlresplen < offsetof(struct nlresp, __end_err))
- error("get_ppp_stats_rtnetlink: Netlink responded with an error message, but the nlmsgerr structure is incomplete (line %d).", __LINE__);
- else if (kernel_version >= KVERSION(4,7,0))
- error("get_ppp_stats_rtnetlink: Netlink responded with error: %s (line %d)", strerror(-nlresp.nlerr.error), __LINE__);
- goto err;
- }
-
- if (nlresp.nlh.nlmsg_type != RTM_NEWSTATS) {
- error("get_ppp_stats_rtnetlink: Expected RTM_NEWSTATS response, found something else (mlmsg_type %d, line %d)",
- nlresp.nlh.nlmsg_type, __LINE__);
- goto err;
+ nlresp_size = sizeof(nlresp_data);
+ resp = rtnetlink_msg("RTM_GETSTATS/NLM_F_REQUEST", &fd, &nlreq, sizeof(nlreq), &nlresp_data, &nlresp_size, RTM_NEWSTATS);
+ if (resp) {
+ errno = (resp < 0) ? -resp : EINVAL;
+ if (kernel_version >= KVERSION(4,7,0))
+ error("get_ppp_stats_rtnetlink: %m (line %d)", __LINE__);
+ goto err;