+ r = message_new_empty(rtnl, &m);
+ if (r < 0)
+ return r;
+
+ m->hdr = memdup(new_msg, new_msg->nlmsg_len);
+ if (!m->hdr)
+ return -ENOMEM;
+
+ /* seal and parse the top-level message */
+ r = sd_rtnl_message_rewind(m);
+ if (r < 0)
+ return r;
+
+ r = rtnl_rqueue_make_room(rtnl);
+ if (r < 0)
+ return r;
+
+ rtnl->rqueue[rtnl->rqueue_size ++] = m;
+ m = NULL;
+ ret += new_msg->nlmsg_len;
+
+ /* reached end of multi-part message, or not a multi-part
+ message at all */
+ if (new_msg->nlmsg_type == NLMSG_DONE ||
+ !(new_msg->nlmsg_flags & NLM_F_MULTI))
+ break;
+ }