about summary refs log tree commit diff stats
path: root/src/local
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-03-14 17:53:48 +0100
committerbptato <nincsnevem662@gmail.com>2025-03-14 17:53:48 +0100
commit4a79d029f5753bbbdd28b735327cdabd724c356d (patch)
tree76ce9b01de76842997bbe3a875a83e07d0c4e395 /src/local
parentc7e0c4f634447d9fcf3201a324787f38da661890 (diff)
downloadchawan-4a79d029f5753bbbdd28b735327cdabd724c356d.tar.gz
forkserver: clean up, do not panic on forkBuffer failure
I've removed the SIGINT trap because the fork server is now in a
separate process group than the main process anyway.  We'll see if this
actually works...

Also realized we weren't closing the fork server's control stream on
fork; now we do.
Diffstat (limited to 'src/local')
-rw-r--r--src/local/pager.nim18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/local/pager.nim b/src/local/pager.nim
index 13c57f2b..737a13ac 100644
--- a/src/local/pager.nim
+++ b/src/local/pager.nim
@@ -2690,19 +2690,23 @@ proc connected2(pager: Pager; container: Container; res: MailcapResult;
       url = newURL(url)
       url.username = ""
       url.password = ""
-    let (pid, fd) = pager.forkserver.forkBuffer(
+    let (pid, cstream) = pager.forkserver.forkBuffer(
       container.config,
       url,
       attrs,
       cmfHTML in res.flags,
       container.charsetStack
     )
-    container.process = pid
-    if container.replace != nil:
-      pager.deleteContainer(container.replace, container.find(ndAny))
-      container.replace = nil
-    pager.connected3(container, newSocketStream(fd), res.ostream,
-      response.outputId, res.ostreamOutputId, cmfRedirected in res.flags)
+    if pid == -1:
+      res.ostream.sclose()
+      pager.fail(container, "Error forking new process for buffer")
+    else:
+      container.process = pid
+      if container.replace != nil:
+        pager.deleteContainer(container.replace, container.find(ndAny))
+        container.replace = nil
+      pager.connected3(container, cstream, res.ostream, response.outputId,
+        res.ostreamOutputId, cmfRedirected in res.flags)
   else:
     dec pager.numload
     pager.deleteContainer(container, container.find(ndAny))