X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-rtnl%2Frtnl-message.c;h=8c20b8e7655eb44346a08c9baa38ba6d8a37eb31;hb=12e0f830f592ec4c6bb49ac7ae1e0e84f74105e3;hp=15e3247aca90dff62178320b78a8c3d7f5647664;hpb=818dc5e72af8a3eb772997188e2bd8ea616de844;p=elogind.git diff --git a/src/libsystemd/sd-rtnl/rtnl-message.c b/src/libsystemd/sd-rtnl/rtnl-message.c index 15e3247ac..8c20b8e76 100644 --- a/src/libsystemd/sd-rtnl/rtnl-message.c +++ b/src/libsystemd/sd-rtnl/rtnl-message.c @@ -27,6 +27,7 @@ #include "util.h" #include "refcnt.h" +#include "missing.h" #include "sd-rtnl.h" #include "rtnl-util.h" @@ -37,7 +38,7 @@ #define UPDATE_RTA(m, new) (m)->next_rta_offset = (uint8_t*)(new) - (uint8_t*)(m)->hdr; #define PUSH_CONTAINER(m, new) (m)->container_offsets[(m)->n_containers ++] = (uint8_t*)(new) - (uint8_t*)(m)->hdr; -int message_new(sd_rtnl_message **ret, size_t initial_size) { +int message_new(sd_rtnl *rtnl, sd_rtnl_message **ret, size_t initial_size) { sd_rtnl_message *m; assert_return(ret, -EINVAL); @@ -58,6 +59,9 @@ int message_new(sd_rtnl_message **ret, size_t initial_size) { m->hdr->nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; m->sealed = false; + if (rtnl) + m->rtnl = sd_rtnl_ref(rtnl); + *ret = m; return 0; @@ -81,8 +85,8 @@ int sd_rtnl_message_route_set_dst_prefixlen(sd_rtnl_message *m, unsigned char pr return 0; } -int sd_rtnl_message_new_route(uint16_t nlmsg_type, unsigned char rtm_family, - sd_rtnl_message **ret) { +int sd_rtnl_message_new_route(sd_rtnl *rtnl, sd_rtnl_message **ret, + uint16_t nlmsg_type, unsigned char rtm_family) { struct rtmsg *rtm; int r; @@ -90,7 +94,7 @@ int sd_rtnl_message_new_route(uint16_t nlmsg_type, unsigned char rtm_family, assert_return(rtm_family == AF_INET || rtm_family == AF_INET6, -EINVAL); assert_return(ret, -EINVAL); - r = message_new(ret, NLMSG_SPACE(sizeof(struct rtmsg))); + r = message_new(rtnl, ret, NLMSG_SPACE(sizeof(struct rtmsg))); if (r < 0) return r; @@ -142,15 +146,17 @@ int sd_rtnl_message_link_set_type(sd_rtnl_message *m, unsigned type) { return 0; } -int sd_rtnl_message_new_link(uint16_t nlmsg_type, int index, sd_rtnl_message **ret) { +int sd_rtnl_message_new_link(sd_rtnl *rtnl, sd_rtnl_message **ret, + uint16_t nlmsg_type, int index) { struct ifinfomsg *ifi; int r; assert_return(rtnl_message_type_is_link(nlmsg_type), -EINVAL); - assert_return(nlmsg_type == RTM_NEWLINK || index > 0, -EINVAL); + assert_return(nlmsg_type == RTM_NEWLINK || + nlmsg_type == RTM_SETLINK || index > 0, -EINVAL); assert_return(ret, -EINVAL); - r = message_new(ret, NLMSG_SPACE(sizeof(struct ifinfomsg))); + r = message_new(rtnl, ret, NLMSG_SPACE(sizeof(struct ifinfomsg))); if (r < 0) return r; @@ -215,8 +221,9 @@ int sd_rtnl_message_addr_set_scope(sd_rtnl_message *m, unsigned char scope) { return 0; } -int sd_rtnl_message_new_addr(uint16_t nlmsg_type, int index, unsigned char family, - sd_rtnl_message **ret) { +int sd_rtnl_message_new_addr(sd_rtnl *rtnl, sd_rtnl_message **ret, + uint16_t nlmsg_type, int index, + unsigned char family) { struct ifaddrmsg *ifa; int r; @@ -225,7 +232,7 @@ int sd_rtnl_message_new_addr(uint16_t nlmsg_type, int index, unsigned char famil assert_return(family == AF_INET || family == AF_INET6, -EINVAL); assert_return(ret, -EINVAL); - r = message_new(ret, NLMSG_SPACE(sizeof(struct ifaddrmsg))); + r = message_new(rtnl, ret, NLMSG_SPACE(sizeof(struct ifaddrmsg))); if (r < 0) return r; @@ -257,6 +264,7 @@ sd_rtnl_message *sd_rtnl_message_ref(sd_rtnl_message *m) { sd_rtnl_message *sd_rtnl_message_unref(sd_rtnl_message *m) { if (m && REFCNT_DEC(m->n_ref) <= 0) { + sd_rtnl_unref(m->rtnl); free(m->hdr); free(m); } @@ -896,7 +904,7 @@ int socket_read_message(sd_rtnl *nl, sd_rtnl_message **ret) { if (r < 0) return r; - r = message_new(&m, need); + r = message_new(nl, &m, need); if (r < 0) return r;