1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-02 10:51:20 +03:00

sd-rtnl: message - allow checking for attributes without reading out their contents

This commit is contained in:
Tom Gundersen 2014-12-02 00:59:02 +01:00
parent dae4de9d42
commit 73ae2b7dad

View File

@ -830,6 +830,8 @@ int sd_rtnl_message_read_string(sd_rtnl_message *m, unsigned short type, const c
int r;
void *attr_data;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, type, NLA_STRING);
if (r < 0)
return r;
@ -840,7 +842,8 @@ int sd_rtnl_message_read_string(sd_rtnl_message *m, unsigned short type, const c
else if (strnlen(attr_data, r) >= (size_t) r)
return -EIO;
*data = (const char *) attr_data;
if (data)
*data = (const char *) attr_data;
return 0;
}
@ -849,6 +852,8 @@ int sd_rtnl_message_read_u8(sd_rtnl_message *m, unsigned short type, uint8_t *da
int r;
void *attr_data;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, type, NLA_U8);
if (r < 0)
return r;
@ -859,7 +864,8 @@ int sd_rtnl_message_read_u8(sd_rtnl_message *m, unsigned short type, uint8_t *da
else if ((size_t) r < sizeof(uint8_t))
return -EIO;
*data = *(uint8_t *) attr_data;
if (data)
*data = *(uint8_t *) attr_data;
return 0;
}
@ -868,6 +874,8 @@ int sd_rtnl_message_read_u16(sd_rtnl_message *m, unsigned short type, uint16_t *
int r;
void *attr_data;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, type, NLA_U16);
if (r < 0)
return r;
@ -878,7 +886,8 @@ int sd_rtnl_message_read_u16(sd_rtnl_message *m, unsigned short type, uint16_t *
else if ((size_t) r < sizeof(uint16_t))
return -EIO;
*data = *(uint16_t *) attr_data;
if (data)
*data = *(uint16_t *) attr_data;
return 0;
}
@ -887,6 +896,8 @@ int sd_rtnl_message_read_u32(sd_rtnl_message *m, unsigned short type, uint32_t *
int r;
void *attr_data;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, type, NLA_U32);
if (r < 0)
return r;
@ -897,7 +908,8 @@ int sd_rtnl_message_read_u32(sd_rtnl_message *m, unsigned short type, uint32_t *
else if ((size_t)r < sizeof(uint32_t))
return -EIO;
*data = *(uint32_t *) attr_data;
if (data)
*data = *(uint32_t *) attr_data;
return 0;
}
@ -906,6 +918,8 @@ int sd_rtnl_message_read_ether_addr(sd_rtnl_message *m, unsigned short type, str
int r;
void *attr_data;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, type, NLA_ETHER_ADDR);
if (r < 0)
return r;
@ -916,7 +930,8 @@ int sd_rtnl_message_read_ether_addr(sd_rtnl_message *m, unsigned short type, str
else if ((size_t)r < sizeof(struct ether_addr))
return -EIO;
memcpy(data, attr_data, sizeof(struct ether_addr));
if (data)
memcpy(data, attr_data, sizeof(struct ether_addr));
return 0;
}
@ -925,6 +940,8 @@ int sd_rtnl_message_read_cache_info(sd_rtnl_message *m, unsigned short type, str
int r;
void *attr_data;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, type, NLA_CACHE_INFO);
if (r < 0)
return r;
@ -935,7 +952,8 @@ int sd_rtnl_message_read_cache_info(sd_rtnl_message *m, unsigned short type, str
else if ((size_t)r < sizeof(struct ifa_cacheinfo))
return -EIO;
memcpy(info, attr_data, sizeof(struct ifa_cacheinfo));
if (info)
memcpy(info, attr_data, sizeof(struct ifa_cacheinfo));
return 0;
}
@ -944,6 +962,8 @@ int sd_rtnl_message_read_in_addr(sd_rtnl_message *m, unsigned short type, struct
int r;
void *attr_data;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, type, NLA_IN_ADDR);
if (r < 0)
return r;
@ -954,7 +974,8 @@ int sd_rtnl_message_read_in_addr(sd_rtnl_message *m, unsigned short type, struct
else if ((size_t)r < sizeof(struct in_addr))
return -EIO;
memcpy(data, attr_data, sizeof(struct in_addr));
if (data)
memcpy(data, attr_data, sizeof(struct in_addr));
return 0;
}
@ -963,6 +984,8 @@ int sd_rtnl_message_read_in6_addr(sd_rtnl_message *m, unsigned short type, struc
int r;
void *attr_data;
assert_return(m, -EINVAL);
r = message_attribute_has_type(m, type, NLA_IN_ADDR);
if (r < 0)
return r;
@ -973,7 +996,8 @@ int sd_rtnl_message_read_in6_addr(sd_rtnl_message *m, unsigned short type, struc
else if ((size_t)r < sizeof(struct in6_addr))
return -EIO;
memcpy(data, attr_data, sizeof(struct in6_addr));
if (data)
memcpy(data, attr_data, sizeof(struct in6_addr));
return 0;
}