about summary refs log tree commit diff
path: root/Functions/TCP/tcp_send
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/TCP/tcp_send')
-rw-r--r--Functions/TCP/tcp_send67
1 files changed, 67 insertions, 0 deletions
diff --git a/Functions/TCP/tcp_send b/Functions/TCP/tcp_send
new file mode 100644
index 000000000..e7dfca771
--- /dev/null
+++ b/Functions/TCP/tcp_send
@@ -0,0 +1,67 @@
+emulate -L zsh
+setopt extendedglob cbases
+
+local opt quiet all sess fd nonewline
+local -a sessions write_fds
+
+while getopts "al:nqs:" opt; do
+    case $opt in
+	(a) all=1
+	    ;;
+	(n) nonewline=-n
+	    ;;
+	(q) quiet=1
+	    ;;
+	(l) for sess in ${(s.,.)OPTARG}; do
+	        if [[ -z ${tcp_by_name[$sess]} ]]; then
+		    print "$0: no such session: $sess" >&2
+		    return 1
+		fi
+		sessions+=($sess)
+	    done
+	    ;;
+	(s) if [[ -z $tcp_by_name[$OPTARG] ]]; then
+                print "No such session: $OPTARG" >&2
+		return 1
+	    fi
+	    sessions+=($OPTARG)
+	    ;;
+	(*) [[ $opt != '?' ]] && print Unhandled option, complain: $opt >&2
+            return 1
+	    ;;
+    esac
+done
+(( OPTIND > 1 )) && shift $(( OPTIND - 1 ))
+
+if [[ -n $all ]]; then
+    sessions=(${(k)tcp_by_name})
+elif (( ! ${#sessions} )); then
+    sessions=($TCP_SESS)
+fi
+if (( ! $#sessions )); then
+    if [[ -z $quiet ]]; then
+	print "No current TCP session open." >&2
+    fi
+    return 1
+fi
+
+# Writing on a TCP connection closed by the remote end can cause SIGPIPE.
+# The following test is reasonably robust, though in principle we can
+# mistake a SIGPIPE owing to another fd.  That doesn't seem like a big worry.
+# `emulate -L zsh' will already have set localtraps.
+local TCP_FD_CLOSED
+trap 'TCP_FD_CLOSED=1' PIPE
+
+local TCP_SESS
+
+for TCP_SESS in $sessions; do
+    fd=${tcp_by_name[$TCP_SESS]}
+    print $nonewline -r -- $* >&$fd
+    if [[ $? -ne 0 || -n $TCP_FD_CLOSED ]]; then
+	print "Session ${TCP_SESS}: fd $fd unusable." >&2
+	unset TCP_FD_CLOSED
+    fi
+    if [[ -n $TCP_OUTPUT ]]; then
+	tcp_output -P "$TCP_OUTPUT" -S $TCP_SESS -F $fd -q "${(j. .)*}"
+    fi
+done