xref: /openbsd/usr.bin/tmux/server.c (revision 8529ddd3)
1 /* $OpenBSD: server.c,v 1.122 2015/04/24 23:17:11 nicm Exp $ */
2 
3 /*
4  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/types.h>
20 #include <sys/ioctl.h>
21 #include <sys/socket.h>
22 #include <sys/stat.h>
23 #include <sys/un.h>
24 #include <sys/wait.h>
25 
26 #include <errno.h>
27 #include <event.h>
28 #include <fcntl.h>
29 #include <paths.h>
30 #include <signal.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <syslog.h>
35 #include <termios.h>
36 #include <time.h>
37 #include <unistd.h>
38 
39 #include "tmux.h"
40 
41 /*
42  * Main server functions.
43  */
44 
45 /* Client list. */
46 struct clients	 clients;
47 struct clients	 dead_clients;
48 
49 int		 server_fd;
50 int		 server_shutdown;
51 struct event	 server_ev_accept;
52 struct event	 server_ev_second;
53 
54 int		 server_create_socket(void);
55 void		 server_loop(void);
56 int		 server_should_shutdown(void);
57 void		 server_send_shutdown(void);
58 void		 server_clean_dead(void);
59 void		 server_accept_callback(int, short, void *);
60 void		 server_signal_callback(int, short, void *);
61 void		 server_child_signal(void);
62 void		 server_child_exited(pid_t, int);
63 void		 server_child_stopped(pid_t, int);
64 void		 server_second_callback(int, short, void *);
65 void		 server_lock_server(void);
66 void		 server_lock_sessions(void);
67 
68 /* Create server socket. */
69 int
70 server_create_socket(void)
71 {
72 	struct sockaddr_un	sa;
73 	size_t			size;
74 	mode_t			mask;
75 	int			fd;
76 
77 	memset(&sa, 0, sizeof sa);
78 	sa.sun_family = AF_UNIX;
79 	size = strlcpy(sa.sun_path, socket_path, sizeof sa.sun_path);
80 	if (size >= sizeof sa.sun_path) {
81 		errno = ENAMETOOLONG;
82 		return (-1);
83 	}
84 	unlink(sa.sun_path);
85 
86 	if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
87 		return (-1);
88 
89 	mask = umask(S_IXUSR|S_IXGRP|S_IRWXO);
90 	if (bind(fd, (struct sockaddr *) &sa, SUN_LEN(&sa)) == -1)
91 		return (-1);
92 	umask(mask);
93 
94 	if (listen(fd, 16) == -1)
95 		return (-1);
96 	setblocking(fd, 0);
97 
98 	return (fd);
99 }
100 
101 /* Fork new server. */
102 int
103 server_start(int lockfd, char *lockfile)
104 {
105 	int	 	 pair[2];
106 	struct timeval	 tv;
107 	char		*cause;
108 
109 	/* The first client is special and gets a socketpair; create it. */
110 	if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0)
111 		fatal("socketpair failed");
112 	log_debug("starting server");
113 
114 	switch (fork()) {
115 	case -1:
116 		fatal("fork failed");
117 	case 0:
118 		break;
119 	default:
120 		close(pair[1]);
121 		return (pair[0]);
122 	}
123 	close(pair[0]);
124 
125 	/*
126 	 * Must daemonise before loading configuration as the PID changes so
127 	 * $TMUX would be wrong for sessions created in the config file.
128 	 */
129 	if (daemon(1, 0) != 0)
130 		fatal("daemon failed");
131 
132 	/* event_init() was called in our parent, need to reinit. */
133 	if (event_reinit(ev_base) != 0)
134 		fatal("event_reinit failed");
135 	clear_signals(0);
136 
137 	logfile("server");
138 	log_debug("server started, pid %ld", (long) getpid());
139 
140 	RB_INIT(&windows);
141 	RB_INIT(&all_window_panes);
142 	TAILQ_INIT(&clients);
143 	TAILQ_INIT(&dead_clients);
144 	RB_INIT(&sessions);
145 	RB_INIT(&dead_sessions);
146 	TAILQ_INIT(&session_groups);
147 	mode_key_init_trees();
148 	key_bindings_init();
149 	utf8_build();
150 
151 	start_time = time(NULL);
152 	log_debug("socket path %s", socket_path);
153 	setproctitle("server (%s)", socket_path);
154 
155 	server_fd = server_create_socket();
156 	if (server_fd == -1)
157 		fatal("couldn't create socket");
158 	server_update_socket();
159 	server_client_create(pair[1]);
160 
161 	unlink(lockfile);
162 	free(lockfile);
163 	close(lockfd);
164 
165 	cfg_cmd_q = cmdq_new(NULL);
166 	cfg_cmd_q->emptyfn = cfg_default_done;
167 	cfg_finished = 0;
168 	cfg_references = 1;
169 	cfg_client = TAILQ_FIRST(&clients);
170 	if (cfg_client != NULL)
171 		cfg_client->references++;
172 
173 	if (access(TMUX_CONF, R_OK) == 0) {
174 		if (load_cfg(TMUX_CONF, cfg_cmd_q, &cause) == -1)
175 			cfg_add_cause("%s: %s", TMUX_CONF, cause);
176 	} else if (errno != ENOENT)
177 		cfg_add_cause("%s: %s", TMUX_CONF, strerror(errno));
178 	if (cfg_file != NULL) {
179 		if (load_cfg(cfg_file, cfg_cmd_q, &cause) == -1)
180 			cfg_add_cause("%s: %s", cfg_file, cause);
181 	}
182 	cmdq_continue(cfg_cmd_q);
183 
184 	server_add_accept(0);
185 
186 	memset(&tv, 0, sizeof tv);
187 	tv.tv_sec = 1;
188 	evtimer_set(&server_ev_second, server_second_callback, NULL);
189 	evtimer_add(&server_ev_second, &tv);
190 
191 	set_signals(server_signal_callback);
192 	server_loop();
193 	exit(0);
194 }
195 
196 /* Main server loop. */
197 void
198 server_loop(void)
199 {
200 	while (!server_should_shutdown()) {
201 		event_loop(EVLOOP_ONCE);
202 
203 		server_window_loop();
204 		server_client_loop();
205 
206 		server_clean_dead();
207 	}
208 }
209 
210 /* Check if the server should exit (no more clients or sessions). */
211 int
212 server_should_shutdown(void)
213 {
214 	struct client	*c;
215 
216 	if (!options_get_number(&global_options, "exit-unattached")) {
217 		if (!RB_EMPTY(&sessions))
218 			return (0);
219 	}
220 
221 	TAILQ_FOREACH(c, &clients, entry) {
222 		if (c->session != NULL)
223 			return (0);
224 	}
225 
226 	/*
227 	 * No attached clients therefore want to exit - flush any waiting
228 	 * clients but don't actually exit until they've gone.
229 	 */
230 	cmd_wait_for_flush();
231 	if (!TAILQ_EMPTY(&clients))
232 		return (0);
233 
234 	return (1);
235 }
236 
237 /* Shutdown the server by killing all clients and windows. */
238 void
239 server_send_shutdown(void)
240 {
241 	struct client	*c, *c1;
242 	struct session	*s, *s1;
243 
244 	cmd_wait_for_flush();
245 
246 	TAILQ_FOREACH_SAFE(c, &clients, entry, c1) {
247 		if (c->flags & (CLIENT_BAD|CLIENT_SUSPENDED))
248 			server_client_lost(c);
249 		else
250 			server_write_client(c, MSG_SHUTDOWN, NULL, 0);
251 		c->session = NULL;
252 	}
253 
254 	RB_FOREACH_SAFE(s, sessions, &sessions, s1)
255 		session_destroy(s);
256 }
257 
258 /* Free dead, unreferenced clients and sessions. */
259 void
260 server_clean_dead(void)
261 {
262 	struct session	*s, *s1;
263 	struct client	*c, *c1;
264 
265 	RB_FOREACH_SAFE(s, sessions, &dead_sessions, s1) {
266 		if (s->references != 0)
267 			continue;
268 		RB_REMOVE(sessions, &dead_sessions, s);
269 		free(s->name);
270 		free(s);
271 	}
272 
273 	TAILQ_FOREACH_SAFE(c, &dead_clients, entry, c1) {
274 		if (c->references != 0)
275 			continue;
276 		TAILQ_REMOVE(&dead_clients, c, entry);
277 		free(c);
278 	}
279 }
280 
281 /* Update socket execute permissions based on whether sessions are attached. */
282 void
283 server_update_socket(void)
284 {
285 	struct session	*s;
286 	static int	 last = -1;
287 	int		 n, mode;
288 	struct stat      sb;
289 
290 	n = 0;
291 	RB_FOREACH(s, sessions, &sessions) {
292 		if (!(s->flags & SESSION_UNATTACHED)) {
293 			n++;
294 			break;
295 		}
296 	}
297 
298 	if (n != last) {
299 		last = n;
300 
301 		if (stat(socket_path, &sb) != 0)
302 			return;
303 		mode = sb.st_mode;
304 		if (n != 0) {
305 			if (mode & S_IRUSR)
306 				mode |= S_IXUSR;
307 			if (mode & S_IRGRP)
308 				mode |= S_IXGRP;
309 			if (mode & S_IROTH)
310 				mode |= S_IXOTH;
311 		} else
312 			mode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
313 		chmod(socket_path, mode);
314 	}
315 }
316 
317 /* Callback for server socket. */
318 void
319 server_accept_callback(int fd, short events, unused void *data)
320 {
321 	struct sockaddr_storage	sa;
322 	socklen_t		slen = sizeof sa;
323 	int			newfd;
324 
325 	server_add_accept(0);
326 	if (!(events & EV_READ))
327 		return;
328 
329 	newfd = accept(fd, (struct sockaddr *) &sa, &slen);
330 	if (newfd == -1) {
331 		if (errno == EAGAIN || errno == EINTR || errno == ECONNABORTED)
332 			return;
333 		if (errno == ENFILE || errno == EMFILE) {
334 			/* Delete and don't try again for 1 second. */
335 			server_add_accept(1);
336 			return;
337 		}
338 		fatal("accept failed");
339 	}
340 	if (server_shutdown) {
341 		close(newfd);
342 		return;
343 	}
344 	server_client_create(newfd);
345 }
346 
347 /*
348  * Add accept event. If timeout is nonzero, add as a timeout instead of a read
349  * event - used to backoff when running out of file descriptors.
350  */
351 void
352 server_add_accept(int timeout)
353 {
354 	struct timeval tv = { timeout, 0 };
355 
356 	if (event_initialized(&server_ev_accept))
357 		event_del(&server_ev_accept);
358 
359 	if (timeout == 0) {
360 		event_set(&server_ev_accept,
361 		    server_fd, EV_READ, server_accept_callback, NULL);
362 		event_add(&server_ev_accept, NULL);
363 	} else {
364 		event_set(&server_ev_accept,
365 		    server_fd, EV_TIMEOUT, server_accept_callback, NULL);
366 		event_add(&server_ev_accept, &tv);
367 	}
368 }
369 
370 /* Signal handler. */
371 void
372 server_signal_callback(int sig, unused short events, unused void *data)
373 {
374 	int	fd;
375 
376 	switch (sig) {
377 	case SIGTERM:
378 		server_shutdown = 1;
379 		server_send_shutdown();
380 		break;
381 	case SIGCHLD:
382 		server_child_signal();
383 		break;
384 	case SIGUSR1:
385 		event_del(&server_ev_accept);
386 		fd = server_create_socket();
387 		if (fd != -1) {
388 			close(server_fd);
389 			server_fd = fd;
390 			server_update_socket();
391 		}
392 		server_add_accept(0);
393 		break;
394 	}
395 }
396 
397 /* Handle SIGCHLD. */
398 void
399 server_child_signal(void)
400 {
401 	int	 status;
402 	pid_t	 pid;
403 
404 	for (;;) {
405 		switch (pid = waitpid(WAIT_ANY, &status, WNOHANG|WUNTRACED)) {
406 		case -1:
407 			if (errno == ECHILD)
408 				return;
409 			fatal("waitpid failed");
410 		case 0:
411 			return;
412 		}
413 		if (WIFSTOPPED(status))
414 			server_child_stopped(pid, status);
415 		else if (WIFEXITED(status) || WIFSIGNALED(status))
416 			server_child_exited(pid, status);
417 	}
418 }
419 
420 /* Handle exited children. */
421 void
422 server_child_exited(pid_t pid, int status)
423 {
424 	struct window		*w, *w1;
425 	struct window_pane	*wp;
426 	struct job		*job;
427 
428 	RB_FOREACH_SAFE(w, windows, &windows, w1) {
429 		TAILQ_FOREACH(wp, &w->panes, entry) {
430 			if (wp->pid == pid) {
431 				wp->status = status;
432 				server_destroy_pane(wp);
433 				break;
434 			}
435 		}
436 	}
437 
438 	LIST_FOREACH(job, &all_jobs, lentry) {
439 		if (pid == job->pid) {
440 			job_died(job, status);	/* might free job */
441 			break;
442 		}
443 	}
444 }
445 
446 /* Handle stopped children. */
447 void
448 server_child_stopped(pid_t pid, int status)
449 {
450 	struct window		*w;
451 	struct window_pane	*wp;
452 
453 	if (WSTOPSIG(status) == SIGTTIN || WSTOPSIG(status) == SIGTTOU)
454 		return;
455 
456 	RB_FOREACH(w, windows, &windows) {
457 		TAILQ_FOREACH(wp, &w->panes, entry) {
458 			if (wp->pid == pid) {
459 				if (killpg(pid, SIGCONT) != 0)
460 					kill(pid, SIGCONT);
461 			}
462 		}
463 	}
464 }
465 
466 /* Handle once-per-second timer events. */
467 void
468 server_second_callback(unused int fd, unused short events, unused void *arg)
469 {
470 	struct window		*w;
471 	struct window_pane	*wp;
472 	struct timeval		 tv;
473 
474 	if (options_get_number(&global_s_options, "lock-server"))
475 		server_lock_server();
476 	else
477 		server_lock_sessions();
478 
479 	RB_FOREACH(w, windows, &windows) {
480 		TAILQ_FOREACH(wp, &w->panes, entry) {
481 			if (wp->mode != NULL && wp->mode->timer != NULL)
482 				wp->mode->timer(wp);
483 		}
484 	}
485 
486 	server_client_status_timer();
487 
488 	evtimer_del(&server_ev_second);
489 	memset(&tv, 0, sizeof tv);
490 	tv.tv_sec = 1;
491 	evtimer_add(&server_ev_second, &tv);
492 }
493 
494 /* Lock the server if ALL sessions have hit the time limit. */
495 void
496 server_lock_server(void)
497 {
498 	struct session  *s;
499 	int		 timeout;
500 	time_t           t;
501 
502 	t = time(NULL);
503 	RB_FOREACH(s, sessions, &sessions) {
504 		if (s->flags & SESSION_UNATTACHED)
505 			continue;
506 		timeout = options_get_number(&s->options, "lock-after-time");
507 		if (timeout <= 0 || t <= s->activity_time.tv_sec + timeout)
508 			return;	/* not timed out */
509 	}
510 
511 	server_lock();
512 	recalculate_sizes();
513 }
514 
515 /* Lock any sessions which have timed out. */
516 void
517 server_lock_sessions(void)
518 {
519 	struct session  *s;
520 	int		 timeout;
521 	time_t		 t;
522 
523 	t = time(NULL);
524 	RB_FOREACH(s, sessions, &sessions) {
525 		if (s->flags & SESSION_UNATTACHED)
526 			continue;
527 		timeout = options_get_number(&s->options, "lock-after-time");
528 		if (timeout > 0 && t > s->activity_time.tv_sec + timeout) {
529 			server_lock_session(s);
530 			recalculate_sizes();
531 		}
532 	}
533 }
534