about summary refs log tree commit diff stats
path: root/src/server
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2023-12-21 21:56:46 +0100
committerbptato <nincsnevem662@gmail.com>2023-12-21 23:17:00 +0100
commit2e1f31470dd0bd092f2ebcbda9ddcdaa3067beb7 (patch)
tree432207cf29737cac561c3b3fff187d52f3c3f5e0 /src/server
parentaad2c9860410cdbe0a80b48aba74437994cfd3e1 (diff)
downloadchawan-2e1f31470dd0bd092f2ebcbda9ddcdaa3067beb7.tar.gz
buffer: clean up ssock on being killed
* use signal handlers to avoid littering tmpdir with dead sockets
* add connection reset error (for socketstream)
* convert some imports to new style
Diffstat (limited to 'src/server')
-rw-r--r--src/server/buffer.nim41
-rw-r--r--src/server/forkserver.nim17
2 files changed, 37 insertions, 21 deletions
diff --git a/src/server/buffer.nim b/src/server/buffer.nim
index 49624fb8..1c5f5ea2 100644
--- a/src/server/buffer.nim
+++ b/src/server/buffer.nim
@@ -1,13 +1,13 @@
-import macros
-import nativesockets
-import net
-import options
-import os
-import posix
-import selectors
-import streams
-import tables
-import unicode
+import std/macros
+import std/nativesockets
+import std/net
+import std/options
+import std/os
+import std/posix
+import std/selectors
+import std/streams
+import std/tables
+import std/unicode
 
 import bindings/quickjs
 import config/config
@@ -119,6 +119,7 @@ type
     hovertext: array[HoverType, string]
     estream: Stream # error stream
     ishtml: bool
+    ssock: ServerSocket
 
   InterfaceOpaque = ref object
     stream: Stream
@@ -995,6 +996,7 @@ proc clone*(buffer: Buffer, newurl: URL): Pid {.proxy.} =
       buffer.istream = newPosixStream(pipefd_write[0])
     buffer.pstream.close()
     let ssock = initServerSocket(buffered = false)
+    buffer.ssock = ssock
     ps.write(char(0))
     buffer.source.location = newurl
     for it in buffer.tasks.mitems:
@@ -1730,7 +1732,7 @@ proc handleRead(buffer: Buffer, fd: int) =
   if fd == buffer.rfd:
     try:
       buffer.readCommand()
-    except EOFError:
+    except ErrorConnectionReset, EOFError:
       #eprint "EOF error", $buffer.url & "\nMESSAGE:",
       #       getCurrentExceptionMsg() & "\n",
       #       getStackTrace(getCurrentException())
@@ -1785,6 +1787,12 @@ proc runBuffer(buffer: Buffer) =
         buffer.do_reshape()
     buffer.loader.unregistered.setLen(0)
 
+proc cleanup(buffer: Buffer) =
+  buffer.pstream.close()
+  buffer.ssock.close()
+  buffer.loader.unref()
+
+var gbuffer: Buffer
 proc launchBuffer*(config: BufferConfig, source: BufferSource,
     attrs: WindowAttributes, loader: FileLoader, ssock: ServerSocket) =
   let socks = ssock.acceptSocketStream()
@@ -1802,8 +1810,13 @@ proc launchBuffer*(config: BufferConfig, source: BufferSource,
     selector: newSelector[int](),
     estream: newFileStream(stderr),
     pstream: socks,
-    rfd: int(socks.source.getFd())
+    rfd: int(socks.source.getFd()),
+    ssock: ssock
   )
+  gbuffer = buffer
+  onSignal SIGTERM, SIGINT:
+    discard sig
+    gbuffer.cleanup()
   buffer.srenderer = newStreamRenderer(buffer.sstream, buffer.charsets)
   loader.registerFun = proc(fd: int) =
     buffer.selector.registerHandle(fd, {Read}, 0)
@@ -1814,7 +1827,5 @@ proc launchBuffer*(config: BufferConfig, source: BufferSource,
       buffer.attrs, proc(url: URL) = buffer.navigate(url), some(buffer.loader))
   buffer.selector.registerHandle(buffer.rfd, {Read}, 0)
   buffer.runBuffer()
-  buffer.pstream.close()
-  buffer.loader.unref()
-  ssock.close()
+  buffer.cleanup()
   quit(0)
diff --git a/src/server/forkserver.nim b/src/server/forkserver.nim
index 7da7d3f6..79fa2ed1 100644
--- a/src/server/forkserver.nim
+++ b/src/server/forkserver.nim
@@ -1,9 +1,7 @@
-import options
-import streams
-import tables
-
-when defined(posix):
-  import posix
+import std/options
+import std/posix
+import std/streams
+import std/tables
 
 import config/config
 import display/winattrs
@@ -103,6 +101,7 @@ proc forkLoader(ctx: var ForkServerContext, config: LoaderConfig): Pid =
   discard close(pipefd[0])
   return pid
 
+var gssock: ServerSocket
 proc forkBuffer(ctx: var ForkServerContext): Pid =
   var source: BufferSource
   var config: BufferConfig
@@ -127,6 +126,12 @@ proc forkBuffer(ctx: var ForkServerContext): Pid =
     zeroMem(addr ctx, sizeof(ctx))
     discard close(pipefd[0]) # close read
     let ssock = initServerSocket(buffered = false)
+    gssock = ssock
+    onSignal SIGTERM, SIGINT:
+      # This will be overridden after buffer has been set up; it is only
+      # necessary to avoid a race condition when buffer is killed before that.
+      discard sig
+      gssock.close()
     let ps = newPosixStream(pipefd[1])
     ps.write(char(0))
     ps.close()