about summary refs log tree commit diff
path: root/Functions/TCP/tcp_output
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2003-02-06 12:21:49 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2003-02-06 12:21:49 +0000
commit5c1f3b65a6f5abeae8459f41adb8fd2316971515 (patch)
tree21a82daa1abab96c967d731c7afe2a3a2bd07fff /Functions/TCP/tcp_output
parent809ab19dff75185a805b4cbb31a6b89f225167f4 (diff)
downloadzsh-5c1f3b65a6f5abeae8459f41adb8fd2316971515.tar.gz
zsh-5c1f3b65a6f5abeae8459f41adb8fd2316971515.tar.xz
zsh-5c1f3b65a6f5abeae8459f41adb8fd2316971515.zip
18202: New TCP function system plus small error message change in ztcp.
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