package main import ( "errors" "flag" "log" "os" "os/signal" "path" "syscall" "tunnel/pkg/config" "tunnel/pkg/server" ) var debugVar bool func init() { flag.BoolVar(&debugVar, "d", false, "debug: print time and source info") } func initLog() { var logFlags int if debugVar { logFlags |= log.Ldate | log.Ltime | log.Lshortfile } log.SetFlags(logFlags) } func sighandler(c chan os.Signal, s *server.Server) { var try bool for sig := range c { if try { log.Fatal("force exit") } log.Printf("catch signal: %s", sig) try = true s.Stop() } } func getSocketPath() string { s, err := config.GetSocketPath() if err != nil { log.Fatal(err) } if err := os.Mkdir(path.Dir(s), 0700); err != nil { if !errors.Is(err, syscall.EEXIST) { log.Fatal(err) } } return s } func main() { flag.Parse() initLog() s, err := server.New(getSocketPath()) if err != nil { log.Fatal(err) } var c = make(chan os.Signal) signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) go sighandler(c, s) log.Print("ready") s.Run() log.Print("exit") }