11
type RunOptions struct {
12
MessageType SocketMessageType
16
DaemonOperationTimeout time.Duration
17
DaemonSocketConnectionTimeout time.Duration
20
func getMessage(messageType SocketMessageType, messageArgs []string) ([]byte, error) {
21
switch len(messageArgs) {
23
return binary.BigEndian.AppendUint16(messageType.ToBytes(), uint16(3)), nil
25
res := binary.BigEndian.AppendUint16(messageType.ToBytes(), uint16(len(messageArgs[0])+3))
26
return append(res, []byte(messageArgs[0])...), nil
29
messageBody, err := ArgsToBytes(messageArgs...)
33
res := binary.BigEndian.AppendUint16(messageType.ToBytes(), uint16(len(messageBody)+3))
34
return append(res, messageBody...), nil
37
func SendCommand(opts *RunOptions) (SocketMessageType, error) {
38
ctx, cancel := context.WithTimeout(context.Background(), opts.DaemonSocketConnectionTimeout)
41
dialer := net.Dialer{}
42
daemonAddr := net.UnixAddr{Name: opts.SocketName, Net: "unix"}
43
socketConnection, err := dialer.DialContext(ctx, "unix", daemonAddr.String())
45
return ErrorType, fmt.Errorf("unix socket dial error: %w", err)
47
defer socketConnection.Close()
48
err = socketConnection.SetDeadline(time.Now().Add(opts.DaemonOperationTimeout))
50
return ErrorType, fmt.Errorf("unix socket set deadline error: %w", err)
53
msg, err := getMessage(opts.MessageType, opts.MessageArgs)
57
_, err = socketConnection.Write(msg)
59
return ErrorType, fmt.Errorf("unix socket write error: %w", err)
62
resp := make([]byte, 512)
63
n, err := socketConnection.Read(resp)
65
return ErrorType, fmt.Errorf("unix socket read error: %w", err)
68
return ErrorType, fmt.Errorf("daemon response error [message type: %v, args: %v]", string(opts.MessageType), opts.MessageArgs)
70
if !OkType.IsEqual(resp[0]) {
71
return SocketMessageType(resp[0]), fmt.Errorf("daemon command run error [message type: %v, args: %v, daemon response: %v]",
72
string(opts.MessageType), opts.MessageArgs, string(resp[0]))