about summary refs log tree commit diff stats
path: root/src/io
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-10-14 18:04:31 +0200
committerbptato <nincsnevem662@gmail.com>2024-10-14 18:47:20 +0200
commita4c8194e8cd941c374f1cee3a3f93c8d9993c541 (patch)
treefe8227f3459da19dbdf3492e338f26543fd4de0c /src/io
parent4508e3d325bdbaabbc3f20e57a04d04419ec37f4 (diff)
downloadchawan-a4c8194e8cd941c374f1cee3a3f93c8d9993c541.tar.gz
pager: refactor mailcap, console; misc fixes
* use more PosixStream (because it has double-close checking)
* factor out some common mailcap operations
* move console from client to pager
* fix case-insensitive mime type matching
* replace convoluted fdin/fdout comparison logic (that only accidentally
  worked) with a boolean flag
Diffstat (limited to 'src/io')
-rw-r--r--src/io/dynstream.nim28
-rw-r--r--src/io/stdio.nim25
2 files changed, 28 insertions, 25 deletions
diff --git a/src/io/dynstream.nim b/src/io/dynstream.nim
index 4138f153..56faf202 100644
--- a/src/io/dynstream.nim
+++ b/src/io/dynstream.nim
@@ -163,6 +163,34 @@ method sclose*(s: PosixStream) =
   discard close(s.fd)
   s.closed = true
 
+proc closeHandle(fd, flags: cint) =
+  let devnull = open("/dev/null", flags)
+  doAssert devnull != -1
+  if devnull != fd:
+    discard dup2(devnull, fd)
+    discard close(devnull)
+
+proc closeStdin*() =
+  closeHandle(0, O_RDONLY)
+
+proc closeStdout*() =
+  closeHandle(1, O_WRONLY)
+
+proc closeStderr*() =
+  closeHandle(2, O_WRONLY)
+
+# When closing, ensure that no standard input stream ends up without a
+# handle to write to.
+#TODO do we really need this? I'm pretty sure I dup2 to every stream on
+# fork in all processes...
+proc safeClose*(ps: PosixStream) =
+  if ps.fd == 0:
+    closeStdin()
+  elif ps.fd == 1 or ps.fd == 2:
+    closeHandle(ps.fd, O_WRONLY)
+  else:
+    ps.sclose()
+
 proc newPosixStream*(fd: FileHandle): PosixStream =
   return PosixStream(fd: cint(fd), blocking: true)
 
diff --git a/src/io/stdio.nim b/src/io/stdio.nim
deleted file mode 100644
index 729b50f6..00000000
--- a/src/io/stdio.nim
+++ /dev/null
@@ -1,25 +0,0 @@
-import std/posix
-
-proc closeHandle(fd, flags: cint) =
-  let devnull = open("/dev/null", flags)
-  doAssert devnull != -1
-  if devnull != fd:
-    discard dup2(devnull, fd)
-    discard close(devnull)
-
-proc closeStdin*() =
-  closeHandle(0, O_RDONLY)
-
-proc closeStdout*() =
-  closeHandle(1, O_WRONLY)
-
-proc closeStderr*() =
-  closeHandle(2, O_WRONLY)
-
-proc safeClose*(fd: cint) =
-  if fd == 0:
-    closeStdin()
-  elif fd == 1 or fd == 2:
-    closeHandle(fd, O_WRONLY)
-  else:
-    discard close(fd)