9fans.net/go@v0.0.5/plan9/client/dial.go (about) 1 // +build !plan9 2 3 package client 4 5 import ( 6 "fmt" 7 "net" 8 "os" 9 "regexp" 10 "strings" 11 ) 12 13 func Dial(network, addr string) (*Conn, error) { 14 c, err := net.Dial(network, addr) 15 if err != nil { 16 return nil, err 17 } 18 return NewConn(c) 19 } 20 21 func DialService(service string) (*Conn, error) { 22 ns := Namespace() 23 return Dial("unix", ns+"/"+service) 24 } 25 26 func Mount(network, addr string) (*Fsys, error) { 27 c, err := Dial(network, addr) 28 if err != nil { 29 return nil, err 30 } 31 fsys, err := c.Attach(nil, getuser(), "") 32 if err != nil { 33 c.Close() 34 } 35 return fsys, err 36 } 37 38 func MountService(service string) (*Fsys, error) { 39 c, err := DialService(service) 40 if err != nil { 41 return nil, err 42 } 43 fsys, err := c.Attach(nil, getuser(), "") 44 if err != nil { 45 c.Close() 46 } 47 return fsys, err 48 } 49 50 func MountServiceAname(service, aname string) (*Fsys, error) { 51 c, err := DialService(service) 52 if err != nil { 53 return nil, err 54 } 55 fsys, err := c.Attach(nil, getuser(), aname) 56 if err != nil { 57 c.Close() 58 } 59 return fsys, err 60 } 61 62 var dotZero = regexp.MustCompile(`\A(.*:\d+)\.0\z`) 63 64 // Namespace returns the path to the name space directory. 65 func Namespace() string { 66 ns := os.Getenv("NAMESPACE") 67 if ns != "" { 68 return ns 69 } 70 71 disp := os.Getenv("DISPLAY") 72 if disp == "" { 73 // No $DISPLAY? Use :0.0 for non-X11 GUI (OS X). 74 disp = ":0.0" 75 } 76 77 // Canonicalize: xxx:0.0 => xxx:0. 78 if m := dotZero.FindStringSubmatch(disp); m != nil { 79 disp = m[1] 80 } 81 82 // Turn /tmp/launch/:0 into _tmp_launch_:0 (OS X 10.5). 83 disp = strings.Replace(disp, "/", "_", -1) 84 85 // NOTE: plan9port creates this directory on demand. 86 // Maybe someday we'll need to do that. 87 88 return fmt.Sprintf("/tmp/ns.%s.%s", os.Getenv("USER"), disp) 89 }