summaryrefslogtreecommitdiff
path: root/Functions/TCP/tcp_output
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/TCP/tcp_output')
-rw-r--r--Functions/TCP/tcp_output65
1 files changed, 65 insertions, 0 deletions
diff --git a/Functions/TCP/tcp_output b/Functions/TCP/tcp_output
new file mode 100644
index 000000000..b22b79412
--- /dev/null
+++ b/Functions/TCP/tcp_output
@@ -0,0 +1,65 @@
+emulate -L zsh
+setopt extendedglob
+
+local opt tprompt sess read_fd tpat quiet
+
+while getopts "F:P:qS:" opt; do
+ case $opt in
+ (F) read_fd=$OPTARG
+ ;;
+ (P) tprompt=$OPTARG
+ ;;
+ (q) quiet=1
+ ;;
+ (S) sess=$OPTARG
+ ;;
+ (*) [[ $opt != \? ]] && print -r "Can't handle option $opt" >&2
+ return 1
+ ;;
+ esac
+done
+(( OPTIND > 1 )) && shift $(( OPTIND - 1 ))
+
+# Per-session logs don't have the session discriminator in front.
+if [[ -n $TCP_LOG_SESS ]]; then
+ print -r -- "$*" >>${TCP_LOG_SESS}.$sess
+fi
+# Always add the TCP prompt. We used only to do this with
+# multiple sessions, but it seems always to be useful to know
+# where data is coming from; also, it allows more predictable
+# behaviour in tcp_expect.
+if [[ -n $tprompt ]]; then
+ zgprintf -R -%s=$sess -%f=$read_fd -- $tprompt
+ # We will pass this back up.
+ REPLY="$REPLY$*"
+else
+ REPLY="$*"
+fi
+if [[ -n $TCP_LOG ]]; then
+ print -r -- $REPLY >>${TCP_LOG}
+fi
+
+if [[ -z $quiet ]]; then
+ local skip=
+ if [[ ${#tcp_filter} -ne 0 ]]; then
+ # Allow tcp_filter to be an associative array, though
+ # it doesn't *need* to be.
+ for tpat in ${(v)tcp_filter}; do
+ [[ $REPLY = ${~tpat} ]] && skip=1 && break
+ done
+ fi
+ if [[ -z $skip ]]; then
+ # Check flag passed down probably from tcp_fd_handler:
+ # if we have output, we are in zle and need to fix the display first.
+ # (The shell is supposed to be smart enough that you can replace
+ # all the following with
+ # [[ -o zle ]] && zle -I
+ # but I haven't dared try it yet.)
+ if [[ -n $TCP_INVALIDATE_ZLE ]]; then
+ zle -I
+ # Only do this the first time.
+ unset TCP_INVALIDATE_ZLE
+ fi
+ print -r -- $REPLY
+ fi
+fi