summaryrefslogtreecommitdiff
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