diff options
Diffstat (limited to 'back/cmd/authfs/main.go')
| -rw-r--r-- | back/cmd/authfs/main.go | 66 |
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) + } +} |