From 5c1f3b65a6f5abeae8459f41adb8fd2316971515 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 6 Feb 2003 12:21:49 +0000 Subject: 18202: New TCP function system plus small error message change in ztcp. --- Functions/TCP/tcp_send | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 Functions/TCP/tcp_send (limited to 'Functions/TCP/tcp_send') 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 -- cgit 1.4.1