-int sd_rtnl_message_read(sd_rtnl_message *m, unsigned short *type, void **data) {
- size_t remaining_size;
- uint16_t rtm_type;
- int r;
-
- assert_return(m, -EINVAL);
- assert_return(m->sealed, -EPERM);
- assert_return(m->next_rta_offset, -EINVAL);
- assert_return(type, -EINVAL);
- assert_return(data, -EINVAL);
-
- /* only read until the end of the current container */
- if (m->n_containers)
- remaining_size = GET_CONTAINER(m, m->n_containers - 1)->rta_len -
- (m->next_rta_offset -
- m->container_offsets[m->n_containers - 1]);
- else
- remaining_size = m->hdr->nlmsg_len - m->next_rta_offset;
-
- if (!RTA_OK(NEXT_RTA(m), remaining_size))
- return 0;
-
- /* if we read a container, return its type, but do not enter it*/
- r = sd_rtnl_message_get_type(m, &rtm_type);
- if (r < 0)
- return r;
-
- *type = NEXT_RTA(m)->rta_type;
-
- if (rtnl_message_type_is_link(rtm_type) &&
- ((m->n_containers == 0 &&
- NEXT_RTA(m)->rta_type == IFLA_LINKINFO) ||
- (m->n_containers == 1 &&
- GET_CONTAINER(m, 0)->rta_type == IFLA_LINKINFO &&
- NEXT_RTA(m)->rta_type == IFLA_INFO_DATA)))
- *data = NULL;
- else
- *data = RTA_DATA(NEXT_RTA(m));
-
- UPDATE_RTA(m, RTA_NEXT(NEXT_RTA(m), remaining_size));
-
- return 1;
-}
-