PATCH 2/3: Add zsocket -s to shutdown() a socket fd

Mikael Magnusson <[email protected]>
Newsgroups gmane.comp.shells.zsh.devel
Message-ID <[email protected]>
---
 Doc/Zsh/mod_socket.yo |  7 ++++++-
 Src/Modules/socket.c  | 13 ++++++++++++-
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/Doc/Zsh/mod_socket.yo b/Doc/Zsh/mod_socket.yo
index 78d9254e8d..2c699b1d12 100644
--- a/Doc/Zsh/mod_socket.yo
+++ b/Doc/Zsh/mod_socket.yo
@@ -7,7 +7,7 @@ startitem()
 findex(zsocket)
 cindex(sockets)
 cindex(sockets, Unix domain)
-item(tt(zsocket) [ tt(-altv) ] [ tt(-d) var(fd) ] [ var(args) ])(
+item(tt(zsocket) [ tt(-alstv) ] [ tt(-d) var(fd) ] [ var(args) ])(
 tt(zsocket) is implemented as a builtin to allow full use of shell
 command line editing, file I/O, and job control mechanisms.
 )
@@ -33,6 +33,11 @@ File descriptors can be closed with normal shell syntax when no longer
 needed, for example:
 
 example(exec {REPLY}>&-)
+
+The tt(zsocket -s var(fd)) command may also be used to shut down a
+socket fd before closing it. This will send an EOF to the other side,
+while this side can still read their subsequent response before closing
+the connection fully, for example.
 )
 enditem()
 
diff --git a/Src/Modules/socket.c b/Src/Modules/socket.c
index 4f2a6ecbfa..2c8a48c286 100644
--- a/Src/Modules/socket.c
+++ b/Src/Modules/socket.c
@@ -229,6 +229,17 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func))
 	if (verbose)
 	    printf("new connection from %s is on fd %d\n", soun.sun_path, sfd);
     }
+    else if (OPT_ISSET(ops,'s'))
+    {
+	if (!args[0]) {
+	    zwarnnam(nam, "-s requires an argument");
+	    return 1;
+	}
+
+	int err = shutdown(atoi(args[0]), SHUT_WR);
+	if (err)
+	    zwarn("shutdown failed: %e", errno);
+    }
     else
     {
 	if (!args[0]) {
@@ -282,7 +293,7 @@ bin_zsocket(char *nam, char **args, Options ops, UNUSED(int func))
 }
 
 static struct builtin bintab[] = {
-    BUILTIN("zsocket", 0, bin_zsocket, 0, 3, 0, "ad:ltv", NULL),
+    BUILTIN("zsocket", 0, bin_zsocket, 0, 3, 0, "ad:lstv", NULL),
 };
 
 static struct features module_features = {
-- 
2.38.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.