return 1;
}
-int sd_netlink_sendv(sd_netlink *nl,
- sd_netlink_message **messages,
- size_t msgcount,
- uint32_t **ret_serial) {
+int sd_netlink_sendv(
+ sd_netlink *nl,
+ sd_netlink_message **messages,
+ size_t msgcount,
+ uint32_t **ret_serial) {
+
_cleanup_free_ uint32_t *serials = NULL;
- unsigned i;
int r;
assert_return(nl, -EINVAL);
assert_return(msgcount > 0, -EINVAL);
if (ret_serial) {
- serials = new0(uint32_t, msgcount);
+ serials = new(uint32_t, msgcount);
if (!serials)
return -ENOMEM;
}
- for (i = 0; i < msgcount; i++) {
+ for (unsigned i = 0; i < msgcount; i++) {
assert_return(!messages[i]->sealed, -EPERM);
+
rtnl_seal_message(nl, messages[i]);
if (serials)
serials[i] = rtnl_message_get_serial(messages[i]);
void *userdata,
uint64_t usec,
const char *description) {
+
_cleanup_free_ sd_netlink_slot *slot = NULL;
int r, k;
return k;
}
-int sd_netlink_read(sd_netlink *rtnl,
- uint32_t serial,
- uint64_t usec,
- sd_netlink_message **ret) {
+int sd_netlink_read(
+ sd_netlink *rtnl,
+ uint32_t serial,
+ uint64_t usec,
+ sd_netlink_message **ret) {
+
usec_t timeout;
int r;
for (;;) {
usec_t left;
- unsigned i;
- for (i = 0; i < rtnl->rqueue_size; i++) {
+ for (unsigned i = 0; i < rtnl->rqueue_size; i++) {
+ _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *incoming = NULL;
uint32_t received_serial;
+ uint16_t type;
received_serial = rtnl_message_get_serial(rtnl->rqueue[i]);
+ if (received_serial != serial)
+ continue;
- if (received_serial == serial) {
- _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *incoming = NULL;
- uint16_t type;
-
- incoming = rtnl->rqueue[i];
-
- /* found a match, remove from rqueue and return it */
- memmove(rtnl->rqueue + i,rtnl->rqueue + i + 1,
- sizeof(sd_netlink_message*) * (rtnl->rqueue_size - i - 1));
- rtnl->rqueue_size--;
+ incoming = rtnl->rqueue[i];
- r = sd_netlink_message_get_errno(incoming);
- if (r < 0)
- return r;
+ /* found a match, remove from rqueue and return it */
+ memmove(rtnl->rqueue + i,rtnl->rqueue + i + 1,
+ sizeof(sd_netlink_message*) * (rtnl->rqueue_size - i - 1));
+ rtnl->rqueue_size--;
- r = sd_netlink_message_get_type(incoming, &type);
- if (r < 0)
- return r;
-
- if (type == NLMSG_DONE) {
- *ret = NULL;
- return 0;
- }
+ r = sd_netlink_message_get_errno(incoming);
+ if (r < 0)
+ return r;
- if (ret)
- *ret = TAKE_PTR(incoming);
+ r = sd_netlink_message_get_type(incoming, &type);
+ if (r < 0)
+ return r;
- return 1;
+ if (type == NLMSG_DONE) {
+ *ret = NULL;
+ return 0;
}
+
+ if (ret)
+ *ret = TAKE_PTR(incoming);
+ return 1;
}
r = socket_read_message(rtnl);
r = rtnl_poll(rtnl, true, left);
if (r < 0)
return r;
- else if (r == 0)
+ if (r == 0)
return -ETIMEDOUT;
}
}
-int sd_netlink_call(sd_netlink *rtnl,
+int sd_netlink_call(
+ sd_netlink *rtnl,
sd_netlink_message *message,
uint64_t usec,
sd_netlink_message **ret) {
+
uint32_t serial;
int r;
assert_return(rtnl, -EINVAL);
assert_return(!rtnl_pid_changed(rtnl), -ECHILD);
- if (rtnl->rqueue_size == 0)
- return POLLIN;
- else
- return 0;
+ return rtnl->rqueue_size == 0 ? POLLIN : 0;
}
int sd_netlink_get_timeout(sd_netlink *rtnl, uint64_t *timeout_usec) {