summaryrefslogtreecommitdiff
path: root/netlink.go
diff options
context:
space:
mode:
Diffstat (limited to 'netlink.go')
-rw-r--r--netlink.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/netlink.go b/netlink.go
new file mode 100644
index 0000000..7d3c3f5
--- /dev/null
+++ b/netlink.go
@@ -0,0 +1,66 @@
+package main
+
+// examples of what ifconfig does
+// example of AF_NETLINK change:
+// https://stackoverflow.com/questions/579783/how-to-detect-ip-address-change-programmatically-in-linux/2353441#2353441
+// from that page, a link to watch for any ip event:
+// https://github.com/angt/ipevent/blob/master/ipevent.c
+
+// https://github.com/mdlayher/talks : Linux, Netlink, and Go in 7 minutes or less! (GopherCon 2018, lightning talk)
+
+/*
+ c example from ipevent.c :
+ int fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
+
+ struct sockaddr_nl snl = {
+ .nl_family = AF_NETLINK,
+ .nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR,
+ };
+*/
+
+/*
+import (
+// "os"
+// "os/exec"
+ // "log"
+ // "net"
+ // "unix"
+ "github.com/vishvananda/netlink"
+ "github.com/jsimonetti/rtnetlink"
+// "git.wit.org/wit/gui"
+// "github.com/davecgh/go-spew/spew"
+)
+
+// In golang, write a function to register with netlink to detect changes to any network interface Use tab indentation. Do not include example usage.
+
+func registerNetlink() error {
+ // Create netlink socket
+ sock, err := netlink.Socket(rtnetlink.NETLINK_ROUTE, 0)
+ if err != nil {
+ return err
+ }
+ // Register for interface change events
+ err = netlink.AddMembership(sock, netlink.RTNLGRP_LINK)
+ if err != nil {
+ return err
+ }
+ // Close the socket
+ defer sock.Close()
+ // Handle incoming notifications
+ for {
+ msgs, _, err := sock.Receive()
+ if err != nil {
+ return err
+ }
+ for _, msg := range msgs {
+ switch msg.Header.Type {
+ case unix.RTM_NEWLINK:
+ // Do something with new link
+ case unix.RTM_DELLINK:
+ // Do something with deleted link
+ }
+ }
+ }
+ return nil
+}
+*/