diff options
author | bptato <nincsnevem662@gmail.com> | 2024-10-14 18:04:31 +0200 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2024-10-14 18:47:20 +0200 |
commit | a4c8194e8cd941c374f1cee3a3f93c8d9993c541 (patch) | |
tree | fe8227f3459da19dbdf3492e338f26543fd4de0c /src/io | |
parent | 4508e3d325bdbaabbc3f20e57a04d04419ec37f4 (diff) | |
download | chawan-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.nim | 28 | ||||
-rw-r--r-- | src/io/stdio.nim | 25 |
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) |