about summary refs log tree commit diff
path: root/Functions/TCP/tcp_fd_handler
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/TCP/tcp_fd_handler')
-rw-r--r--Functions/TCP/tcp_fd_handler35
1 files changed, 35 insertions, 0 deletions
diff --git a/Functions/TCP/tcp_fd_handler b/Functions/TCP/tcp_fd_handler
new file mode 100644
index 000000000..012fd4d87
--- /dev/null
+++ b/Functions/TCP/tcp_fd_handler
@@ -0,0 +1,35 @@
+local line name=${tcp_by_fd[$1]}
+if [[ -n $name ]]
+then
+  local TCP_INVALIDATE_ZLE
+  if (( $# > 2 )); then
+    zle -I
+    ## debugging only
+    # print "Flags on the play:" ${argv[3,-1]}
+  else
+    TCP_INVALIDATE_ZLE=1
+  fi
+  if ! tcp_read -d -u $1; then
+    [[ -n $TCP_INVALIDATE_ZLE ]] && zle -I
+    print "[TCP fd $1 (session $name) gone awol; removing from poll list]" >& 2
+    zle -F $1
+    return 1
+  fi
+  return 0
+else
+  zle -I
+  # Handle fds not in the TCP set similarly.
+  # This does the drain thing, to try and get as much data out as possible.
+  if ! read line <&$1; then
+    print "[Reading on $1 failed; removing from poll list]" >& 2
+    zle -F $1
+    return 1
+  fi
+  line="fd$1:$line"
+  local newline
+  while read -t newline <&$1; do
+    line="${line}
+fd$1:$newline"
+  done
+fi
+print -r - $line