/* SPDX-License-Identifier: MIT * * Copyright (C) 2017-2019 WireGuard LLC. All Rights Reserved. */ package main import ( "fmt" "os" "os/signal" "syscall" "git.zx2c4.com/wireguard-go/tun" ) const ( ExitSetupSuccess = 0 ExitSetupFailed = 1 ) func main() { if len(os.Args) != 2 { os.Exit(ExitSetupFailed) } //configFile := os.Args[1] interfaceName := "TODO" logger := NewLogger( LogLevelDebug, fmt.Sprintf("(%s) ", interfaceName), ) logger.Info.Println("Starting wireguard-go version", WireGuardGoVersion) logger.Debug.Println("Debug log enabled") tun, err := tun.CreateTUN(interfaceName) if err == nil { realInterfaceName, err2 := tun.Name() if err2 == nil { interfaceName = realInterfaceName } } else { logger.Error.Println("Failed to create TUN device:", err) os.Exit(ExitSetupFailed) } device := NewDevice(tun, logger) device.Up() logger.Info.Println("Device started") uapi, err := UAPIListen(interfaceName) if err != nil { logger.Error.Println("Failed to listen on uapi socket:", err) os.Exit(ExitSetupFailed) } errs := make(chan error) term := make(chan os.Signal, 1) go func() { for { conn, err := uapi.Accept() if err != nil { errs <- err return } go ipcHandle(device, conn) } }() logger.Info.Println("UAPI listener started") // wait for program to terminate signal.Notify(term, os.Interrupt) signal.Notify(term, os.Kill) signal.Notify(term, syscall.SIGTERM) select { case <-term: case <-errs: case <-device.Wait(): } // clean up uapi.Close() device.Close() logger.Info.Println("Shutting down") }