int sd_netlink_message_read_u32(sd_netlink_message *m, unsigned short type, uint32_t *data) { void *attr_data; bool net_byteorder; int r; assert_return(m, -EINVAL); r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_U32); if (r < 0) return r; r = netlink_message_read_internal(m, type, &attr_data, &net_byteorder); if (r < 0) return r; else if ((size_t)r < sizeof(uint32_t)) return -EIO; if (data) { if (net_byteorder) *data = be32toh(*(uint32_t *) attr_data); else *data = *(uint32_t *) attr_data; } return 0; }
int sd_netlink_message_append_string(sd_netlink_message *m, unsigned short type, const char *data) { size_t length, size; int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(data, -EINVAL); r = message_attribute_has_type(m, &size, type, NETLINK_TYPE_STRING); if (r < 0) return r; if (size) { length = strnlen(data, size+1); if (length > size) return -EINVAL; } else length = strlen(data); r = add_rtattr(m, type, data, length + 1); if (r < 0) return r; return 0; }
int sd_rtnl_message_open_container(sd_rtnl_message *m, unsigned short type) { size_t size; int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(m->n_containers < RTNL_CONTAINER_DEPTH, -ERANGE); r = message_attribute_has_type(m, type, NLA_NESTED); if (r < 0) return r; else size = (size_t)r; r = type_system_get_type_system(m->container_type_system[m->n_containers], &m->container_type_system[m->n_containers + 1], type); if (r < 0) return r; r = add_rtattr(m, type | NLA_F_NESTED, NULL, size); if (r < 0) return r; m->container_offsets[m->n_containers ++] = r; return 0; }
int sd_netlink_message_open_container(sd_netlink_message *m, unsigned short type) { size_t size; int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(m->n_containers < RTNL_CONTAINER_DEPTH, -ERANGE); r = message_attribute_has_type(m, &size, type, NETLINK_TYPE_NESTED); if (r < 0) { const NLTypeSystemUnion *type_system_union; int family; r = message_attribute_has_type(m, &size, type, NETLINK_TYPE_UNION); if (r < 0) return r; r = sd_rtnl_message_get_family(m, &family); if (r < 0) return r; r = type_system_get_type_system_union(m->containers[m->n_containers].type_system, &type_system_union, type); if (r < 0) return r; r = type_system_union_protocol_get_type_system(type_system_union, &m->containers[m->n_containers + 1].type_system, family); if (r < 0) return r; } else { r = type_system_get_type_system(m->containers[m->n_containers].type_system, &m->containers[m->n_containers + 1].type_system, type); if (r < 0) return r; } r = add_rtattr(m, type | NLA_F_NESTED, NULL, size); if (r < 0) return r; m->containers[m->n_containers ++].offset = r; return 0; }
int sd_netlink_message_append_u32(sd_netlink_message *m, unsigned short type, uint32_t data) { int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_U32); if (r < 0) return r; r = add_rtattr(m, type, &data, sizeof(uint32_t)); if (r < 0) return r; return 0; }
int sd_rtnl_message_append_u16(sd_rtnl_message *m, unsigned short type, uint16_t data) { int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); r = message_attribute_has_type(m, type, NLA_U16); if (r < 0) return r; r = add_rtattr(m, type, &data, sizeof(uint16_t)); if (r < 0) return r; return 0; }
int sd_netlink_message_append_cache_info(sd_netlink_message *m, unsigned short type, const struct ifa_cacheinfo *info) { int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(info, -EINVAL); r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_CACHE_INFO); if (r < 0) return r; r = add_rtattr(m, type, info, sizeof(struct ifa_cacheinfo)); if (r < 0) return r; return 0; }
int sd_netlink_message_append_ether_addr(sd_netlink_message *m, unsigned short type, const struct ether_addr *data) { int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(data, -EINVAL); r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_ETHER_ADDR); if (r < 0) return r; r = add_rtattr(m, type, data, ETH_ALEN); if (r < 0) return r; return 0; }
int sd_rtnl_message_append_in6_addr(sd_rtnl_message *m, unsigned short type, const struct in6_addr *data) { int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); assert_return(data, -EINVAL); r = message_attribute_has_type(m, type, NLA_IN_ADDR); if (r < 0) return r; r = add_rtattr(m, type, data, sizeof(struct in6_addr)); if (r < 0) return r; return 0; }
int sd_netlink_message_append_flag(sd_netlink_message *m, unsigned short type) { size_t size; int r; assert_return(m, -EINVAL); assert_return(!m->sealed, -EPERM); r = message_attribute_has_type(m, &size, type, NETLINK_TYPE_FLAG); if (r < 0) return r; r = add_rtattr(m, type, NULL, 0); if (r < 0) return r; return 0; }
int sd_rtnl_message_read_string(sd_rtnl_message *m, unsigned short type, const char **data) { int r; void *attr_data; r = message_attribute_has_type(m, type, NLA_STRING); if (r < 0) return r; r = rtnl_message_read_internal(m, type, &attr_data); if (r < 0) return r; else if (strnlen(attr_data, r) >= (size_t) r) return -EIO; *data = (const char *) attr_data; return 0; }
int sd_rtnl_message_read_u32(sd_rtnl_message *m, unsigned short type, uint32_t *data) { int r; void *attr_data; r = message_attribute_has_type(m, type, NLA_U32); if (r < 0) return r; r = rtnl_message_read_internal(m, type, &attr_data); if (r < 0) return r; else if ((size_t)r < sizeof(uint32_t)) return -EIO; *data = *(uint32_t *) attr_data; return 0; }
int sd_rtnl_message_read_cache_info(sd_rtnl_message *m, unsigned short type, struct ifa_cacheinfo *info) { int r; void *attr_data; r = message_attribute_has_type(m, type, NLA_CACHE_INFO); if (r < 0) return r; r = rtnl_message_read_internal(m, type, &attr_data); if (r < 0) return r; else if ((size_t)r < sizeof(struct ifa_cacheinfo)) return -EIO; memcpy(info, attr_data, sizeof(struct ifa_cacheinfo)); return 0; }
int sd_rtnl_message_read_in6_addr(sd_rtnl_message *m, unsigned short type, struct in6_addr *data) { int r; void *attr_data; r = message_attribute_has_type(m, type, NLA_IN_ADDR); if (r < 0) return r; r = rtnl_message_read_internal(m, type, &attr_data); if (r < 0) return r; else if ((size_t)r < sizeof(struct in6_addr)) return -EIO; memcpy(data, attr_data, sizeof(struct in6_addr)); return 0; }
int sd_netlink_message_read_in6_addr(sd_netlink_message *m, unsigned short type, struct in6_addr *data) { int r; void *attr_data; assert_return(m, -EINVAL); r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_IN_ADDR); if (r < 0) return r; r = netlink_message_read_internal(m, type, &attr_data, NULL); if (r < 0) return r; else if ((size_t)r < sizeof(struct in6_addr)) return -EIO; if (data) memcpy(data, attr_data, sizeof(struct in6_addr)); return 0; }
int sd_netlink_message_read_cache_info(sd_netlink_message *m, unsigned short type, struct ifa_cacheinfo *info) { int r; void *attr_data; assert_return(m, -EINVAL); r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_CACHE_INFO); if (r < 0) return r; r = netlink_message_read_internal(m, type, &attr_data, NULL); if (r < 0) return r; else if ((size_t)r < sizeof(struct ifa_cacheinfo)) return -EIO; if (info) memcpy(info, attr_data, sizeof(struct ifa_cacheinfo)); return 0; }
int sd_netlink_message_read_u8(sd_netlink_message *m, unsigned short type, uint8_t *data) { int r; void *attr_data; assert_return(m, -EINVAL); r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_U8); if (r < 0) return r; r = netlink_message_read_internal(m, type, &attr_data, NULL); if (r < 0) return r; else if ((size_t) r < sizeof(uint8_t)) return -EIO; if (data) *data = *(uint8_t *) attr_data; return 0; }
int sd_netlink_message_read_string(sd_netlink_message *m, unsigned short type, const char **data) { int r; void *attr_data; assert_return(m, -EINVAL); r = message_attribute_has_type(m, NULL, type, NETLINK_TYPE_STRING); if (r < 0) return r; r = netlink_message_read_internal(m, type, &attr_data, NULL); if (r < 0) return r; else if (strnlen(attr_data, r) >= (size_t) r) return -EIO; if (data) *data = (const char *) attr_data; return 0; }