aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2023-04-13 09:01:57 +1000
committerSteve Bennett <steveb@workware.net.au>2023-07-04 09:23:43 +1000
commit3269290b6af18ae96b1624e79b30abcb869d0420 (patch)
tree1689cec21c7cb7d31032d300529ce6e5552b8678
parent0b4d1a85205500543835840907c0c17ce75ede21 (diff)
downloadjimtcl-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.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/jim-aio.c b/jim-aio.c
index 17b394d..e3d0e96 100644
--- a/jim-aio.c
+++ b/jim-aio.c
@@ -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)