|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
"syscall"
|
|
|
|
|
|
|
|
"github.com/xjasonlyu/tun2socks/engine"
|
|
|
|
"github.com/xjasonlyu/tun2socks/log"
|
|
|
|
)
|
|
|
|
|
|
|
|
var key = new(engine.Key)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
flag.IntVar(&key.Mark, "fwmark", 0, "Set firewall MARK (Linux only)")
|
|
|
|
flag.IntVar(&key.MTU, "mtu", 0, "Set device maximum transmission unit (MTU)")
|
|
|
|
flag.IntVar(&key.UDPTimeout, "udp-timeout", 0, "Set timeout for each UDP session")
|
|
|
|
flag.BoolVar(&key.Version, "version", false, "Show version information and quit")
|
|
|
|
flag.StringVar(&key.Device, "device", "", "Use this device [driver://]name")
|
|
|
|
flag.StringVar(&key.Interface, "interface", "", "Use network INTERFACE (Linux/MacOS only)")
|
|
|
|
flag.StringVar(&key.LogLevel, "loglevel", "info", "Log level [debug|info|warn|error|silent]")
|
|
|
|
flag.StringVar(&key.Proxy, "proxy", "", "Use this proxy [protocol://]host[:port]")
|
|
|
|
flag.StringVar(&key.Stats, "stats", "", "HTTP statistic server listen address")
|
|
|
|
flag.StringVar(&key.Token, "token", "", "HTTP statistic server auth token")
|
|
|
|
flag.Parse()
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
engine.Insert(key)
|
|
|
|
|
|
|
|
checkErr := func(msg string, f func() error) {
|
|
|
|
if err := f(); err != nil {
|
|
|
|
log.Fatalf("Failed to %s: %v", msg, err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
checkErr("start engine", engine.Start)
|
|
|
|
defer checkErr("stop engine", engine.Stop)
|
|
|
|
|
|
|
|
sigCh := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
<-sigCh
|
|
|
|
}
|