about summary refs log tree commit diff stats
path: root/src/ips
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2023-08-13 17:42:34 +0200
committerbptato <nincsnevem662@gmail.com>2023-08-13 17:54:05 +0200
commitd526deb99e44f2a8d1a9c3eea60676703dd64302 (patch)
treef63689ff7654d14ad9bca182a837b3155b2471a0 /src/ips
parentf92e30232252deb194596e7c298cc7fcf56517cb (diff)
downloadchawan-d526deb99e44f2a8d1a9c3eea60676703dd64302.tar.gz
Add mailcap, mime.types & misc refactorings
* add mailcap: works with copiousoutput, needsterminal, etc.
* add mime.types (only works with mailcap)
* refactor pipeBuffer
* remove "dispatcher"
* fix bug in directory display where baseurl would not be used
Diffstat (limited to 'src/ips')
-rw-r--r--src/ips/editor.nim10
-rw-r--r--src/ips/forkserver.nim18
-rw-r--r--src/ips/socketstream.nim5
3 files changed, 18 insertions, 15 deletions
diff --git a/src/ips/editor.nim b/src/ips/editor.nim
index a6a6623c..19ba965a 100644
--- a/src/ips/editor.nim
+++ b/src/ips/editor.nim
@@ -3,6 +3,7 @@ import posix
 
 import config/config
 import display/term
+import io/tempfile
 
 func formatEditorName(editor, file: string, line: int): string =
   result = newStringOfCap(editor.len + file.len)
@@ -55,17 +56,10 @@ proc openEditor*(term: Terminal, config: Config, file: string, line = 1): bool =
       result = WIFSIGNALED(wstatus) and WTERMSIG(wstatus) == SIGINT
   term.restart()
 
-var tmpf_seq: int
 proc openInEditor*(term: Terminal, config: Config, input: var string): bool =
   try:
     let tmpdir = config.external.tmpdir
-    if not dirExists(tmpdir):
-      createDir(tmpdir)
-    var tmpf = tmpdir / "chatmp" & $tmpf_seq
-    while fileExists(tmpf):
-      inc tmpf_seq
-      tmpf = tmpdir / "chatmp" & $tmpf_seq
-    inc tmpf_seq
+    let tmpf = getTempFile(tmpdir)
     if input != "":
       writeFile(tmpf, input)
     if openEditor(term, config, tmpf):
diff --git a/src/ips/forkserver.nim b/src/ips/forkserver.nim
index 62d41198..ec0c60d1 100644
--- a/src/ips/forkserver.nim
+++ b/src/ips/forkserver.nim
@@ -1,5 +1,6 @@
 import options
 import streams
+import tables
 
 when defined(posix):
   import posix
@@ -36,7 +37,6 @@ type
 proc newFileLoader*(forkserver: ForkServer, defaultHeaders: Headers = nil,
     filter = newURLFilter(default = true), cookiejar: CookieJar = nil,
     proxy: URL = nil, acceptProxy = false): FileLoader =
-  new(result)
   forkserver.ostream.swrite(FORK_LOADER)
   var defaultHeaders = defaultHeaders
   if defaultHeaders == nil:
@@ -51,7 +51,9 @@ proc newFileLoader*(forkserver: ForkServer, defaultHeaders: Headers = nil,
   )
   forkserver.ostream.swrite(config)
   forkserver.ostream.flush()
-  forkserver.istream.sread(result.process)
+  var process: Pid
+  forkserver.istream.sread(process)
+  return FileLoader(process: process)
 
 proc loadForkServerConfig*(forkserver: ForkServer, config: Config) =
   forkserver.ostream.swrite(LOAD_CONFIG)
@@ -117,7 +119,8 @@ proc forkBuffer(ctx: var ForkServerContext): Pid =
       filter: config.filter,
       cookiejar: config.cookiejar,
       referrerpolicy: config.referrerpolicy,
-      proxy: config.proxy
+      #TODO these should be in a separate config I think
+      proxy: config.proxy,
     )
   )
   let pid = fork()
@@ -190,7 +193,6 @@ proc runForkServer() =
   quit(0)
 
 proc newForkServer*(): ForkServer =
-  new(result)
   var pipefd_in: array[2, cint] # stdin in forkserver
   var pipefd_out: array[2, cint] # stdout in forkserver
   var pipefd_err: array[2, cint] # stderr in forkserver
@@ -230,7 +232,9 @@ proc newForkServer*(): ForkServer =
       raise newException(Defect, "Failed to open output handle")
     if not open(readf, pipefd_out[0], fmRead):
       raise newException(Defect, "Failed to open input handle")
-    result.ostream = newFileStream(writef)
-    result.istream = newFileStream(readf)
-    result.estream = newPosixStream(pipefd_err[0])
     discard fcntl(pipefd_err[0], F_SETFL, fcntl(pipefd_err[0], F_GETFL, 0) or O_NONBLOCK)
+    return ForkServer(
+      ostream: newFileStream(writef),
+      istream: newFileStream(readf),
+      estream: newPosixStream(pipefd_err[0])
+    )
diff --git a/src/ips/socketstream.nim b/src/ips/socketstream.nim
index 88023f07..09a3ef5c 100644
--- a/src/ips/socketstream.nim
+++ b/src/ips/socketstream.nim
@@ -57,6 +57,7 @@ proc sockClose(s: Stream) = {.cast(tags: []).}: #...sigh
 
 # See https://stackoverflow.com/a/4491203
 proc sendFileHandle*(s: SocketStream, fd: FileHandle) =
+  assert not s.source.hasDataBuffered
   var hdr: Tmsghdr
   var iov: IOVec
   var space: csize_t
@@ -90,6 +91,7 @@ proc sendFileHandle*(s: SocketStream, fd: FileHandle) =
   assert n == int(iov.iov_len) #TODO remove this
 
 proc recvFileHandle*(s: SocketStream): FileHandle =
+  assert not s.source.hasDataBuffered
   var iov: IOVec
   var hdr: Tmsghdr
   var buf: char
@@ -119,6 +121,9 @@ func newSocketStream*(): SocketStream =
   result.atEndImpl = sockAtEnd
   result.closeImpl = sockClose
 
+proc setBlocking*(ss: SocketStream, blocking: bool) =
+  ss.source.getFd().setBlocking(blocking)
+
 proc connectSocketStream*(path: string, buffered = true, blocking = true): SocketStream =
   result = newSocketStream()
   result.blk = blocking