// Frontend: Connection functions for programs using the safcm library // SPDX-License-Identifier: GPL-3.0-or-later // Copyright (C) 2021-2024 Simon Ruderich 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 }