diff --git a/session b/session index 138d20a..4ed13ff 100755 --- a/session +++ b/session @@ -36,8 +36,9 @@ EXIT_INVALID_SUBMODE=2 EXIT_SESSION_EXISTS=3 EXIT_SESSION_NOT_EXIST=4 EXIT_ALREADY_IN_SESSION=5 -EXIT_CONFIG_NOT_GENERATED=6 -EXIT_INVALID_CHOICE=7 +EXIT_NOT_ATTACHED=6 +EXIT_CONFIG_NOT_GENERATED=7 +EXIT_INVALID_CHOICE=8 ## Functions print_help() { @@ -82,7 +83,7 @@ print_help() { echo >&2 "non-existent, can be initialized with '$(basename $0) config generate'." echo >&2 "All sessions are logged by default in order to provide a scrollback" echo >&2 "buffer at attaching. The logs are located in '${config[socket_dir]}'" - echo >&2 "and logs of terminated sessions may be cleared using '$(basename $0) log clear'." + echo >&2 "and logs of terminated sessions may be cleared using '$(basename $0) clean log'." } get_available_sessions() { @@ -108,11 +109,18 @@ get_available_logs() { } get_session_path() { - echo "${SOCKET_PREFIX}${1}${SOCKET_SUFFIX}" + local session_name=$1 + echo "${SOCKET_PREFIX}${session_name}${SOCKET_SUFFIX}" } get_log_path() { - echo "${SOCKET_PREFIX}${1}${LOG_SUFFIX}" + local session_name=$1 + echo "${SOCKET_PREFIX}${session_name}${LOG_SUFFIX}" +} + +get_session_pid() { + local session_name=$1 + fuser $(get_session_path $session_name) 2> /dev/null } is_existing_session_path() { @@ -142,6 +150,13 @@ exit_if_in_session() { fi } +exit_if_not_in_session() { + if [ -z $DTACH_SOCKET_PATH ]; then + echo >&2 "Currently not attached to any session." + exit $EXIT_NOT_ATTACHED + fi +} + exit_if_existing_session() { if is_existing_session_name $session_name; then echo >&2 "Session '$session_name' already exists." @@ -177,13 +192,9 @@ shift ## Now enter mode specific code case $mode in "") - if [ -z "$DTACH_SESSION_NAME" ];then - echo "Currently not attached." - exit $EXIT_NOT_ATTACHED - else - echo "Currently attached to '$DTACH_SESSION_NAME'." - exit $EXIT_SUCCESS - fi + exit_if_not_in_session + echo "Currently attached to '$DTACH_SESSION_NAME'." + exit $EXIT_SUCCESS ;; "attach"|"att"|"a") exit_if_in_session @@ -214,6 +225,14 @@ case $mode in eval $CMD exit $EXITSUCCESS ;; +# "detach"|"det"|"d") +# exit_if_not_in_session +# PID=$(get_session_pid $DTACH_SESSION_NAME) +# echo $PID +# kill -SIGHUP $PID +# #echo -e "" > $(tty) +# exit $EXIT_SUCCESS +# ;; "new"|"n") exit_if_in_session #PROMPT_COMMAND="echo -ne \"\033]0;$1 (on $HOSTNAME)\007\"" @@ -266,16 +285,15 @@ case $mode in exit_if_nonexisting_session $session_name fi for sname in ${session_name[@]}; do - spath=$(get_session_path $sname) logpath=$(get_log_path $sname) - PID=$(fuser $spath 2> /dev/null) + PID=$(get_session_pid $sname) if [ ! -z "$PID" ]; then CMD="kill $SIGNAL $PID" eval $CMD else # this seems to be an orphan CLEANUP=1 fi - [[ "$CLEANUP" -eq 1 ]] && rm $spath + [[ "$CLEANUP" -eq 1 ]] && rm $(get_session_path $sname) done exit $EXIT_SUCCESS ;; @@ -322,18 +340,32 @@ case $mode in done exit $EXIT_SUCCESS ;; - "log") - if [[ "$1" != "clear" ]]; then - echo >&2 "Use '$(basename $0) log clear' to clear all unused log files." - exit $EXIT_INVALID_SUBMODE - fi - logs_avail=($(get_available_logs)) - for sname in ${logs_avail[@]}; do - if ! is_existing_session_name $sname; then - rm $(get_log_path $sname) - fi - done - exit $EXIT_SUCCESS + "clean") + case "$1" in + "log") + logs_avail=($(get_available_logs)) + for sname in ${logs_avail[@]}; do + if ! is_existing_session_name $sname; then + rm $(get_log_path $sname) + fi + done + exit $EXIT_SUCCESS + ;; + "socket") + sessions_avail=($(get_available_sessions)) + for sname in ${sessions_avail[@]}; do + PID=$(get_session_pid $sname) + if [ -z "$PID" ]; then + rm $(get_session_path $sname) + fi + done + exit $EXIT_SUCCESS + ;; + *) + echo >&2 "'$(basename $0) clean' accepts:" + echo >&2 " log, socket" + exit $EXIT_INVALID_SUBMODE + esac ;; *) echo >&2 "Invalid mode: ${mode}"