X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=rpc%2Fconn.go;h=3f7ade144c1c2905254da49eb7924552aa3c362d;hb=2804606f9f8dc5078c38580bac363b47eb638620;hp=65226121b3e1006586335d37ed99b20ac0d6813a;hpb=825f928d824f728088606bcbf112d30d7a76f627;p=safcm%2Fsafcm.git diff --git a/rpc/conn.go b/rpc/conn.go index 6522612..3f7ade1 100644 --- a/rpc/conn.go +++ b/rpc/conn.go @@ -20,6 +20,7 @@ package rpc import ( "bufio" "fmt" + "io/fs" "os/exec" "strings" "sync" @@ -32,10 +33,12 @@ type Conn struct { events chan<- ConnEvent // same as Events, to publish events eventsWg sync.WaitGroup - debug bool + debug bool sshRemote string sshOpts []string + remoteHelpers fs.FS + cmd *exec.Cmd conn *safcm.GobConn } @@ -55,7 +58,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,9 +127,14 @@ 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") }