about summary refs log tree commit diff
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