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
}
*/