summaryrefslogtreecommitdiffstats
path: root/back/cmd/authfs/main.go
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2026-03-07 18:33:37 -0500
committerSam Anthony <sam@samanthony.xyz>2026-03-07 18:33:37 -0500
commit79f55b0b233258623062db3c916783b4d14bf14a (patch)
tree09881b5482d2e61d29c8589f2cfabb757252f89b /back/cmd/authfs/main.go
parentade134e5e6aaf28dd65d87dc493d05253585559b (diff)
downloadbuth-79f55b0b233258623062db3c916783b4d14bf14a.zip
authfs: implement p9p.Session
Diffstat (limited to 'back/cmd/authfs/main.go')
-rw-r--r--back/cmd/authfs/main.go66
1 files changed, 66 insertions, 0 deletions
diff --git a/back/cmd/authfs/main.go b/back/cmd/authfs/main.go
new file mode 100644
index 0000000..f8618df
--- /dev/null
+++ b/back/cmd/authfs/main.go
@@ -0,0 +1,66 @@
+/*
+This is the authfs daemon. It stores the user database and client
+sessions, and it 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 (
+ "context"
+ "flag"
+ "log"
+ "net"
+ "os"
+
+ "github.com/docker-archive/go-p9p"
+)
+
+const (
+ defaultNetwork = "unix"
+ defaultAddress = "authfs.sock"
+)
+
+var (
+ network, address string
+
+ outlog = log.New(os.Stdout, "authfs [info]: ", log.LstdFlags)
+ errlog = log.New(os.Stderr, "authfs [error]: ", log.LstdFlags|log.Llongfile)
+)
+
+func main() {
+ flag.StringVar(&network, "net", defaultNetwork, "network transport protocol: {tcp, unix}")
+ flag.StringVar(&address, "addr", defaultAddress, "IP address or Unix socket path to listen on")
+ flag.Parse()
+
+ ln, err := net.Listen(network, address)
+ if err != nil {
+ errlog.Fatal(err)
+ }
+ defer logErr(ln.Close())
+
+ for {
+ if conn, err := ln.Accept(); err == nil {
+ outlog.Println("connected", conn.RemoteAddr())
+ go handle(conn)
+ } else {
+ errlog.Println(err)
+ }
+ }
+}
+
+func handle(conn net.Conn) {
+ defer logErr(conn.Close())
+ ctx := context.Background()
+ handler := p9p.Dispatch(NewSession())
+ if err := p9p.ServeConn(ctx, conn, handler); err != nil {
+ errlog.Printf("%v: %v\n", conn.RemoteAddr(), err)
+ }
+}
+
+func logErr(err error) {
+ if err != nil {
+ errlog.Println(err)
+ }
+}