mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-27 16:50:58 +01:00
18202: New TCP function system plus small error message change in ztcp.
This commit is contained in:
parent
809ab19dff
commit
5c1f3b65a6
27 changed files with 2139 additions and 5 deletions
97
Functions/TCP/tcp_spam
Normal file
97
Functions/TCP/tcp_spam
Normal file
|
|
@ -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
|
||||
Loading…
Add table
Add a link
Reference in a new issue