diff options
author | bptato <nincsnevem662@gmail.com> | 2025-01-12 17:38:33 +0100 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2025-01-12 17:38:33 +0100 |
commit | d9a38ff69875fb0f799218d628ce97da6fa60f41 (patch) | |
tree | 8661249b9931f9b813811dbd6589ef399fd27bc9 /src | |
parent | 60f26ec6c42a29fee4c4fc33fc7a171fa6114ccc (diff) | |
download | chawan-d9a38ff69875fb0f799218d628ce97da6fa60f41.tar.gz |
dynstream: remove superfluous zeroMem, add sendFds/recvFds
Diffstat (limited to 'src')
-rw-r--r-- | src/io/bufreader.nim | 3 | ||||
-rw-r--r-- | src/io/bufwriter.nim | 3 | ||||
-rw-r--r-- | src/io/dynstream.nim | 53 |
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 = |