-int sd_rtnl_message_read(sd_rtnl_message *m, unsigned short *type, void **data) {
- uint16_t rtm_type;
- int r;
-
- assert_return(m, -EINVAL);
- assert_return(data, -EINVAL);
-
- r = sd_rtnl_message_get_type(m, &rtm_type);
- if (r < 0)
- return r;
-
- switch (rtm_type) {
- case RTM_NEWLINK:
- case RTM_SETLINK:
- case RTM_DELLINK:
- case RTM_GETLINK:
- if (!m->next_rta) {
- struct ifinfomsg *ifi = NLMSG_DATA(m->hdr);
-
- m->next_rta = IFLA_RTA(ifi);
- m->remaining_size = IFLA_PAYLOAD(m->hdr);
- }
- break;
- case RTM_NEWADDR:
- case RTM_DELADDR:
- case RTM_GETADDR:
- if (!m->next_rta) {
- struct ifaddrmsg *ifa = NLMSG_DATA(m->hdr);
-
- m->next_rta = IFA_RTA(ifa);
- m->remaining_size = IFA_PAYLOAD(m->hdr);
- }
- break;
- case RTM_NEWROUTE:
- case RTM_DELROUTE:
- case RTM_GETROUTE:
- if (!m->next_rta) {
- struct rtmesg *rtm = NLMSG_DATA(m->hdr);
-
- m->next_rta = RTM_RTA(rtm);
- m->remaining_size = RTM_PAYLOAD(m->hdr);
- }
- break;
- default:
- return -ENOTSUP;
- }
-
- return message_read(m, type, data);
-}
-