aboutsummaryrefslogtreecommitdiff
path: root/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server.c')
-rw-r--r--server.c81
1 files changed, 63 insertions, 18 deletions
diff --git a/server.c b/server.c
index 55430e73..c451989c 100644
--- a/server.c
+++ b/server.c
@@ -26,7 +26,6 @@
#include <errno.h>
#include <event.h>
#include <fcntl.h>
-#include <paths.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
@@ -51,6 +50,9 @@ static struct event server_ev_accept;
struct cmd_find_state marked_pane;
+static u_int message_next;
+struct message_list message_log;
+
static int server_loop(void);
static void server_send_exit(void);
static void server_accept(int, short, void *);
@@ -158,29 +160,35 @@ server_start(struct tmuxproc *client, int flags, struct event_base *base,
struct client *c;
char *cause = NULL;
- if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0)
- fatal("socketpair failed");
- server_client_flags = flags;
-
sigfillset(&set);
sigprocmask(SIG_BLOCK, &set, &oldset);
- switch (fork()) {
- case -1:
- fatal("fork failed");
- case 0:
- break;
- default:
- sigprocmask(SIG_SETMASK, &oldset, NULL);
- close(pair[1]);
- return (pair[0]);
+
+ if (~flags & CLIENT_NOFORK) {
+ if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0)
+ fatal("socketpair failed");
+
+ switch (fork()) {
+ case -1:
+ fatal("fork failed");
+ case 0:
+ break;
+ default:
+ sigprocmask(SIG_SETMASK, &oldset, NULL);
+ close(pair[1]);
+ return (pair[0]);
+ }
+ close(pair[0]);
+ if (daemon(1, 0) != 0)
+ fatal("daemon failed");
}
- close(pair[0]);
- if (daemon(1, 0) != 0)
- fatal("daemon failed");
+
+ server_client_flags = flags;
proc_clear_signals(client, 0);
+
if (event_reinit(base) != 0)
fatalx("event_reinit failed");
server_proc = proc_start("server");
+
proc_set_signals(server_proc, server_signal);
sigprocmask(SIG_SETMASK, &oldset, NULL);
@@ -195,13 +203,17 @@ server_start(struct tmuxproc *client, int flags, struct event_base *base,
TAILQ_INIT(&clients);
RB_INIT(&sessions);
key_bindings_init();
+ TAILQ_INIT(&message_log);
gettimeofday(&start_time, NULL);
server_fd = server_create_socket(flags, &cause);
if (server_fd != -1)
server_update_socket();
- c = server_client_create(pair[1]);
+ if (~flags & CLIENT_NOFORK)
+ c = server_client_create(pair[1]);
+ else
+ options_set_number(global_options, "exit-empty", 0);
if (lockfd >= 0) {
unlink(lockfile);
@@ -392,6 +404,7 @@ server_signal(int sig)
log_debug("%s: %s", __func__, strsignal(sig));
switch (sig) {
+ case SIGINT:
case SIGTERM:
server_exit = 1;
server_send_exit();
@@ -481,4 +494,36 @@ server_child_stopped(pid_t pid, int status)
}
}
}
+ job_check_died(pid, status);
+}
+
+/* Add to message log. */
+void
+server_add_message(const char *fmt, ...)
+{
+ struct message_entry *msg, *msg1;
+ char *s;
+ va_list ap;
+ u_int limit;
+
+ va_start(ap, fmt);
+ xvasprintf(&s, fmt, ap);
+ va_end(ap);
+
+ log_debug("message: %s", s);
+
+ msg = xcalloc(1, sizeof *msg);
+ gettimeofday(&msg->msg_time, NULL);
+ msg->msg_num = message_next++;
+ msg->msg = s;
+ TAILQ_INSERT_TAIL(&message_log, msg, entry);
+
+ limit = options_get_number(global_options, "message-limit");
+ TAILQ_FOREACH_SAFE(msg, &message_log, entry, msg1) {
+ if (msg->msg_num + limit >= message_next)
+ break;
+ free(msg->msg);
+ TAILQ_REMOVE(&message_log, msg, entry);
+ free(msg);
+ }
}