github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2013/distsys/finger.go (about) 1 // +build OMIT 2 3 package main 4 5 import ( 6 "bufio" 7 "io" 8 "log" 9 "net" 10 "os" 11 "os/exec" 12 ) 13 14 func main() { 15 if len(os.Args) > 1 && os.Args[1] == "serve" { 16 serve() 17 } 18 finger() 19 } 20 21 func finger() { 22 c, err := net.Dial("tcp", "localhost:finger") 23 if err != nil { 24 log.Fatal(err) 25 } 26 io.WriteString(c, "rsc\n") 27 io.Copy(os.Stdout, c) 28 } 29 30 func serve() { 31 l, err := net.Listen("tcp", "localhost:finger") 32 if err != nil { 33 log.Fatal(err) 34 } 35 for { 36 c, err := l.Accept() 37 if err != nil { 38 log.Fatal(err) 39 } 40 go serveConn(c) 41 } 42 } 43 44 func serveConn(c net.Conn) { 45 defer c.Close() 46 47 b := bufio.NewReader(c) 48 l, err := b.ReadString('\n') 49 if err != nil { 50 return 51 } 52 53 cmd := exec.Command("finger", l[:len(l)-1]) 54 cmd.Stdout = c 55 cmd.Stderr = c 56 cmd.Run() 57 }