From fd4dd42408856048dd71f83ae1f30e2ab84621da Mon Sep 17 00:00:00 2001 From: Robin Jarry Date: Sat, 27 Jan 2024 21:36:25 +0100 Subject: ipc: wait for app to be ready before accepting commands MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pass a cancellable context to the IPC server and defer accepting connections until the first worker message has been received by the main thread. This is not a real fix for the :split command not working at startup. :split requires a mail store to be present on the currently selected account tab+folder. I could have waited for a types.DirectoryContents message but it seems silly and bug prone since such a message may never arrive and we don't want to pool IPC messages forever. Also, a types.DirectoryContents message may arrive for one account but :split is only effective *per account* and the default selected account tab is the first one. In any case, this band aid prevents aerc from crashing or breaking down the terminal when running IPC commands in the aerc-startup hook. Fixes: https://lists.sr.ht/~rjarry/aerc-devel/%3CCYPN7AVYQ69S.WV0T67VM6WX3%40wegtam.com%3E Fixes: https://todo.sr.ht/~rjarry/aerc/173 Reported-by: Jens Grassel Reported-by: Justine Smithies Signed-off-by: Robin Jarry Tested-by: Thomas Böhler Reviewed-by: Thomas Böhler --- lib/ipc/receive.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/ipc/receive.go b/lib/ipc/receive.go index 47ffa89f..dbacc660 100644 --- a/lib/ipc/receive.go +++ b/lib/ipc/receive.go @@ -2,6 +2,7 @@ package ipc import ( "bufio" + "context" "errors" "net" "net/url" @@ -20,9 +21,10 @@ import ( type AercServer struct { listener net.Listener handler Handler + startup context.Context } -func StartServer(handler Handler) (*AercServer, error) { +func StartServer(handler Handler, startup context.Context) (*AercServer, error) { sockpath := xdg.RuntimePath("aerc.sock") // remove the socket if it is not connected to a session if err := ConnectAndExec(nil); err != nil { @@ -33,7 +35,7 @@ func StartServer(handler Handler) (*AercServer, error) { if err != nil { return nil, err } - as := &AercServer{listener: l, handler: handler} + as := &AercServer{listener: l, handler: handler, startup: startup} go as.Serve() return as, nil @@ -48,6 +50,8 @@ var lastId int64 = 0 // access via atomic func (as *AercServer) Serve() { defer log.PanicHandler() + <-as.startup.Done() + for { conn, err := as.listener.Accept() switch { -- cgit