Blob


1 package main
3 import (
4 "context"
5 "flag"
6 "log"
7 "net"
8 "strings"
10 "git.omarpolo.com/go-p9p"
11 "git.omarpolo.com/go-p9p/ufs"
12 )
14 var (
15 root string
16 addr string
17 )
19 func init() {
20 flag.StringVar(&root, "root", "~/", "root of filesystem to serve over 9p")
21 flag.StringVar(&addr, "addr", ":5640", "bind addr for 9p server, prefix with unix: for unix socket")
22 }
24 func main() {
25 ctx := context.Background()
26 log.SetFlags(0)
27 flag.Parse()
29 proto := "tcp"
30 if strings.HasPrefix(addr, "unix:") {
31 proto = "unix"
32 addr = addr[5:]
33 }
35 listener, err := net.Listen(proto, addr)
36 if err != nil {
37 log.Fatalln("error listening:", err)
38 }
39 defer listener.Close()
41 for {
42 c, err := listener.Accept()
43 if err != nil {
44 log.Fatalln("error accepting:", err)
45 continue
46 }
48 go func(conn net.Conn) {
49 defer conn.Close()
51 ctx := context.WithValue(ctx, "conn", conn)
52 log.Println("connected", conn.RemoteAddr())
53 session, err := ufs.NewSession(ctx, root)
54 if err != nil {
55 log.Println("error creating session")
56 return
57 }
59 if err := p9p.ServeConn(ctx, conn, p9p.Dispatch(session)); err != nil {
60 log.Printf("serving conn: %v", err)
61 }
62 }(c)
63 }
64 }