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=3576274e4542fc7d3da55bef9b10707b72f8166f;hp=17b928059f40b80b688b52d0624434e9ed471219;hb=6e37cd2f4af8928d905203108a4331e375d7127c;hpb=4e996881b2a24390b534d84aa89ba70401cc7e69 diff --git a/src/libsystemd/sd-rtnl/rtnl-message.c b/src/libsystemd/sd-rtnl/rtnl-message.c index 17b928059..3576274e4 100644 --- a/src/libsystemd/sd-rtnl/rtnl-message.c +++ b/src/libsystemd/sd-rtnl/rtnl-message.c @@ -213,6 +213,22 @@ int sd_rtnl_message_new_link(sd_rtnl *rtnl, sd_rtnl_message **ret, return 0; } +int sd_rtnl_message_request_dump(sd_rtnl_message *m, int dump) { + assert_return(m, -EINVAL); + assert_return(m->hdr, -EINVAL); + assert_return(m->hdr->nlmsg_type == RTM_GETLINK || + m->hdr->nlmsg_type == RTM_GETADDR || + m->hdr->nlmsg_type == RTM_GETROUTE, + -EINVAL); + + if (dump) + m->hdr->nlmsg_flags |= NLM_F_DUMP; + else + m->hdr->nlmsg_flags &= ~NLM_F_DUMP; + + return 0; +} + int sd_rtnl_message_addr_set_prefixlen(sd_rtnl_message *m, unsigned char prefixlen) { struct ifaddrmsg *ifa; @@ -1076,7 +1092,7 @@ int socket_read_message(sd_rtnl *rtnl) { struct nlmsghdr *new_msg; size_t len; int r; - unsigned i; + unsigned i = 0; assert(rtnl); assert(rtnl->rbuffer); @@ -1210,16 +1226,16 @@ int socket_read_message(sd_rtnl *rtnl) { if (r < 0) return r; - if (i < rtnl->rqueue_partial_size) { + rtnl->rqueue[rtnl->rqueue_size ++] = first; + first = NULL; + + if (multi_part && (i < rtnl->rqueue_partial_size)) { /* remove the message form the partial read queue */ memmove(rtnl->rqueue_partial + i,rtnl->rqueue_partial + i + 1, sizeof(sd_rtnl_message*) * (rtnl->rqueue_partial_size - i - 1)); rtnl->rqueue_partial_size --; } - rtnl->rqueue[rtnl->rqueue_size ++] = first; - first = NULL; - return 1; } else { /* we only got a partial multi-part message, push it on the