Blob


1 package main
3 import (
4 "flag"
5 "log"
6 "net"
7 "strings"
9 "github.com/docker/pinata/v1/pkg/p9p"
10 "golang.org/x/net/context"
11 )
13 var (
14 root string
15 addr string
16 )
18 func init() {
19 flag.StringVar(&root, "root", "~/", "root of filesystem to serve over 9p")
20 flag.StringVar(&addr, "addr", ":5640", "bind addr for 9p server, prefix with unix: for unix socket")
21 }
23 func main() {
24 ctx := context.Background()
25 log.SetFlags(0)
26 flag.Parse()
28 proto := "tcp"
29 if strings.HasPrefix(addr, "unix:") {
30 proto = "unix"
31 addr = addr[5:]
32 }
34 listener, err := net.Listen(proto, addr)
35 if err != nil {
36 log.Fatalln("error listening:", err)
37 }
38 defer listener.Close()
40 for {
41 c, err := listener.Accept()
42 if err != nil {
43 log.Fatalln("error accepting:", err)
44 continue
45 }
47 go func(conn net.Conn) {
48 defer conn.Close()
50 ctx := context.WithValue(ctx, "conn", conn)
51 log.Println("connected", conn.RemoteAddr())
52 session, err := newLocalSession(ctx, root)
53 if err != nil {
54 log.Println("error creating session")
55 return
56 }
58 p9pnew.Serve(ctx, conn, p9pnew.Dispatch(session))
59 }(c)
60 }
61 }
63 // newLocalSession returns a session to serve the local filesystem, restricted
64 // to the provided root.
65 func newLocalSession(ctx context.Context, root string) (p9pnew.Session, error) {
66 // silly, just connect to ufs for now! replace this with real code later!
67 log.Println("dialing", ":5640", "for", ctx.Value("conn"))
68 conn, err := net.Dial("tcp", ":5640")
69 if err != nil {
70 return nil, err
71 }
73 session, err := p9pnew.NewSession(ctx, conn)
74 if err != nil {
75 return nil, err
76 }
78 return session, nil
79 }