sing-box/experimental/libbox/command_client.go

76 lines
1.6 KiB
Go
Raw Normal View History

2023-03-01 10:37:47 +08:00
//go:build darwin
package libbox
import (
"encoding/binary"
"net"
"path/filepath"
"github.com/sagernet/sing/common"
E "github.com/sagernet/sing/common/exceptions"
)
type CommandClient struct {
2023-03-03 19:26:54 +08:00
sharedDirectory string
handler CommandClientHandler
conn net.Conn
options CommandClientOptions
2023-03-01 10:37:47 +08:00
}
type CommandClientOptions struct {
Command int32
StatusInterval int64
}
type CommandClientHandler interface {
Connected()
Disconnected(message string)
WriteLog(message string)
WriteStatus(message *StatusMessage)
}
func NewCommandClient(sharedDirectory string, handler CommandClientHandler, options *CommandClientOptions) *CommandClient {
return &CommandClient{
2023-03-03 19:26:54 +08:00
sharedDirectory: sharedDirectory,
handler: handler,
options: common.PtrValueOrDefault(options),
2023-03-01 10:37:47 +08:00
}
}
2023-03-03 19:26:54 +08:00
func clientConnect(sharedDirectory string) (net.Conn, error) {
return net.DialUnix("unix", nil, &net.UnixAddr{
Name: filepath.Join(sharedDirectory, "command.sock"),
2023-03-01 10:37:47 +08:00
Net: "unix",
})
2023-03-03 19:26:54 +08:00
}
func (c *CommandClient) Connect() error {
conn, err := clientConnect(c.sharedDirectory)
2023-03-01 10:37:47 +08:00
if err != nil {
return err
}
c.conn = conn
err = binary.Write(conn, binary.BigEndian, uint8(c.options.Command))
if err != nil {
return err
}
switch c.options.Command {
case CommandLog:
2023-03-02 16:40:28 +08:00
c.handler.Connected()
2023-03-01 10:37:47 +08:00
go c.handleLogConn(conn)
case CommandStatus:
err = binary.Write(conn, binary.BigEndian, c.options.StatusInterval)
if err != nil {
return E.Cause(err, "write interval")
}
2023-03-02 16:40:28 +08:00
c.handler.Connected()
2023-03-01 10:37:47 +08:00
go c.handleStatusConn(conn)
}
return nil
}
func (c *CommandClient) Disconnect() error {
return common.Close(c.conn)
}