mirror of
				https://git.zx2c4.com/wireguard-go
				synced 2025-10-31 11:56:22 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /* 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)
 | |
| 	}
 | |
| 	interfaceName := os.Args[1]
 | |
| 
 | |
| 	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")
 | |
| }
 | 
