From 55bc8fead207fcb2aafe414ce84073f147ebce39 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Mon, 10 Feb 2020 16:00:28 +0000 Subject: Add bcnm-waitif --- src/libbcnm/bcnm_if_link_init.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/libbcnm/bcnm_if_link_init.c (limited to 'src/libbcnm/bcnm_if_link_init.c') diff --git a/src/libbcnm/bcnm_if_link_init.c b/src/libbcnm/bcnm_if_link_init.c new file mode 100644 index 0000000..dad93fd --- /dev/null +++ b/src/libbcnm/bcnm_if_link_init.c @@ -0,0 +1,38 @@ +/* ISC license. */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include +#include +#include +#include + +#include + +int bcnm_if_link_init (unsigned int kbufsz) +{ + struct sockaddr_nl nl = + { + .nl_family = AF_NETLINK, + .nl_pad = 0, + .nl_groups = RTNLGRP_LINK, + .nl_pid = 0 + } ; + int fd = socket(AF_NETLINK, SOCK_DGRAM | SOCK_NONBLOCK | SOCK_CLOEXEC, NETLINK_ROUTE) ; + if (fd < 0) return -1 ; + if (bind(fd, (struct sockaddr *)&nl, sizeof(struct sockaddr_nl)) < 0) goto err ; + if (setsockopt(fd, SOL_SOCKET, SO_RCVBUFFORCE, &kbufsz, sizeof(unsigned int)) < 0) + { + if (errno != EPERM + || setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &kbufsz, sizeof(unsigned int)) < 0) goto err ; + } + return fd ; + + err: + close(fd) ; + return -1 ; +} + -- cgit v1.3.1