2019-02-04 16:29:52 +00:00
/ * SPDX - License - Identifier : MIT
*
* Copyright ( C ) 2017 - 2019 WireGuard LLC . All Rights Reserved .
* /
package main
import (
"fmt"
"os"
"os/signal"
2019-02-07 03:42:35 +00:00
"syscall"
2019-02-05 13:06:25 +00:00
2019-05-14 07:09:52 +00:00
"golang.zx2c4.com/wireguard/device"
"golang.zx2c4.com/wireguard/ipc"
2019-02-18 03:44:41 +00:00
"golang.zx2c4.com/wireguard/tun"
2019-02-04 16:29:52 +00:00
)
const (
ExitSetupSuccess = 0
ExitSetupFailed = 1
)
func main ( ) {
2019-02-05 13:06:25 +00:00
if len ( os . Args ) != 2 {
2019-02-04 16:29:52 +00:00
os . Exit ( ExitSetupFailed )
}
2019-02-07 14:44:07 +00:00
interfaceName := os . Args [ 1 ]
2019-02-04 16:29:52 +00:00
2019-04-18 22:48:09 +00:00
fmt . Fprintln ( os . Stderr , "Warning: this is a test program for Windows, mainly used for debugging this Go package. For a real WireGuard for Windows client, the repo you want is <https://git.zx2c4.com/wireguard-windows/>, which includes this code as a module." )
2019-03-03 03:04:41 +00:00
logger := device . NewLogger (
device . LogLevelDebug ,
2019-02-04 16:29:52 +00:00
fmt . Sprintf ( "(%s) " , interfaceName ) ,
)
2019-04-09 08:45:36 +00:00
logger . Info . Println ( "Starting wireguard-go version" , device . WireGuardGoVersion )
2019-02-04 16:29:52 +00:00
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 )
}
2019-03-03 03:04:41 +00:00
device := device . NewDevice ( tun , logger )
2019-02-05 13:06:25 +00:00
device . Up ( )
2019-02-04 16:29:52 +00:00
logger . Info . Println ( "Device started" )
2019-03-03 03:04:41 +00:00
uapi , err := ipc . UAPIListen ( interfaceName )
2019-02-04 16:29:52 +00:00
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
}
2019-03-03 03:04:41 +00:00
go device . IpcHandle ( conn )
2019-02-04 16:29:52 +00:00
}
} ( )
logger . Info . Println ( "UAPI listener started" )
// wait for program to terminate
signal . Notify ( term , os . Interrupt )
2019-02-07 03:42:35 +00:00
signal . Notify ( term , os . Kill )
signal . Notify ( term , syscall . SIGTERM )
2019-02-04 16:29:52 +00:00
select {
case <- term :
case <- errs :
case <- device . Wait ( ) :
}
// clean up
uapi . Close ( )
device . Close ( )
logger . Info . Println ( "Shutting down" )
}