about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2025-01-12 17:38:33 +0100
committerbptato <nincsnevem662@gmail.com>2025-01-12 17:38:33 +0100
commitd9a38ff69875fb0f799218d628ce97da6fa60f41 (patch)
tree8661249b9931f9b813811dbd6589ef399fd27bc9 /src
parent60f26ec6c42a29fee4c4fc33fc7a171fa6114ccc (diff)
downloadchawan-d9a38ff69875fb0f799218d628ce97da6fa60f41.tar.gz
dynstream: remove superfluous zeroMem, add sendFds/recvFds
Diffstat (limited to 'src')
-rw-r--r--src/io/bufreader.nim3
-rw-r--r--src/io/bufwriter.nim3
-rw-r--r--src/io/dynstream.nim53
3 files changed, 33 insertions, 26 deletions
diff --git a/src/io/bufreader.nim b/src/io/bufreader.nim
index 8b65af91..86ed1aed 100644
--- a/src/io/bufreader.nim
+++ b/src/io/bufreader.nim
@@ -36,8 +36,7 @@ proc initReader*(stream: DynStream; len, auxLen: int): BufferedReader =
   stream.recvDataLoop(reader.buffer)
   if auxLen > 0:
     # bufwriter added ancillary data.
-    var dummy = [0u8]
-    SocketStream(stream).recvMsg(dummy, reader.recvAux)
+    SocketStream(stream).recvFds(reader.recvAux)
   return reader
 
 proc initPacketReader*(stream: DynStream): BufferedReader =
diff --git a/src/io/bufwriter.nim b/src/io/bufwriter.nim
index 37827561..89b5345c 100644
--- a/src/io/bufwriter.nim
+++ b/src/io/bufwriter.nim
@@ -57,8 +57,7 @@ proc flush*(writer: var BufferedWriter) =
   writer.stream.sendDataLoop(writer.buffer, writer.bufLen)
   if writer.sendAux.len > 0:
     writer.sendAux.reverse()
-    let dummy = [0u8]
-    SocketStream(writer.stream).sendMsg(dummy, writer.sendAux)
+    SocketStream(writer.stream).sendFds(writer.sendAux)
   writer.bufLen = 0
 
 proc deinit*(writer: var BufferedWriter) =
diff --git a/src/io/dynstream.nim b/src/io/dynstream.nim
index 478b6044..55a73061 100644
--- a/src/io/dynstream.nim
+++ b/src/io/dynstream.nim
@@ -90,6 +90,11 @@ proc recvAll*(s: DynStream): string =
   buffer.setLen(idx)
   return buffer
 
+proc setEnd(s: DynStream) =
+  if unlikely(s.isend):
+    raise newException(EOFError, "eof")
+  s.isend = true
+
 type
   PosixStream* = ref object of DynStream
     fd*: cint
@@ -126,9 +131,7 @@ method recvData*(s: PosixStream; buffer: pointer; len: int): int =
   if n < 0:
     raisePosixIOError()
   if n == 0:
-    if unlikely(s.isend):
-      raise newException(EOFError, "eof")
-    s.isend = true
+    s.setEnd()
   return n
 
 proc sreadChar*(s: PosixStream): char =
@@ -354,7 +357,7 @@ proc setCloseOnExec*(ps: PosixStream) =
 type SocketStream* = ref object of PosixStream
 
 proc sendMsg*(s: SocketStream; buffer: openArray[uint8];
-    sendAux: openArray[cint]) =
+    sendAux: openArray[cint]): int =
   var dummy = 0u8
   var iov = IOVec(iov_base: addr dummy, iov_len: 1)
   if buffer.len > 0:
@@ -362,12 +365,12 @@ proc sendMsg*(s: SocketStream; buffer: openArray[uint8];
   let sendAuxSize = sizeof(cint) * sendAux.len
   let controlLen = CMSG_SPACE(csize_t(sendAuxSize))
   var cmsgBuf = if controlLen > 0: alloc(controlLen) else: nil
-  var hdr = Tmsghdr()
-  zeroMem(addr hdr, sizeof(hdr))
-  hdr.msg_iov = addr iov
-  hdr.msg_iovlen = 1
-  hdr.msg_control = cmsgBuf
-  hdr.msg_controllen = SockLen(controlLen)
+  var hdr = Tmsghdr(
+    msg_iov: addr iov,
+    msg_iovlen: 1,
+    msg_control: cmsgBuf,
+    msg_controllen: SockLen(controlLen)
+  )
   let cmsg = CMSG_FIRSTHDR(addr hdr)
   cmsg.cmsg_len = SockLen(CMSG_LEN(csize_t(sendAuxSize)))
   cmsg.cmsg_level = SOL_SOCKET
@@ -379,11 +382,12 @@ proc sendMsg*(s: SocketStream; buffer: openArray[uint8];
     dealloc(cmsgBuf)
   if n < 0:
     raisePosixIOError()
-  if n < buffer.len:
-    raise newException(EOFError, "eof")
+  if n == 0:
+    s.setEnd()
+  return n
 
 proc recvMsg*(s: SocketStream; buffer: var openArray[uint8];
-    recvAux: var openArray[cint]) =
+    recvAux: var openArray[cint]): int =
   var dummy {.noinit.}: uint8
   var iov = IOVec(iov_base: addr dummy, iov_len: 1)
   if buffer.len > 0:
@@ -391,12 +395,12 @@ proc recvMsg*(s: SocketStream; buffer: var openArray[uint8];
   let recvAuxSize = sizeof(cint) * recvAux.len
   let controlLen = CMSG_SPACE(csize_t(recvAuxSize))
   var cmsgBuf = if controlLen > 0: alloc(controlLen) else: nil
-  var hdr = Tmsghdr()
-  zeroMem(addr hdr, sizeof(hdr))
-  hdr.msg_iov = addr iov
-  hdr.msg_iovlen = 1
-  hdr.msg_control = cmsgBuf
-  hdr.msg_controllen = SockLen(controlLen)
+  var hdr = Tmsghdr(
+    msg_iov: addr iov,
+    msg_iovlen: 1,
+    msg_control: cmsgBuf,
+    msg_controllen: SockLen(controlLen)
+  )
   let n = recvmsg(SocketHandle(s.fd), addr hdr, 0)
   if n < 0:
     if cmsgBuf != nil:
@@ -412,6 +416,13 @@ proc recvMsg*(s: SocketStream; buffer: var openArray[uint8];
   if cmsgBuf != nil:
     dealloc(cmsgBuf)
 
+proc sendFds*(s: SocketStream; fds: openArray[cint]) =
+  discard s.sendMsg([], fds)
+
+proc recvFds*(s: SocketStream; fds: var openArray[cint]) =
+  var dummy {.noinit.}: array[1, uint8]
+  discard s.recvMsg(dummy, fds)
+
 method seek*(s: SocketStream; off: int) =
   doAssert false
 
@@ -478,9 +489,7 @@ type
 method recvData*(s: DynFileStream; buffer: pointer; len: int): int =
   let n = s.file.readBuffer(buffer, len)
   if n == 0:
-    if unlikely(s.isend):
-      raise newException(EOFError, "eof")
-    s.isend = true
+    s.setEnd()
   return n
 
 method sendData*(s: DynFileStream; buffer: pointer; len: int): int =