summaryrefslogtreecommitdiffstats
path: root/back/cmd/authfs/main.go
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2026-03-14 11:23:50 -0400
committerSam Anthony <sam@samanthony.xyz>2026-03-14 11:23:50 -0400
commit700096b078f6e16f2c5c967ea140f0b93e799986 (patch)
treee1d9965e9bf09ebe01a96d8faa6d2bc027e6984c /back/cmd/authfs/main.go
parent7d622695ae19e518fded6aa5fbf001dae4652211 (diff)
downloadbuth-harveyos.zip
authfs: rewrite with Harvey-OS/ninep, implement Rattachharveyos
Diffstat (limited to 'back/cmd/authfs/main.go')
-rw-r--r--back/cmd/authfs/main.go65
1 files changed, 35 insertions, 30 deletions
diff --git a/back/cmd/authfs/main.go b/back/cmd/authfs/main.go
index f8618df..b705858 100644
--- a/back/cmd/authfs/main.go
+++ b/back/cmd/authfs/main.go
@@ -1,6 +1,6 @@
/*
This is the authfs daemon. It stores the user database and client
-sessions, and it serves a 9P filesystem for managing them.
+sessions, and serves a 9P filesystem for managing them.
User data (usernames and password hashes) are stored on disk. Sessions
are stored in memory.
@@ -8,59 +8,64 @@ are stored in memory.
package main
import (
- "context"
"flag"
+ "io"
"log"
"net"
"os"
- "github.com/docker-archive/go-p9p"
-)
-
-const (
- defaultNetwork = "unix"
- defaultAddress = "authfs.sock"
+ "github.com/Harvey-OS/ninep/pkg/debugfs"
+ p9 "github.com/Harvey-OS/ninep/protocol"
)
var (
- network, address string
+ 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.Llongfile)
+ errlog = log.New(os.Stderr, "authfs [error]: ", log.LstdFlags|log.Lshortfile)
)
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)
+ sock, err := net.Listen(*ntype, *naddr)
if err != nil {
errlog.Fatal(err)
}
- defer logErr(ln.Close())
+ defer logClose(sock, errlog)
- for {
- if conn, err := ln.Accept(); err == nil {
- outlog.Println("connected", conn.RemoteAddr())
- go handle(conn)
+ fs, err := NewAuthfs(*root)
+ if err != nil {
+ errlog.Fatal(err)
+ }
+ defer fs.Close()
+
+ nsCreator := func() p9.NineServer {
+ if *debug {
+ return &debugfs.DebugFileServer{fs}
} else {
- errlog.Println(err)
+ return fs
}
}
-}
-
-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)
+ 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 logErr(err error) {
- if err != nil {
- errlog.Println(err)
+func logClose(c io.Closer, l *log.Logger) {
+ if err := c.Close(); err != nil {
+ l.Println(err)
}
}