rtnl: change from bitmask to enum for rtnl groups
The bitmask is deprecated in the kernel, so move to the new interface. At the moment this does not make a difference for us, but it avoids having to change the API in the future.
This commit is contained in:
parent
389cc5f743
commit
897e184c7d
|
@ -75,8 +75,27 @@ static bool rtnl_pid_changed(sd_rtnl *rtnl) {
|
|||
return rtnl->original_pid != getpid();
|
||||
}
|
||||
|
||||
int sd_rtnl_open(sd_rtnl **ret, uint32_t groups) {
|
||||
static int rtnl_compute_groups_ap(uint32_t *_groups, unsigned n_groups, va_list ap) {
|
||||
uint32_t groups = 0;
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < n_groups; i++) {
|
||||
unsigned group;
|
||||
|
||||
group = va_arg(ap, unsigned);
|
||||
assert_return(group < 32, -EINVAL);
|
||||
|
||||
groups |= group ? (1 << (group - 1)) : 0;
|
||||
}
|
||||
|
||||
*_groups = groups;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sd_rtnl_open(sd_rtnl **ret, unsigned n_groups, ...) {
|
||||
_cleanup_rtnl_unref_ sd_rtnl *rtnl = NULL;
|
||||
va_list ap;
|
||||
socklen_t addrlen;
|
||||
int r, one = 1;
|
||||
|
||||
|
@ -93,7 +112,11 @@ int sd_rtnl_open(sd_rtnl **ret, uint32_t groups) {
|
|||
if (setsockopt(rtnl->fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)) < 0)
|
||||
return -errno;
|
||||
|
||||
rtnl->sockaddr.nl.nl_groups = groups;
|
||||
va_start(ap, n_groups);
|
||||
r = rtnl_compute_groups_ap(&rtnl->sockaddr.nl.nl_groups, n_groups, ap);
|
||||
va_end(ap);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
addrlen = sizeof(rtnl->sockaddr);
|
||||
|
||||
|
|
|
@ -91,7 +91,8 @@ int manager_new(Manager **ret) {
|
|||
|
||||
sd_event_set_watchdog(m->event, true);
|
||||
|
||||
r = sd_rtnl_open(&m->rtnl, RTMGRP_LINK | RTMGRP_IPV4_IFADDR);
|
||||
r = sd_rtnl_open(&m->rtnl, 3, RTNLGRP_LINK, RTNLGRP_IPV4_IFADDR,
|
||||
RTNLGRP_IPV6_IFADDR);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@ typedef struct sd_rtnl_message sd_rtnl_message;
|
|||
typedef int (*sd_rtnl_message_handler_t)(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata);
|
||||
|
||||
/* bus */
|
||||
int sd_rtnl_open(sd_rtnl **nl, uint32_t groups);
|
||||
int sd_rtnl_open(sd_rtnl **nl, unsigned n_groups, ...);
|
||||
|
||||
sd_rtnl *sd_rtnl_ref(sd_rtnl *nl);
|
||||
sd_rtnl *sd_rtnl_unref(sd_rtnl *nl);
|
||||
|
|
Loading…
Reference in a new issue