diff options
Diffstat (limited to 'Functions/TCP/tcp_spam')
-rw-r--r-- | Functions/TCP/tcp_spam | 97 |
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 |