From 79c9b201a726fc18a84d3a07047cdb611ff49021 Mon Sep 17 00:00:00 2001 From: nicm Date: Sun, 4 Jun 2017 08:25:57 +0000 Subject: [PATCH] Support SIGUSR2 to stop and start logging for an existing server. Also we currently only have two log levels so just use -v and -vv rather than -v and -vvvv, and clarify the man page entry for -v. --- usr.bin/tmux/log.c | 23 ++++++++++++++++++----- usr.bin/tmux/proc.c | 8 +++++++- usr.bin/tmux/server.c | 7 +++++-- usr.bin/tmux/signal.c | 8 +++++++- usr.bin/tmux/tmux.1 | 19 +++++++++++++++++-- usr.bin/tmux/tmux.h | 4 +++- 6 files changed, 57 insertions(+), 12 deletions(-) diff --git a/usr.bin/tmux/log.c b/usr.bin/tmux/log.c index 7f153a7b96c..326def980f6 100644 --- a/usr.bin/tmux/log.c +++ b/usr.bin/tmux/log.c @@ -1,4 +1,4 @@ -/* $OpenBSD: log.c,v 1.24 2017/02/04 23:42:53 nicm Exp $ */ +/* $OpenBSD: log.c,v 1.25 2017/06/04 08:25:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -62,12 +62,10 @@ log_open(const char *name) if (log_level == 0) return; - - if (log_file != NULL) - fclose(log_file); + log_close(); xasprintf(&path, "tmux-%s-%ld.log", name, (long)getpid()); - log_file = fopen(path, "w"); + log_file = fopen(path, "a"); free(path); if (log_file == NULL) return; @@ -76,6 +74,21 @@ log_open(const char *name) event_set_log_callback(log_event_cb); } +/* Toggle logging. */ +void +log_toggle(const char *name) +{ + if (log_level == 0) { + log_level = 1; + log_open(name); + log_debug("log opened"); + } else { + log_debug("log closed"); + log_level = 0; + log_close(); + } +} + /* Close logging. */ void log_close(void) diff --git a/usr.bin/tmux/proc.c b/usr.bin/tmux/proc.c index 9f291be6ff3..56eb2116e98 100644 --- a/usr.bin/tmux/proc.c +++ b/usr.bin/tmux/proc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.c,v 1.8 2016/01/19 15:59:12 nicm Exp $ */ +/* $OpenBSD: proc.c,v 1.9 2017/06/04 08:25:57 nicm Exp $ */ /* * Copyright (c) 2015 Nicholas Marriott @@ -265,3 +265,9 @@ proc_kill_peer(struct tmuxpeer *peer) { peer->flags |= PEER_BAD; } + +void +proc_toggle_log(struct tmuxproc *tp) +{ + log_toggle(tp->name); +} diff --git a/usr.bin/tmux/server.c b/usr.bin/tmux/server.c index d61e593a5c1..5aa9b0accad 100644 --- a/usr.bin/tmux/server.c +++ b/usr.bin/tmux/server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server.c,v 1.170 2017/04/22 06:13:30 nicm Exp $ */ +/* $OpenBSD: server.c,v 1.171 2017/06/04 08:25:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -151,7 +151,7 @@ server_start(struct event_base *base, int lockfd, char *lockfile) } close(pair[0]); - if (log_get_level() > 3) + if (log_get_level() > 1) tty_create_log(); if (pledge("stdio rpath wpath cpath fattr unix getpw recvfd proc exec " "tty ps", NULL) != 0) @@ -365,6 +365,9 @@ server_signal(int sig) } server_add_accept(0); break; + case SIGUSR2: + proc_toggle_log(server_proc); + break; } } diff --git a/usr.bin/tmux/signal.c b/usr.bin/tmux/signal.c index a2b79c225ce..e34c57f0d3c 100644 --- a/usr.bin/tmux/signal.c +++ b/usr.bin/tmux/signal.c @@ -1,4 +1,4 @@ -/* $OpenBSD: signal.c,v 1.10 2016/10/10 21:29:23 nicm Exp $ */ +/* $OpenBSD: signal.c,v 1.11 2017/06/04 08:25:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -29,6 +29,7 @@ static struct event ev_sigchld; static struct event ev_sigcont; static struct event ev_sigterm; static struct event ev_sigusr1; +static struct event ev_sigusr2; static struct event ev_sigwinch; void @@ -59,6 +60,8 @@ set_signals(void (*handler)(int, short, void *), void *arg) signal_add(&ev_sigterm, NULL); signal_set(&ev_sigusr1, SIGUSR1, handler, arg); signal_add(&ev_sigusr1, NULL); + signal_set(&ev_sigusr2, SIGUSR2, handler, arg); + signal_add(&ev_sigusr2, NULL); signal_set(&ev_sigwinch, SIGWINCH, handler, arg); signal_add(&ev_sigwinch, NULL); } @@ -92,6 +95,8 @@ clear_signals(int after_fork) fatal("sigaction failed"); if (sigaction(SIGUSR1, &sigact, NULL) != 0) fatal("sigaction failed"); + if (sigaction(SIGUSR2, &sigact, NULL) != 0) + fatal("sigaction failed"); if (sigaction(SIGWINCH, &sigact, NULL) != 0) fatal("sigaction failed"); } else { @@ -100,6 +105,7 @@ clear_signals(int after_fork) event_del(&ev_sigcont); event_del(&ev_sigterm); event_del(&ev_sigusr1); + event_del(&ev_sigusr2); event_del(&ev_sigwinch); } } diff --git a/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1 index 2522fbae50c..5fc01f3d6dc 100644 --- a/usr.bin/tmux/tmux.1 +++ b/usr.bin/tmux/tmux.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: tmux.1,v 1.557 2017/06/04 08:02:20 nicm Exp $ +.\" $OpenBSD: tmux.1,v 1.558 2017/06/04 08:25:57 nicm Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -199,7 +199,6 @@ characters to the terminal it is running (if not, they are replaced by .Ql _ ) . .It Fl v Request verbose logging. -This option may be specified multiple times for increasing verbosity. Log messages will be saved into .Pa tmux-client-PID.log and @@ -207,6 +206,22 @@ and files in the current directory, where .Em PID is the PID of the server or client process. +.Pp +If +.Fl v +is specified twice, an additional +.Pa tmux-out-PID.log +file is generated with a copy of everything +.Nm +writes to the terminal. +.Pp +The +.Dv SIGUSR2 +signal may be sent to the +.Nm +server process to toggle logging between on (as if +.Fl v +was given) and off. .It Ar command Op Ar flags This specifies one of a set of commands used to control .Nm , diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 6c72939808a..9faa25c56be 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.779 2017/05/31 11:00:00 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.780 2017/06/04 08:25:57 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1493,6 +1493,7 @@ struct tmuxpeer *proc_add_peer(struct tmuxproc *, int, void (*)(struct imsg *, void *), void *); void proc_remove_peer(struct tmuxpeer *); void proc_kill_peer(struct tmuxpeer *); +void proc_toggle_log(struct tmuxproc *); /* cfg.c */ extern int cfg_finished; @@ -2336,6 +2337,7 @@ char *get_proc_name(int, char *); void log_add_level(void); int log_get_level(void); void log_open(const char *); +void log_toggle(const char *); void log_close(void); void printflike(1, 2) log_debug(const char *, ...); __dead void printflike(1, 2) fatal(const char *, ...); -- 2.20.1