package main import ( "context" "crypto/tls" "log" "os" "sync" "tildegit.org/tjp/sliderule/finger" "tildegit.org/tjp/sliderule/gemini" "tildegit.org/tjp/sliderule/logging" ) func main() { conf := configure() gemTLS, err := gemini.FileTLS(conf.tlsCertFile, conf.tlsKeyFile) if err != nil { log.Fatal(err) } dropped, err := dropPrivileges() if err != nil { log.Fatal(err) } ctx, _, info, warn, errlog := serverContext() if !dropped { _ = warn.Log("msg", "dropping privileges to 'nobody' failed") } wg := &sync.WaitGroup{} go startGemini(ctx, conf, wg, gemTLS, info, errlog) go startFinger(ctx, conf, wg, info, errlog) wg.Add(2) wg.Wait() } func startGemini( ctx context.Context, conf config, wg *sync.WaitGroup, gemTLS *tls.Config, infolog logging.Logger, errlog logging.Logger, ) { defer wg.Done() handler := logging.LogRequests(infolog)(geminiRouter(conf)) server, err := gemini.NewServer( ctx, conf.hostname, "tcp", "", handler, errlog, gemTLS, ) if err != nil { _ = errlog.Log("msg", "error building server", "error", err) os.Exit(1) } if err := server.Serve(); err != nil { _ = errlog.Log("msg", "error serving gemini", "error", err) os.Exit(1) } } func startFinger( ctx context.Context, conf config, wg *sync.WaitGroup, infolog logging.Logger, errlog logging.Logger, ) { defer wg.Done() handler := logging.LogRequests(infolog)(fingerHandler(conf)) server, err := finger.NewServer(ctx, conf.hostname, "tcp", "", handler, errlog) if err != nil { _ = errlog.Log("msg", "error building server", "error", err) os.Exit(1) } if err := server.Serve(); err != nil { _ = errlog.Log("msg", "error serving finger", "error", err) os.Exit(1) } }