about summary refs log tree commit diff
path: root/Functions/TCP/tcp_log
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/TCP/tcp_log')
-rw-r--r--Functions/TCP/tcp_log94
1 files changed, 94 insertions, 0 deletions
diff --git a/Functions/TCP/tcp_log b/Functions/TCP/tcp_log
new file mode 100644
index 000000000..e8ebaca23
--- /dev/null
+++ b/Functions/TCP/tcp_log
@@ -0,0 +1,94 @@
+# Log TCP output.
+#
+# Argument:  Output filename.
+#
+# Options:
+#   -a    Append.  Otherwise the existing file is truncated without warning.
+#	  (N.B.: even if logging was already active to it!)
+#   -s    Per-session logs.  Output to <filename>1, <filename>2, etc.
+#   -c    Close logging.
+#   -n/-N Turn off or on normal output; output only goes to the logfile, if
+#         any.  Otherwise, output also appears interactively.  This
+#         can be given with -c (or any other option), then no output
+#         goes anywhere.  However, input is still handled by the usual
+#         mechanisms --- $tcp_lines and $TCP_LINE are still set, hence
+#         tcp_expect still works.  Equivalent to (un)setting TCP_SILENT.
+#
+# With no options and no arguments, print the current configuration.
+#
+# Per-session logs are raw output, otherwise $TCP_PROMPT is prepended
+# to each line.
+
+emulate -L zsh
+setopt cbases extendedglob
+
+local opt append sess close
+integer activity
+while getopts "ascnN" opt; do
+  (( activity++ ))
+  case $opt in
+    # append to existing file
+    a) append=1
+       ;;
+    # per-session
+    s) sess=1
+       ;;
+    # close
+    c) close=1
+       ;;
+    # turn off interactive output
+    n) TCP_SILENT=1
+       ;;
+    # turn on interactive output
+    N) unset TCP_SILENT
+       ;;
+    # incorrect option
+    \?) return 1
+	;;
+    # correct option I forgot about
+    *) print "$0: option -$opt not handled, oops." >&2
+       return 1
+       ;;
+  esac
+done
+(( OPTIND > 1 )) && shift $(( OPTIND - 1)) 
+
+if [[ -n $close ]]; then
+  if (( $# )); then
+    print "$0: too many arguments for -c" >&2
+    return 1
+  fi
+  unset TCP_LOG TCP_LOG_SESS
+  return 0
+fi
+
+if (( $# == 0 && ! activity )); then
+  print "\
+Per-session log: ${TCP_LOG_SESS:-<none>}
+Overall log:     ${TCP_LOG:-<none>}
+Silent?          ${${TCP_SILENT:+yes}:-no}"
+  return 0
+fi
+
+if (( $# != 1 )); then
+  print "$0: wrong number of arguments" >&2
+  return 1
+fi
+
+if [[ -n $sess ]]; then
+  TCP_LOG_SESS=$1
+  if [[ -z $append ]]; then
+    local sesslogs
+    integer i
+    sesslogs=(${TCP_LOG_SESS}*(N))
+    # yes, i know i can do this with multios
+    for (( i = 1; i <= $#sesslogs; i++ )); do
+      : >$sesslogs[$i]
+    done
+  fi
+else
+  TCP_LOG=$1
+  [[ -z $append ]] && : >$TCP_LOG
+fi
+
+return 0