about summary refs log tree commit diff
path: root/Functions/TCP/tcp_spam
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/TCP/tcp_spam')
-rw-r--r--Functions/TCP/tcp_spam97
1 files changed, 97 insertions, 0 deletions
diff --git a/Functions/TCP/tcp_spam b/Functions/TCP/tcp_spam
new file mode 100644
index 000000000..f5c612bee
--- /dev/null
+++ b/Functions/TCP/tcp_spam
@@ -0,0 +1,97 @@
+# SPAM is a registered trademark of Hormel Foods Corporation.
+#
+# -a all connections, override $tcp_spam_list and $tcp_no_spam_list.
+#    If not given and tcp_spam_list is set to a list of sessions,
+#    only those will be spammed.  If tcp_no_spam_list is set, those
+#    will (also) be excluded from spamming.
+# -l sess1,sess2    give comma separated list of sessions to spam
+# -r reverse, spam in opposite order (default is alphabetic, -r means
+#    omegapsiic).  Note tcp_spam_list is not sorted (but may be reversed).
+# -t transmit, send data to slave rather than executing command for eac
+#    session.
+# -v verbose, list session being spammed in turn
+#
+# If the function tcp_on_spam is defined, it is called for each link
+# with the first argument set to the session name, and the remainder the
+# command line to be executed.  If it sets the parameter REPLY to `done',
+# the command line will not then be executed by tcp_spam, else it will.
+
+emulate -L zsh
+setopt extendedglob
+
+local TCP_SESS cmd opt verbose reverse sesslist transmit all
+local match mbegin mend REPLY
+local -a sessions
+
+while getopts "al:rtv" opt; do
+    case $opt in
+	(a) all=1
+	    ;;
+	(l) sessions+=(${(s.,.)OPTARG})
+	    ;;
+	(r) reverse=1
+	    ;;
+	(s) sessions+=($OPTARG)
+	    ;;
+	(t) transmit=-t
+	    ;;
+	(v) verbose=1
+	    ;;
+	(*) [[ $opt != '?' ]] && print "Option $opt not handled." >&2
+	    print "Sorry, spam's off." >&2
+	    return 1
+	    ;;
+    esac
+done
+(( OPTIND > 1 )) && shift $(( OPTIND - 1 ))
+
+local name
+if [[ -n $all ]]; then
+    sessions=(${(ko)tcp_by_name})
+elif (( ! ${#sessions} )); then
+  if (( ${#tcp_spam_list} )); then
+    sessions=($tcp_spam_list)
+  else
+    sessions=(${(ko)tcp_by_name})
+  fi
+  if (( ${#tcp_no_spam_list} )); then
+    for name in ${tcp_no_spam_list}; do
+      sessions=(${sessions:#$name})
+    done
+  fi
+fi
+
+if [[ -n $reverse ]]; then
+  local tmp
+  integer i
+  for (( i = 1; i <= ${#sessions}/2; i++ )); do
+    tmp=${sessions[i]}
+    sessions[i]=${sessions[-i]}
+    sessions[-i]=$tmp
+  done
+fi
+
+if (( ! ${#sessions} )); then
+  print "No connections to spam." >&2
+  return 1
+fi
+
+if [[ -n $transmit ]]; then
+  cmd=tcp_send
+else
+  cmd=$1
+  shift
+fi
+
+: ${TCP_PROMPT:=T[%s]:}
+
+for TCP_SESS in $sessions; do
+  REPLY=
+  if (( ${+functions[tcp_on_spam]} )); then
+    tcp_on_spam $TCP_SESS $cmd $*
+    [[ $REPLY = done ]] && continue
+  fi
+  [[ -n $verbose ]] && zgprintf -R -%s=$TCP_SESS \
+    -%f=${tcp_by_name[$TCP_SESS]} -- $TCP_PROMPT
+  eval $cmd '$*'
+done