# 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 1, 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:-} Overall log: ${TCP_LOG:-} 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