assert(fd >= 0);
- /* This returns ENOPROTOOPT if the kernel is older than 4.2. */
-
if (getsockopt(fd, SOL_NETLINK, NETLINK_LIST_MEMBERSHIPS, NULL, &len) < 0)
return -errno;
/* Save multicast groups. */
r = netlink_socket_get_multicast_groups(m->sock, &m->multicast_group_len, &m->multicast_groups);
- if (r < 0 && r != -ENOPROTOOPT)
+ if (r < 0)
return r;
/* Leave from all multicast groups to prevent the buffer is filled. */
assert(nl->fd >= 0);
r = netlink_socket_get_multicast_groups(nl->fd, &len, &groups);
- if (r == -ENOPROTOOPT) {
- nl->broadcast_group_dont_leave = true;
- return 0;
- }
if (r < 0)
return r;
return broadcast_group_join(nl, group);
}
-static int broadcast_group_leave(sd_netlink *nl, unsigned group) {
- assert(nl);
- assert(nl->fd >= 0);
- assert(group > 0);
-
- if (nl->broadcast_group_dont_leave)
- return 0;
-
- /* group is "unsigned", but netlink(7) says the argument for NETLINK_DROP_MEMBERSHIP is "int" */
- return setsockopt_int(nl->fd, SOL_NETLINK, NETLINK_DROP_MEMBERSHIP, group);
-}
-
int socket_broadcast_group_unref(sd_netlink *nl, unsigned group) {
unsigned n_ref;
int r;
/* still refs left */
return 0;
- return broadcast_group_leave(nl, group);
+ /* group is "unsigned", but netlink(7) says the argument for NETLINK_DROP_MEMBERSHIP is "int" */
+ return setsockopt_int(nl->fd, SOL_NETLINK, NETLINK_DROP_MEMBERSHIP, group);
}
/* returns the number of bytes sent, or a negative error code */