diff options
Diffstat (limited to 'netlink.go')
| -rw-r--r-- | netlink.go | 66 |
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 +} +*/ |
