aboutsummaryrefslogtreecommitdiff
path: root/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server.c')
-rw-r--r--server.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/server.c b/server.c
index 29bcf88a..6fef468b 100644
--- a/server.c
+++ b/server.c
@@ -53,6 +53,8 @@ struct cmd_find_state marked_pane;
static u_int message_next;
struct message_list message_log;
+time_t current_time;
+
static int server_loop(void);
static void server_send_exit(void);
static void server_accept(int, short, void *);
@@ -100,7 +102,7 @@ server_check_marked(void)
}
/* Create server socket. */
-static int
+int
server_create_socket(int flags, char **cause)
{
struct sockaddr_un sa;
@@ -211,10 +213,13 @@ server_start(struct tmuxproc *client, int flags, struct event_base *base,
RB_INIT(&sessions);
key_bindings_init();
TAILQ_INIT(&message_log);
-
gettimeofday(&start_time, NULL);
+#ifdef HAVE_SYSTEMD
+ server_fd = systemd_create_socket(flags, &cause);
+#else
server_fd = server_create_socket(flags, &cause);
+#endif
if (server_fd != -1)
server_update_socket();
if (~flags & CLIENT_NOFORK)
@@ -230,15 +235,19 @@ server_start(struct tmuxproc *client, int flags, struct event_base *base,
if (cause != NULL) {
if (c != NULL) {
- cmdq_append(c, cmdq_get_error(cause));
+ c->exit_message = cause;
c->flags |= CLIENT_EXIT;
+ } else {
+ fprintf(stderr, "%s\n", cause);
+ exit(1);
}
- free(cause);
}
evtimer_set(&server_ev_tidy, server_tidy_event, NULL);
evtimer_add(&server_ev_tidy, &tv);
+ server_acl_init();
+
server_add_accept(0);
proc_loop(server_proc, server_loop);
@@ -255,6 +264,8 @@ server_loop(void)
struct client *c;
u_int items;
+ current_time = time (NULL);
+
do {
items = cmdq_next(NULL);
TAILQ_FOREACH(c, &clients, entry) {
@@ -355,9 +366,10 @@ server_update_socket(void)
static void
server_accept(int fd, short events, __unused void *data)
{
- struct sockaddr_storage sa;
- socklen_t slen = sizeof sa;
- int newfd;
+ struct sockaddr_storage sa;
+ socklen_t slen = sizeof sa;
+ int newfd;
+ struct client *c;
server_add_accept(0);
if (!(events & EV_READ))
@@ -374,11 +386,16 @@ server_accept(int fd, short events, __unused void *data)
}
fatal("accept failed");
}
+
if (server_exit) {
close(newfd);
return;
}
- server_client_create(newfd);
+ c = server_client_create(newfd);
+ if (!server_acl_join(c)) {
+ c->exit_message = xstrdup("access not allowed");
+ c->flags |= CLIENT_EXIT;
+ }
}
/*