X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=rpc%2Fconn.go;h=9fbb9c47996d44516e781f6f6bc914cbba2f8319;hb=d109a6151f48fc9e322bacbd3cc5e4f00eade713;hp=c59bbd323272b50b150fa5d6671d61bdf022b800;hpb=f2f2bc47e8729548f3c10117f7f008b547c4afc5;p=safcm%2Fsafcm.git diff --git a/rpc/conn.go b/rpc/conn.go index c59bbd3..9fbb9c4 100644 --- a/rpc/conn.go +++ b/rpc/conn.go @@ -1,6 +1,6 @@ // Simple RPC-like protocol: implementation of connection and basic actions -// Copyright (C) 2021 Simon Ruderich +// Copyright (C) 2021-2023 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 @@ -20,6 +20,7 @@ package rpc import ( "bufio" "fmt" + "io/fs" "os/exec" "strings" "sync" @@ -32,8 +33,11 @@ type Conn struct { events chan<- ConnEvent // same as Events, to publish events eventsWg sync.WaitGroup - debug bool - remote string + debug bool + sshRemote string + sshOpts []string + + remoteHelpers fs.FS cmd *exec.Cmd conn *safcm.GobConn @@ -42,10 +46,10 @@ type Conn struct { type ConnEventType int const ( - _ ConnEventType = iota - ConnEventStderr - ConnEventDebug - ConnEventUpload + _ ConnEventType = iota + ConnEventStderr // stderr from spawned process + ConnEventDebug // debug message + ConnEventUpload // remote helper upload in progress ) type ConnEvent struct { @@ -54,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) @@ -123,15 +127,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() }