package main import ( "bufio" "fmt" "os" "iptcp/pkg/ipstack" "strings" ) func main() { if len(os.Args) != 2 { fmt.Printf("Usage: %s \n", os.Args[0]) os.Exit(1) } fileName := os.Args[1] go ipstack.Initialize(fileName) scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { line := scanner.Text() if line == "li" { fmt.Println("Name\tAddr/Prefix\tState") ipstack.SprintInterfaces() } if line == "ln" { fmt.Println("Iface\tVIP\tUDPAddr") ipstack.SprintNeighbors() } if line == "lr" { fmt.Println("T\tPrefix\tNext Hop\tCost") ipstack.SprintRoutingTable() } if len(line) > 4 { if line[:4] == "down" { // get interface name ifaceName := line[5:] ipstack.InterfaceDownREPL(ifaceName) } if line[:4] == "send" { // get IP address and message that follows it listOfWords := strings.Split(line, " ") ipAddr := listOfWords[1] message := listOfWords[2:] // combine message into one string messageToSend := strings.Join(message, " ") // convert message to byte array messageToSendBytes := []byte(messageToSend) // get interface by ipAddr iface, err := ipstack.GetNeighborByIP(ipAddr) if err != nil { fmt.Println(err) iface, err = ipstack.GetRouteByIP(ipAddr) if err != nil { fmt.Println(err) continue } err = ipstack.SendIP(ipstack.GetMyVIP(), iface, 0, messageToSendBytes, ipAddr) if err != nil { fmt.Println(err) continue } continue } err = ipstack.SendIP(ipstack.GetMyVIP(), iface, 0, messageToSendBytes, ipAddr) if err != nil { fmt.Println(err) continue } } } if len(line) > 2 { if line[:2] == "up" { // get interface name ifaceName := line[3:] ipstack.InterfaceUpREPL(ifaceName) } } if line == "q" { ipstack.CleanUp() os.Exit(0) } } }