cloudinit/vendor/github.com/sigma/vmw-guestinfo/message/message.go

58 lines
1.5 KiB
Go
Raw Normal View History

package message
import (
"errors"
"github.com/sigma/vmw-guestinfo/bridge"
)
var (
// ErrChannelOpen represents a failure to open a channel
ErrChannelOpen = errors.New("could not open channel")
// ErrChannelClose represents a failure to close a channel
ErrChannelClose = errors.New("could not close channel")
// ErrRpciSend represents a failure to send a message
ErrRpciSend = errors.New("unable to send RPCI command")
// ErrRpciReceive represents a failure to receive a message
ErrRpciReceive = errors.New("unable to receive RPCI command result")
)
// Channel is a communication channel between hypervisor and virtual machine
type Channel struct {
privChan bridge.MessageChannel
}
// NewChannel opens a new channel
func NewChannel(proto uint32) (*Channel, error) {
if channel := bridge.MessageOpen(proto); channel != nil {
return &Channel{
privChan: channel,
}, nil
}
return nil, ErrChannelOpen
}
// Close the channel
func (c *Channel) Close() error {
if status := bridge.MessageClose(bridge.MessageChannel(c.privChan)); status {
return nil
}
return ErrChannelClose
}
// Send a request
func (c *Channel) Send(request []byte) error {
if status := bridge.MessageSend(bridge.MessageChannel(c.privChan), request); status {
return nil
}
return ErrRpciSend
}
// Receive a response
func (c *Channel) Receive() ([]byte, error) {
if res, status := bridge.MessageReceive(bridge.MessageChannel(c.privChan)); status {
return res, nil
}
return nil, ErrRpciReceive
}