github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/cmd/nash/rpc.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"net"
     7  	"os"
     8  
     9  	"github.com/madlambda/nash"
    10  )
    11  
    12  func serveConn(sh *nash.Shell, conn net.Conn) {
    13  	var data [1024]byte
    14  
    15  	for {
    16  
    17  		n, err := conn.Read(data[:])
    18  
    19  		if err != nil {
    20  			if err == io.EOF {
    21  				return
    22  			}
    23  
    24  			fmt.Printf("Failed to read data: %s", err.Error())
    25  			return
    26  		}
    27  
    28  		if string(data[0:n]) == "quit" {
    29  			return
    30  		}
    31  
    32  		err = sh.ExecuteString("-nashd-", string(data[0:n]))
    33  
    34  		if err != nil {
    35  			fmt.Printf("nashd: %s\n", err.Error())
    36  
    37  			_, err = conn.Write([]byte("1"))
    38  
    39  			if err != nil {
    40  				fmt.Printf("Failed to send command status.\n")
    41  				return
    42  			}
    43  		} else {
    44  			_, err = conn.Write([]byte("0"))
    45  
    46  			if err != nil {
    47  				fmt.Printf("Failed to send command status.\n")
    48  				return
    49  			}
    50  		}
    51  	}
    52  }
    53  
    54  func startNashd(sh *nash.Shell, socketPath string) {
    55  	os.Remove(socketPath)
    56  
    57  	addr := &net.UnixAddr{
    58  		Net:  "unix",
    59  		Name: socketPath,
    60  	}
    61  
    62  	listener, err := net.ListenUnix("unix", addr)
    63  
    64  	if err != nil {
    65  		fmt.Printf("ERROR: %s\n", err.Error())
    66  		return
    67  	}
    68  
    69  	// Accept only one connection
    70  	conn, err := listener.AcceptUnix()
    71  
    72  	if err != nil {
    73  		fmt.Printf("ERROR: %v", err.Error())
    74  	}
    75  
    76  	serveConn(sh, conn)
    77  	listener.Close()
    78  }