summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2017-06-04 08:25:57 +0000
committernicm <nicm>2017-06-04 08:25:57 +0000
commitadf5628087829bed2eff635760d7cc456dd1e558 (patch)
treeceb0745ca673fb84658b4ba573ff6b3a04926b5f
parent184039044a92b83f38b880b0a4a1c5ebc272af9c (diff)
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.
-rw-r--r--log.c21
-rw-r--r--proc.c6
-rw-r--r--server.c5
-rw-r--r--signal.c6
-rw-r--r--tmux.117
-rw-r--r--tmux.h2
6 files changed, 51 insertions, 6 deletions
diff --git a/log.c b/log.c
index 2e953620..c002663e 100644
--- a/log.c
+++ b/log.c
@@ -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/proc.c b/proc.c
index bc27b4ff..1af72fec 100644
--- a/proc.c
+++ b/proc.c
@@ -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/server.c b/server.c
index e0987fca..4dc739d0 100644
--- a/server.c
+++ b/server.c
@@ -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/signal.c b/signal.c
index 79d23af0..49360514 100644
--- a/signal.c
+++ b/signal.c
@@ -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/tmux.1 b/tmux.1
index 7e9fd5a9..02259b2b 100644
--- a/tmux.1
+++ b/tmux.1
@@ -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/tmux.h b/tmux.h
index b47a6911..77d5372a 100644
--- a/tmux.h
+++ b/tmux.h
@@ -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 *, ...);