// Frontend: Connection functions for programs using the safcm library // Copyright (C) 2021 Simon Ruderich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . package frontend import ( "fmt" "ruderich.org/simon/safcm" "ruderich.org/simon/safcm/rpc" ) // SendRecv sends a message for host over conn and waits for the response. Any // MsgLog messages received before the final (non MsgLog) response are passed // to l.Log. func (l *Loop) SendRecv(host Host, conn *rpc.Conn, msg safcm.Msg) ( safcm.Msg, error) { err := conn.Send(msg) if err != nil { return nil, err } for { x, err := conn.Recv() if err != nil { return nil, err } log, ok := x.(safcm.MsgLog) if ok { l.Log(host, log.Level, false, log.Text) continue } return x, nil } } // HostInfoMsg sends a MsgInfoReq for host via conn and returns the resulting // MsgInfoResp. func (l *Loop) HostInfoMsg(host Host, conn *rpc.Conn, req safcm.MsgInfoReq) ( safcm.MsgInfoResp, error) { var empty safcm.MsgInfoResp x, err := l.SendRecv(host, conn, req) if err != nil { return empty, err } resp, ok := x.(safcm.MsgInfoResp) if !ok { return empty, fmt.Errorf("unexpected response %v", x) } return resp, nil } // HostSyncMsg sends a MsgSyncReq for host via conn and returns the resulting // MsgSyncResp. func (l *Loop) HostSyncMsg(host Host, conn *rpc.Conn, req safcm.MsgSyncReq) ( safcm.MsgSyncResp, error) { var empty safcm.MsgSyncResp x, err := l.SendRecv(host, conn, req) if err != nil { return empty, err } resp, ok := x.(safcm.MsgSyncResp) if !ok { return empty, fmt.Errorf("unexpected response %v", x) } return resp, nil }