aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/netlink-monitor
blob: 1f2292278cf48be73027a9946430b92635ab210b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env C

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <getopt.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/select.h>
#include <linux/types.h>
#include <linux/netlink.h>

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;
}