command_power.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package libbox
  2. import (
  3. "encoding/binary"
  4. "net"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. "github.com/sagernet/sing/common/varbin"
  7. )
  8. func (c *CommandClient) ServiceReload() error {
  9. conn, err := c.directConnect()
  10. if err != nil {
  11. return err
  12. }
  13. defer conn.Close()
  14. err = binary.Write(conn, binary.BigEndian, uint8(CommandServiceReload))
  15. if err != nil {
  16. return err
  17. }
  18. var hasError bool
  19. err = binary.Read(conn, binary.BigEndian, &hasError)
  20. if err != nil {
  21. return err
  22. }
  23. if hasError {
  24. errorMessage, err := varbin.ReadValue[string](conn, binary.BigEndian)
  25. if err != nil {
  26. return err
  27. }
  28. return E.New(errorMessage)
  29. }
  30. return nil
  31. }
  32. func (s *CommandServer) handleServiceReload(conn net.Conn) error {
  33. rErr := s.handler.ServiceReload()
  34. err := binary.Write(conn, binary.BigEndian, rErr != nil)
  35. if err != nil {
  36. return err
  37. }
  38. if rErr != nil {
  39. return varbin.Write(conn, binary.BigEndian, rErr.Error())
  40. }
  41. return nil
  42. }
  43. func (c *CommandClient) ServiceClose() error {
  44. conn, err := c.directConnect()
  45. if err != nil {
  46. return err
  47. }
  48. defer conn.Close()
  49. err = binary.Write(conn, binary.BigEndian, uint8(CommandServiceClose))
  50. if err != nil {
  51. return err
  52. }
  53. var hasError bool
  54. err = binary.Read(conn, binary.BigEndian, &hasError)
  55. if err != nil {
  56. return nil
  57. }
  58. if hasError {
  59. errorMessage, err := varbin.ReadValue[string](conn, binary.BigEndian)
  60. if err != nil {
  61. return nil
  62. }
  63. return E.New(errorMessage)
  64. }
  65. return nil
  66. }
  67. func (s *CommandServer) handleServiceClose(conn net.Conn) error {
  68. rErr := s.service.Close()
  69. s.handler.PostServiceClose()
  70. err := binary.Write(conn, binary.BigEndian, rErr != nil)
  71. if err != nil {
  72. return err
  73. }
  74. if rErr != nil {
  75. return varbin.Write(conn, binary.BigEndian, rErr.Error())
  76. }
  77. return nil
  78. }