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 }