/* 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) } }