X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-rtnl%2Frtnl-message.c;h=8d62df965a199500925939abc22f4ec5fbddeafd;hp=b2b7feb3c86bd376bb9911c86be32ad59a4f78bd;hb=50b3c42f971f4c9c7791c3b2831f6146ebd15e06;hpb=46fabae6b33386277f5ee394cf0d5382376586da diff --git a/src/libsystemd-rtnl/rtnl-message.c b/src/libsystemd-rtnl/rtnl-message.c index b2b7feb3c..8d62df965 100644 --- a/src/libsystemd-rtnl/rtnl-message.c +++ b/src/libsystemd-rtnl/rtnl-message.c @@ -127,7 +127,7 @@ int sd_rtnl_message_route_new(uint16_t nlmsg_type, unsigned char rtm_family, return 0; } -int sd_rtnl_message_link_new(uint16_t nlmsg_type, int index, unsigned int type, unsigned int flags, sd_rtnl_message **ret) { +int sd_rtnl_message_link_new(uint16_t nlmsg_type, int index, unsigned type, unsigned flags, sd_rtnl_message **ret) { struct ifinfomsg *ifi; int r; @@ -222,6 +222,21 @@ int sd_rtnl_message_link_get_ifindex(sd_rtnl_message *m, int *ifindex) { return 0; } +int sd_rtnl_message_link_get_flags(sd_rtnl_message *m, unsigned *flags) { + struct ifinfomsg *ifi; + + assert_return(m, -EINVAL); + assert_return(flags, -EINVAL); + assert_return(m->hdr->nlmsg_type == RTM_NEWLINK || m->hdr->nlmsg_type == RTM_DELLINK || + m->hdr->nlmsg_type == RTM_GETLINK || m->hdr->nlmsg_type == RTM_SETLINK, -EINVAL); + + ifi = NLMSG_DATA(m->hdr); + + *flags = ifi->ifi_flags; + + return 0; +} + /* If successful the updated message will be correctly aligned, if unsuccessful the old message is untouched */ static int add_rtattr(sd_rtnl_message *m, unsigned short type, const void *data, size_t data_length) { @@ -615,8 +630,8 @@ int socket_read_message(sd_rtnl *nl, sd_rtnl_message **ret) { else if ((size_t) k < sizeof(struct nlmsghdr) || (size_t) k < m->hdr->nlmsg_len) k = -EIO; /* too small (we do accept too big though) */ - else if (m->hdr->nlmsg_pid != nl->sockaddr.nl.nl_pid) - k = 0; /* not for us */ + else if (m->hdr->nlmsg_pid && m->hdr->nlmsg_pid != nl->sockaddr.nl.nl_pid) + k = 0; /* not broadcast and not for us */ if (k > 0) switch (m->hdr->nlmsg_type) {