/* This is the authfs daemon. It stores the user database and client sessions, and serves a 9P filesystem for managing them. User data (usernames and password hashes) are stored on disk. Sessions are stored in memory. */ package main import ( "flag" "io" "log" "net" "os" "github.com/Harvey-OS/ninep/pkg/debugfs" p9 "github.com/Harvey-OS/ninep/protocol" ) var ( root = flag.String("root", ".", "root directory") ntype = flag.String("net", "unix", "network type: {tcp, unix}") naddr = flag.String("addr", "authfs.sock", "network address") debug = flag.Bool("debug", false, "print debug messages") outlog = log.New(os.Stdout, "authfs [info]: ", log.LstdFlags) errlog = log.New(os.Stderr, "authfs [error]: ", log.LstdFlags|log.Lshortfile) ) func main() { flag.Parse() sock, err := net.Listen(*ntype, *naddr) if err != nil { errlog.Fatal(err) } defer logClose(sock, errlog) fs, err := NewAuthfs(*root) if err != nil { errlog.Fatal(err) } defer fs.Close() nsCreator := func() p9.NineServer { if *debug { return &debugfs.DebugFileServer{fs} } else { return fs } } ln, err := p9.NewListener(nsCreator, func(l *p9.Listener) error { l.Trace = func(format string, a ...any) { outlog.Printf(format, a...) } return nil }) if err != nil { errlog.Fatal(err) } if err := ln.Serve(sock); err != nil { errlog.Fatal(err) } } func logClose(c io.Closer, l *log.Logger) { if err := c.Close(); err != nil { l.Println(err) } }