You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
1.8 KiB

package ozinit
import (
"errors"
"fmt"
"github.com/subgraph/oz/ipc"
)
func clientConnect(addr string) (*ipc.MsgConn, error) {
return ipc.Connect(addr, messageFactory, nil)
}
func clientSend(addr string, msg interface{}) (*ipc.Message, error) {
c, err := clientConnect(addr)
if err != nil {
return nil, err
}
defer c.Close()
rr, err := c.ExchangeMsg(msg)
if err != nil {
return nil, err
}
resp := <-rr.Chan()
rr.Done()
return resp, nil
}
func Ping(addr string) error {
resp, err := clientSend(addr, new(PingMsg))
if err != nil {
return err
}
switch body := resp.Body.(type) {
case *PingMsg:
return nil
case *ErrorMsg:
return errors.New(body.Msg)
default:
return fmt.Errorf("Unexpected message received: %+v", body)
}
}
func RunProgram(addr, cpath, pwd string, args []string) error {
c, err := clientConnect(addr)
if err != nil {
return err
}
rr, err := c.ExchangeMsg(&RunProgramMsg{Path: cpath, Args: args, Pwd: pwd})
resp := <-rr.Chan()
rr.Done()
c.Close()
if err != nil {
return err
}
switch body := resp.Body.(type) {
case *ErrorMsg:
return errors.New(body.Msg)
case *OkMsg:
return nil
default:
return fmt.Errorf("Unexpected message type received: %+v", body)
}
}
func RunShell(addr, term string) (int, error) {
c, err := clientConnect(addr)
if err != nil {
return 0, err
}
rr, err := c.ExchangeMsg(&RunShellMsg{Term: term})
resp := <-rr.Chan()
rr.Done()
c.Close()
if err != nil {
return 0, err
}
switch body := resp.Body.(type) {
case *ErrorMsg:
return 0, errors.New(body.Msg)
case *OkMsg:
if len(resp.Fds) == 0 {
return 0, errors.New("RunShell message returned Ok, but no file descriptor received")
}
return resp.Fds[0], nil
default:
return 0, fmt.Errorf("Unexpected message type received: %+v", body)
}
}