summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--Completion/Unix/Command/.distfiles2
-rw-r--r--Completion/Unix/Command/_iftop20
-rw-r--r--Completion/Unix/Command/_tcpdump92
-rw-r--r--Doc/Zsh/tcpsys.yo20
-rw-r--r--Functions/TCP/tcp_fd_handler26
6 files changed, 157 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 0ed993449..f9fa3c414 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-05-29  Peter Stephenson  <pws@csr.com>
+
+	* unposted: Doc/Zsh/tcpsys.yo, Functions/TCP/tcp_fd_handler:
+	add tcp_on_awol.
+
+	* Tomasz Pala <gotar@polanet.pl>: users/12884:
+	Completion/Unix/Command/{iftop,tcpdump}: new completions
+
 2008-05-27  Peter Stephenson  <pws@csr.com>
 
 	* users/12870: Doc/Zsh/expn.yo: modifiers in glob qualifiers
diff --git a/Completion/Unix/Command/.distfiles b/Completion/Unix/Command/.distfiles
index ec4ac3975..da748708b 100644
--- a/Completion/Unix/Command/.distfiles
+++ b/Completion/Unix/Command/.distfiles
@@ -82,6 +82,7 @@ _gzip
 _iconv
 _id
 _ifconfig
+_iftop
 _imagemagick
 _init_d
 _ip
@@ -184,6 +185,7 @@ _surfraw
 _sysctl
 _tar
 _tardy
+_tcpdump
 _tcptraceroute
 _telnet
 _texinfo
