diff options
author | Steve Bennett <steveb@workware.net.au> | 2023-04-13 09:01:57 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2023-07-04 09:23:43 +1000 |
commit | 3269290b6af18ae96b1624e79b30abcb869d0420 (patch) | |
tree | 1689cec21c7cb7d31032d300529ce6e5552b8678 | |
parent | 0b4d1a85205500543835840907c0c17ce75ede21 (diff) | |
download | jimtcl-3269290b6af18ae96b1624e79b30abcb869d0420.zip jimtcl-3269290b6af18ae96b1624e79b30abcb869d0420.tar.gz jimtcl-3269290b6af18ae96b1624e79b30abcb869d0420.tar.bz2 |
aio: support accept ?-noclose?
And also fix a minor bug that if unable to format the socket address
the file descriptor would be left open.
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim-aio.c | 14 |
1 files changed, 11 insertions, 3 deletions
@@ -1284,6 +1284,8 @@ static int aio_cmd_accept(Jim_Interp *interp, int argc, Jim_Obj *const *argv) union sockaddr_any sa; socklen_t salen = sizeof(sa); Jim_Obj *filenameObj; + int n = 0; + int flags = AIO_NODELETE; sock = accept(af->fd, &sa.sa, &salen); if (sock < 0) { @@ -1291,8 +1293,14 @@ static int aio_cmd_accept(Jim_Interp *interp, int argc, Jim_Obj *const *argv) return JIM_ERR; } - if (argc > 0) { - if (JimSetVariableSocketAddress(interp, argv[0], &sa, salen) != JIM_OK) { + if (argc > 0 && Jim_CompareStringImmediate(interp, argv[0], "-noclose")) { + flags = AIO_KEEPOPEN; + n++; + } + + if (argc > n) { + if (JimSetVariableSocketAddress(interp, argv[n], &sa, salen) != JIM_OK) { + close(sock); return JIM_ERR; } } @@ -1305,7 +1313,7 @@ static int aio_cmd_accept(Jim_Interp *interp, int argc, Jim_Obj *const *argv) /* Create the file command */ return JimMakeChannel(interp, sock, filenameObj, - "aio.sockstream%ld", af->addr_family, AIO_NODELETE) ? JIM_OK : JIM_ERR; + "aio.sockstream%ld", af->addr_family, flags) ? JIM_OK : JIM_ERR; } static int aio_cmd_sockname(Jim_Interp *interp, int argc, Jim_Obj *const *argv) |