X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-rtnl%2Frtnl-message.c;h=56fb68f39d0dd55d730555f37336c8a185a21823;hp=fca1ff667af6e6fe8b85e48955b30051aaf01d40;hb=a212d0dadd1e5e7bc0a57b8dfe2feb9111db2678;hpb=4e9e7f1836b0c8f612f2beb3447d6144f9244d26 diff --git a/src/libsystemd/sd-rtnl/rtnl-message.c b/src/libsystemd/sd-rtnl/rtnl-message.c index fca1ff667..56fb68f39 100644 --- a/src/libsystemd/sd-rtnl/rtnl-message.c +++ b/src/libsystemd/sd-rtnl/rtnl-message.c @@ -166,8 +166,7 @@ int sd_rtnl_message_new_link(sd_rtnl *rtnl, sd_rtnl_message **ret, int r; assert_return(rtnl_message_type_is_link(nlmsg_type), -EINVAL); - assert_return(nlmsg_type == RTM_NEWLINK || - nlmsg_type == RTM_SETLINK || index > 0, -EINVAL); + assert_return(nlmsg_type != RTM_DELLINK || index > 0, -EINVAL); assert_return(ret, -EINVAL); r = message_new(rtnl, ret, NLMSG_SPACE(sizeof(struct ifinfomsg))); @@ -177,7 +176,7 @@ int sd_rtnl_message_new_link(sd_rtnl *rtnl, sd_rtnl_message **ret, (*ret)->hdr->nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); (*ret)->hdr->nlmsg_type = nlmsg_type; if (nlmsg_type == RTM_NEWLINK) - (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE; + (*ret)->hdr->nlmsg_flags |= NLM_F_CREATE | NLM_F_EXCL; ifi = NLMSG_DATA((*ret)->hdr); @@ -296,6 +295,12 @@ int sd_rtnl_message_get_type(sd_rtnl_message *m, uint16_t *type) { return 0; } +int sd_rtnl_message_is_broadcast(sd_rtnl_message *m) { + assert_return(m, -EINVAL); + + return !m->hdr->nlmsg_pid; +} + int sd_rtnl_message_link_get_ifindex(sd_rtnl_message *m, int *ifindex) { struct ifinfomsg *ifi; @@ -1011,7 +1016,7 @@ int rtnl_message_parse(sd_rtnl_message *m, for (; RTA_OK(rta, rt_len); rta = RTA_NEXT(rta, rt_len)) { type = rta->rta_type; - if (type < max && !tb[type]) + if (type <= max) tb[type] = (uint8_t *) rta - (uint8_t *) m->hdr; }