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  }