summaryrefslogtreecommitdiff
path: root/Functions/TCP/tcp_send
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_send
parent809ab19dff75185a805b4cbb31a6b89f225167f4 (diff)
downloadzsh-5c1f3b65a6f5abeae8459f41adb8fd2316971515.tar.gz
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_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