github.com/sagernet/sing-box@v1.2.7/experimental/libbox/command_stop.go (about)

     1  package libbox
     2  
     3  import (
     4  	"encoding/binary"
     5  	"net"
     6  	"runtime/debug"
     7  
     8  	E "github.com/sagernet/sing/common/exceptions"
     9  	"github.com/sagernet/sing/common/rw"
    10  )
    11  
    12  func ClientServiceStop(sharedDirectory string) error {
    13  	conn, err := clientConnect(sharedDirectory)
    14  	if err != nil {
    15  		return err
    16  	}
    17  	defer conn.Close()
    18  	err = binary.Write(conn, binary.BigEndian, uint8(CommandServiceStop))
    19  	if err != nil {
    20  		return err
    21  	}
    22  	var hasError bool
    23  	err = binary.Read(conn, binary.BigEndian, &hasError)
    24  	if err != nil {
    25  		return err
    26  	}
    27  	if hasError {
    28  		errorMessage, err := rw.ReadVString(conn)
    29  		if err != nil {
    30  			return err
    31  		}
    32  		return E.New(errorMessage)
    33  	}
    34  	return nil
    35  }
    36  
    37  func (s *CommandServer) handleServiceStop(conn net.Conn) error {
    38  	rErr := s.handler.ServiceStop()
    39  	err := binary.Write(conn, binary.BigEndian, rErr != nil)
    40  	if err != nil {
    41  		return err
    42  	}
    43  	if rErr != nil {
    44  		return rw.WriteVString(conn, rErr.Error())
    45  	}
    46  	debug.FreeOSMemory()
    47  	return nil
    48  }