X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=rpc%2Fconn.go;h=3f7ade144c1c2905254da49eb7924552aa3c362d;hb=HEAD;hp=626a507f7e034ce57a0e3766f1fc93412499727c;hpb=04368d48cb28d32908276963fb7cb9d24e2ee311;p=safcm%2Fsafcm.git diff --git a/rpc/conn.go b/rpc/conn.go index 626a507..301ae2a 100644 --- a/rpc/conn.go +++ b/rpc/conn.go @@ -1,25 +1,14 @@ // Simple RPC-like protocol: implementation of connection and basic actions -// 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 . +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (C) 2021-2024 Simon Ruderich package rpc import ( "bufio" "fmt" + "io/fs" "os/exec" "strings" "sync" @@ -36,6 +25,8 @@ type Conn struct { sshRemote string sshOpts []string + remoteHelpers fs.FS + cmd *exec.Cmd conn *safcm.GobConn } @@ -55,7 +46,7 @@ type ConnEvent struct { } // NewConn creates a new connection. Events in the returned struct must be -// regularly read or the connection will stall. This must be done before +// regularly read or the connection will hang. This must be done before // DialSSH is called to open a connection. func NewConn(debug bool) *Conn { ch := make(chan ConnEvent) @@ -124,15 +115,20 @@ func (c *Conn) wait() error { } // Kill forcefully terminates the connection. It's safe to call Kill (and -// Wait) multiple times. +// Wait) multiple times. Calling it before Dial*() was called will only close +// the Events channel. func (c *Conn) Kill() error { if c.cmd == nil { + if c.events != nil { + close(c.events) + c.events = nil + } return fmt.Errorf("Dial*() not called or already terminated") } c.debugf("Kill: killing connection") - c.cmd.Process.Kill() + c.cmd.Process.Kill() //nolint:errcheck return c.wait() }