summary refs log tree commit diff
path: root/Functions/TCP/tcp_spam
blob: 345be7f216c627d9afd4e8752713db986c772a7d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# 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.
# -e use `eval' to run the command list instead of executing as
#    a normal command line.
# -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 cursess=$TCP_SESS sessstr
local TCP_SESS cmd opt verbose reverse sesslist transmit all eval
local match mbegin mend REPLY
local -a sessions

while getopts "ael:rtv" opt; do
    case $opt in
	(a) all=1
	    ;;
	(e) eval=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 (( ! $# )); then
  print "No commands given." >&2
  return 1
fi

if [[ -n $transmit ]]; then
  cmd=tcp_send
elif [[ -z $eval ]]; then
  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
  if [[ -n $verbose ]]; then
      if [[ $TCP_SESS = $cursess ]]; then
	  sessstr="c:1"
      else
	  sessstr="c:0"
      fi
      zformat -f REPLY $TCP_PROMPT "s:$TCP_SESS" \
	  "f:${tcp_by_name[$TCP_SESS]}" $sessstr && print -r $REPLY
  fi
  if [[ -n $eval ]]; then
      eval $*
  else
      eval $cmd '$*'
  fi
done