about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2002-05-30 15:16:18 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2002-05-30 15:16:18 +0000
commit69b570e28c63a0e7e3f9caaad58aa3a14f9958d9 (patch)
treeeb135094a9ee5061b2631998d3cb24e1d98fe729
parent4446df3dff7c75b7c771435f2613ec1df3a77bbd (diff)
downloadzsh-69b570e28c63a0e7e3f9caaad58aa3a14f9958d9.tar.gz
zsh-69b570e28c63a0e7e3f9caaad58aa3a14f9958d9.tar.xz
zsh-69b570e28c63a0e7e3f9caaad58aa3a14f9958d9.zip
17253: ztcp -L gives parseable information on tcp session
-rw-r--r--ChangeLog5
-rw-r--r--Doc/Zsh/mod_tcp.yo50
-rw-r--r--Src/Modules/tcp.c33
3 files changed, 78 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index df82bff5a..3ad80fe94 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2002-05-30  Peter Stephenson  <pws@csr.com>
+
+	* 17253: Src/Modules/tcp.c, Doc/Zsh/mod_tcp.c: ztcp -l provides
+	parseable information on sessions.
+
 2002-05-29  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 17252: Completion/Unix/Type/_path_files: fix for use of (z)
diff --git a/Doc/Zsh/mod_tcp.yo b/Doc/Zsh/mod_tcp.yo
index 7f117601f..2d37632fc 100644
--- a/Doc/Zsh/mod_tcp.yo
+++ b/Doc/Zsh/mod_tcp.yo
@@ -7,12 +7,60 @@ startitem()
 findex(ztcp)
 cindex(TCP)
 cindex(sockets, TCP)
-item(tt(ztcp) [ tt(-acdfltv) ] [ var(args) ])(
+item(tt(ztcp) [ tt(-acdflLtv) ] [ var(args) ])(
 tt(ztcp) is implemented as a builtin to allow full use of shell
 command line editing, file I/O, and job control mechanisms.
 
 If tt(ztcp) is run with no options, it will output
 the contents of its session table.
+
+If it is run with only the option tt(-L), it will output the contents of
+the session table in a format suitable for automatic parsing.  The option
+is ignored if given with a command to open or close a session.  The output
+consists of a set of lines, one per session, each containing the following
+elements separated by spaces:
+
+startitem()
+item(File descriptor)(
+The file descriptor in use for the connection.  For normal inbound (tt(I))
+and outbound (tt(O)) connections this may be read and written by the usual
+shell mechanisms.  However, it should only be close with `tt(ztcp -c)'.
+)
+item(Connection type)(
+A letter indicating how the session was created:
+
+startitem()
+item(tt(Z))(
+A session created with the tt(zftp) command.
+)
+item(tt(L))(
+A connection opened for listening with `tt(ztcp -l)'.
+)
+item(tt(I))(
+An inbound connection accepted with `tt(ztcp -a)'.
+)
+item(tt(O))(
+An outbound connection created with `tt(ztcp) var(host) var(...)'.
+)
+enditem()
+
+)
+item(The local host)(
+This is usually set to an all-zero IP address as the address of the
+localhost is irrelevant.
+)
+item(The local port)(
+This is likely to be zero unless the connection is for listening.
+)
+item(The remote host)(
+This is the fully qualified domain name of the peer, if available, else an
+IP address.  It is an all-zero IP adress for a session opened for
+listening.
+)
+item(The remote port)(
+This is zero for a connection opened for listening.
+)
+enditem()
 )
 enditem()
 
diff --git a/Src/Modules/tcp.c b/Src/Modules/tcp.c
index a6af6ed8d..25a88ff76 100644
--- a/Src/Modules/tcp.c
+++ b/Src/Modules/tcp.c
@@ -369,7 +369,6 @@ bin_ztcp(char *nam, char **args, char *ops, int func)
 	dargs = args;
 
 
-    
     if (ops['c']) {
 	if (!dargs[0]) {
 	    tcp_cleanup();
@@ -575,13 +574,29 @@ bin_ztcp(char *nam, char **args, char *ops, int func)
 			remotename = ztpeer->h_name;
 		    else
 			remotename = ztrdup(inet_ntoa(sess->peer.in.sin_addr));
-		    printf("%s:%d %s %s:%d is on fd %d%s\n",
-			    localname, ntohs(sess->sock.in.sin_port),
-			    ((sess->flags & ZTCP_LISTEN) ? "-<" :
-			     ((sess->flags & ZTCP_INBOUND) ? "<-" : "->")),
-			    remotename, ntohs(sess->peer.in.sin_port),
-			    sess->fd,
-			    (sess->flags & ZTCP_ZFTP) ? " ZFTP" : "");
+		    if (ops['L']) {
+			int schar;
+			if (sess->flags & ZTCP_ZFTP)
+			    schar = 'Z';
+			else if (sess->flags & ZTCP_LISTEN)
+			    schar = 'L';
+			else if (sess->flags & ZTCP_INBOUND)
+			    schar = 'I';
+			else
+			    schar = 'O';
+			printf("%d %c %s %d %s %d\n",
+			       sess->fd, schar,
+			       localname, ntohs(sess->sock.in.sin_port),
+			       remotename, ntohs(sess->peer.in.sin_port));
+		    } else {
+			printf("%s:%d %s %s:%d is on fd %d%s\n",
+			       localname, ntohs(sess->sock.in.sin_port),
+			       ((sess->flags & ZTCP_LISTEN) ? "-<" :
+				((sess->flags & ZTCP_INBOUND) ? "<-" : "->")),
+			       remotename, ntohs(sess->peer.in.sin_port),
+			       sess->fd,
+			       (sess->flags & ZTCP_ZFTP) ? " ZFTP" : "");
+		    }
 		}
 	    }
 	    return 0;
@@ -660,7 +675,7 @@ bin_ztcp(char *nam, char **args, char *ops, int func)
 }
 
 static struct builtin bintab[] = {
-    BUILTIN("ztcp", 0, bin_ztcp, 0, 3, 0, "acdfltv", NULL),
+    BUILTIN("ztcp", 0, bin_ztcp, 0, 3, 0, "acdflLtv", NULL),
 };
 
 /* The load/unload routines required by the zsh library interface */