diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2003-02-06 12:21:49 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2003-02-06 12:21:49 +0000 |
commit | 5c1f3b65a6f5abeae8459f41adb8fd2316971515 (patch) | |
tree | 21a82daa1abab96c967d731c7afe2a3a2bd07fff /Functions/TCP/tcp_send | |
parent | 809ab19dff75185a805b4cbb31a6b89f225167f4 (diff) | |
download | zsh-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_send')
-rw-r--r-- | Functions/TCP/tcp_send | 67 |
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 |