diff --git a/Completion/Unix/Command/_iftop b/Completion/Unix/Command/_iftop
new file mode 100644
index 000000000..41ffb4ea1
--- /dev/null
+++ b/Completion/Unix/Command/_iftop
@@ -0,0 +1,20 @@
+#compdef iftop
+
+_interfaces () {
+	_wanted interfaces expl 'network interface' \
+		_net_interfaces
+	_values "Pseudo-device that captures on all interfaces" "any"
+}
+
+_arguments \
+  '(-h -n -N -p -b -B -P -i -f -F -c)'-h'[print a summary of usage]' \
+  -n"[don't do hostname lookups]" \
+  -N"[don't resolve port number to service names]" \
+  -p'[run in promiscuous mode]' \
+  -P'[turn on port display]' \
+  -b"[don't display bar graphs of traffic]" \
+  -B'[display bandwidth rates in bytes/sec rather than bits/sec]' \
+  -i'[interface]:network interface:_interfaces' \
+  -f'[filter]:BPF filter' \
+  -F'[net/mask]:network/mask' \
+  -c'[config file]:config file:_files'
diff --git a/Completion/Unix/Command/_tcpdump b/Completion/Unix/Command/_tcpdump
new file mode 100644
index 000000000..015cd8651
--- /dev/null
+++ b/Completion/Unix/Command/_tcpdump
@@ -0,0 +1,92 @@
+#compdef tcpdump
+
+typeset -A opt_args
+
+_interfaces () {
+	_wanted interfaces expl 'network interface' \
+		_net_interfaces
+	_values "Pseudo-device that captures on all interfaces" "any"
+}
+
+_esp_secrets () {
+	_values -S : 'ESP algorithm' \
+		'des-cbc:secret' \
+		'3des-cbc:secret' \
+		'blowfish-cbc:secret' \
+		'rc3-cbc:secret' \
+		'cast128-cbc:secret' \
+		none
+}
+
+_packet_types () {
+	_values 'Packets type' \
+		'aodv[Ad-hoc On-demand Distance Vector protocol]' \
+		'cnfp[Cisco NetFlow protocol]' \
+		'rpc[Remote Procedure Call]' \
+		'rtp[Real-Time  Applications  protocol]' \
+		'rtcp[Real-Time Applications control protocol]' \
+		'snmp[Simple Network Management Protocol]' \
+		'tftp[Trivial File Transfer Protocol]' \
+		'vat[Visual Audio Tool]' \
+		'wb[distributed White Board]'
+}
+
+_data_link_types () {
+	if (( $+opt_args[-i] )); then
+		vals=( ${${${(s:  :)"$(_call_program data-link-types tcpdump -L -i $opt_args[-i] 2>&1)"}[2,-1]}/ /:} )
+		_describe -t data-link-types "data link types ($opt_args[-i])" vals && ret=0
+	else
+		_values "Data link types (general)" \
+			"EN10MB" \
+			"LINUX_SLL"
+	fi
+}
+
+_bpf_filter () {
+}
+
+_arguments \
+  '()-A[Print each packet in ASCII]' \
+  -c'[Exit after receiving specified number of packets]:number of packets' \
+  -C'[Specify output file size in MB (10e6 bytes)]:output file size' \
+  '(-ddd)-d[Dump the compiled packet-matching code in a human readable form]' \
+  '(-ddd)-dd[Dump packet-matching code as a C program fragment]' \
+  '(-d -dd)-ddd[Dump packet-matching code as decimal numbers (preceded with a count)]' \
+  '(-A -c -C -d -dd -ddd -e -E -f -F -i -l -L -m -M -n -N -O -p -q -R -r -S -s -T -t -tt -ttt -tttt -u -U -v -vv -vvv -w -W -x -xx -X -XX -y -Z *)'-D'[Print the list of the network interfaces available on the system]' \
+  -e'[Print the link-level header on each dump line]' \
+  -E"[Decrypting IPsec ESP packets]:spi@ipaddr::algo\:secret:_esp_secrets" \
+  -f"[Print 'foreign' IPv4 addresses numerically]" \
+  -F'[input file for the filter expression]:filter expression file:_files' \
+  -i'[Interface]:interface:_interfaces' \
+  -l'[Make stdout line buffered]' \
+  '(-A -c -C -d -dd -ddd -e -E -f -F -l -D -m -M -n -N -O -p -q -R -r -S -s -T -t -tt -ttt -tttt -u -U -v -vv -vvv -w -W -x -xx -X -XX -y -Z *)'-L'[List the known data link types for the interface]' \
+  '*-m[Load SMI MIB module definitions]:SMI MIB module definitions:_files' \
+  -M'[shared secret for validating the digests in TCP segments with the TCP-MD5 option]:secret' \
+  -n"[Don't convert addresses to names]" \
+  -N"[Don't print domain name qualification of host names]" \
+  -O"[Don't run the packet-matching code optimizer]" \
+  -p"[Don't put the interface into promiscuous mode]" \
+  -q'[Quick (quiet?) output]' \
+  -R'[Assume ESP/AH packets to be based on old specification (RFC1825 to RFC1829)]' \
+  -r'[Read packets from file]:input file:_files' \
+  -S'[Print absolute TCP sequence numbers]' \
+  -s'[Specify number of bytes of data to snarf from each packet]:number of bytes to snap' \
+  -T'[Interpret captured packets as specified type]:packet type:_packet_types' \
+  "(-tttt)-t[Don't print a timestamp on each dump line]" \
+  '(-ttt -tttt)-tt[Print an unformatted timestamp on each dump line]' \
+  '(-tt -tttt)-ttt[Print a delta (in micro-seconds) between current and previous line on each dump line]' \
+  '(-t -tt -ttt)-tttt[Print a timestamp in default format proceeded by date on each dump line]' \
+  -u'[Print undecoded NFS handles]' \
+  -U'[Make output packet-buffered when saving to file (-w)]' \
+  '(-vvv)-v[slightly more verbose output]' \
+  '(-vvv)-vv[more verbose output]' \
+  '(-v -vv)-vvv[most verbose output]' \
+  -w'[Write the raw packets to file]:output file:_files' \
+  -W'[Limit the number of created files (-C)]:number of files' \
+  -x'[Print each packet (minus its link level header) in hex]' \
+  '(-x)-xx[Print each packet, including its link level header, in hex]' \
+  -X'[Print each packet (minus its link level header) in hex and ASCII]' \
+  '(-X)-XX[Print each packet, including its link level header, in hex and ASCII]' \
+  -y'[Set the data link type to use while capturing packets]:data link type:_data_link_types' \
+  -Z'[Drops privileges (if root) and changes user ID (along with primary group)]:user:_users' \
+  '*:BPF filter:_bpf_filter'
diff --git a/Doc/Zsh/tcpsys.yo b/Doc/Zsh/tcpsys.yo
index a2f433523..9d05a5ce6 100644
--- a/Doc/Zsh/tcpsys.yo
+++ b/Doc/Zsh/tcpsys.yo
@@ -454,6 +454,26 @@ item(tt(tcp_on_alias) var(alias) var(fd))(
 When an alias is defined, this function will be called with two arguments:
 the name of the alias, and the file descriptor of the corresponding session.
 )
