From b0234b0947e0bc0a6b46721631df0e2f83043df9 Mon Sep 17 00:00:00 2001 From: vg Date: Thu, 4 Apr 2024 15:22:01 +0200 Subject: C script to monitor netlink events --- scripts/netlink-monitor | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 scripts/netlink-monitor (limited to 'scripts') diff --git a/scripts/netlink-monitor b/scripts/netlink-monitor new file mode 100755 index 0000000..1f22922 --- /dev/null +++ b/scripts/netlink-monitor @@ -0,0 +1,75 @@ +#!/usr/bin/env C + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int init_netlink_socket(int * netlink_socket) +{ + struct sockaddr_nl snl; + int ret; + + memset(&snl, 0, sizeof(struct sockaddr_nl)); + snl.nl_family = AF_NETLINK; + snl.nl_pid = getpid(); + snl.nl_groups = 1; + + *netlink_socket = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); + if (*netlink_socket == -1) { + fprintf(stderr, "netlink socket: %s\n", strerror(errno)); + return -1; + } + + ret = bind(*netlink_socket, (struct sockaddr *) & snl, + sizeof(struct sockaddr_nl)); + if (ret < 0) { + fprintf(stderr, "netlink bind failed: %s\n", strerror(errno)); + close(*netlink_socket); + *netlink_socket = -1; + return -1; + } + + return 0; +} + +int main(void) +{ + int ret = -1; + int netlink_socket = -1; + int buflen = -1; + char netlink_buf[4096+1]; + + ret = init_netlink_socket(&netlink_socket); + if (ret) { + fprintf(stderr, "init_netlink_socket() has failed %s\n", + strerror(errno)); + close(netlink_socket); + return -1; + } + + while (1) { + buflen = recv(netlink_socket, netlink_buf, sizeof(netlink_buf)-1 , 0); + if (buflen <= 0) { + fprintf(stderr, "error receiving uevent message: %s\n", + strerror(errno)); + } else { + netlink_buf[buflen-1] = '\0'; + printf("%s\n", netlink_buf); + fflush(stdout); + } + } + + return 0; +} -- cgit v1.2.3