+findex(tcp_on_awol)
+item(tt(tcp_on_awol) var(sess) var(fd))(
+If the function tt(tcp_fd_handler) is handling input from the line
+editor and detects that the file descriptor is no longer reusable,
+by default it removes it from the list of file descriptors handled
+by this method and prints a message.  If the function tt(tcp_on_awol)
+is defined it is called immediately before this point.  It may
+return status 100, which indicates that the normal handling should
+still be performed; any other return status indicates that no further
+action should be taken and the tt(tcp_fd_handler) should return
+immediately with the given status.  Typically the action of tt(tcp_on_awol)
+will be to close the session.
+
+The variable tt(TCP_INVALIDATE_ZLE) will be a non-empty string if it is
+necessary to invalidate the line editor display using `tt(zle -I)' before
+printing output from the function.
+
+(`AWOL' is military jargon for `absent without leave' or some
+variation.  It has no pre-existing technical meaning known to the author.)
+)
 findex(tcp_on_close)
 item(tt(tcp_on_close) var(sess) var(fd))(
 This is called with the name of a session being closed and the file
diff --git a/Functions/TCP/tcp_fd_handler b/Functions/TCP/tcp_fd_handler
index 8774a2666..9f2e8cd09 100644
--- a/Functions/TCP/tcp_fd_handler
+++ b/Functions/TCP/tcp_fd_handler
@@ -1,6 +1,6 @@
-local line name=${tcp_by_fd[$1]}
+local line fd=$1 sess=${tcp_by_fd[$1]}
 local TCP_HANDLER_ACTIVE=1
-if [[ -n $name ]]
+if [[ -n $sess ]]
 then
   local TCP_INVALIDATE_ZLE
   if (( $# > 2 )); then
@@ -10,10 +10,14 @@ then
   else
     TCP_INVALIDATE_ZLE=1
   fi
-  if ! tcp_read -d -u $1; then
+  if ! tcp_read -d -u $fd; then
+    if (( ${+functions[tcp_on_awol]} )); then
+      tcp_on_awol $sess $fd
+      (( $? == 100 )) || return $?
+    fi
     [[ -n $TCP_INVALIDATE_ZLE ]] && zle -I
-    print "[TCP fd $1 (session $name) gone awol; removing from poll list]" >& 2
-    zle -F $1
+    print "[TCP fd $fd (session $sess) gone awol; removing from poll list]" >& 2
+    zle -F $fd
     return 1
   fi
   return 0
@@ -21,16 +25,16 @@ else
   zle -I
   # Handle fds not in the TCP set similarly.
   # This does the drain thing, to try and get as much data out as possible.
-  if ! read -u $1 line; then
-    print "[Reading on $1 failed; removing from poll list]" >& 2
-    zle -F $1
+  if ! read -u $fd line; then
+    print "[Reading on $fd failed; removing from poll list]" >& 2
+    zle -F $fd
     return 1
   fi
-  line="fd$1:$line"
+  line="fd$fd:$line"
   local newline
-  while read -u $1 -t newline; do
+  while read -u $fd -t newline; do
     line="${line}
-fd$1:$newline"
+fd$fd:$newline"
   done
 fi
 print -r - $line