1 /* $OpenBSD$ */
2 
3 /*
4  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
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 <fcntl.h>
28 #include <signal.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <termios.h>
33 #include <time.h>
34 #include <unistd.h>
35 
36 #include "tmux.h"
37 
38 /*
39  * Main server functions.
40  */
41 
42 struct clients                 clients;
43 
44 struct tmuxproc               *server_proc;
45 static int                     server_fd = -1;
46 static uint64_t                server_client_flags;
47 static int                     server_exit;
48 static struct event  server_ev_accept;
49 static struct event  server_ev_tidy;
50 
51 struct cmd_find_state          marked_pane;
52 
53 static u_int                   message_next;
54 struct message_list  message_log;
55 
56 time_t                         current_time;
57 
58 static int          server_loop(void);
59 static void         server_send_exit(void);
60 static void         server_accept(int, short, void *);
61 static void         server_signal(int);
62 static void         server_child_signal(void);
63 static void         server_child_exited(pid_t, int);
64 static void         server_child_stopped(pid_t, int);
65 
66 /* Set marked pane. */
67 void
server_set_marked(struct session * s,struct winlink * wl,struct window_pane * wp)68 server_set_marked(struct session *s, struct winlink *wl, struct window_pane *wp)
69 {
70           cmd_find_clear_state(&marked_pane, 0);
71           marked_pane.s = s;
72           marked_pane.wl = wl;
73           marked_pane.w = wl->window;
74           marked_pane.wp = wp;
75 }
76 
77 /* Clear marked pane. */
78 void
server_clear_marked(void)79 server_clear_marked(void)
80 {
81           cmd_find_clear_state(&marked_pane, 0);
82 }
83 
84 /* Is this the marked pane? */
85 int
server_is_marked(struct session * s,struct winlink * wl,struct window_pane * wp)86 server_is_marked(struct session *s, struct winlink *wl, struct window_pane *wp)
87 {
88           if (s == NULL || wl == NULL || wp == NULL)
89                     return (0);
90           if (marked_pane.s != s || marked_pane.wl != wl)
91                     return (0);
92           if (marked_pane.wp != wp)
93                     return (0);
94           return (server_check_marked());
95 }
96 
97 /* Check if the marked pane is still valid. */
98 int
server_check_marked(void)99 server_check_marked(void)
100 {
101           return (cmd_find_valid_state(&marked_pane));
102 }
103 
104 /* Create server socket. */
105 int
server_create_socket(uint64_t flags,char ** cause)106 server_create_socket(uint64_t flags, char **cause)
107 {
108           struct sockaddr_un  sa;
109           size_t                        size;
110           mode_t                        mask;
111           int                           fd, saved_errno;
112 
113           memset(&sa, 0, sizeof sa);
114           sa.sun_family = AF_UNIX;
115           size = strlcpy(sa.sun_path, socket_path, sizeof sa.sun_path);
116           if (size >= sizeof sa.sun_path) {
117                     errno = ENAMETOOLONG;
118                     goto fail;
119           }
120           unlink(sa.sun_path);
121 
122           if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1)
123                     goto fail;
124 
125           if (flags & CLIENT_DEFAULTSOCKET)
126                     mask = umask(S_IXUSR|S_IXGRP|S_IRWXO);
127           else
128                     mask = umask(S_IXUSR|S_IRWXG|S_IRWXO);
129           if (bind(fd, (struct sockaddr *)&sa, sizeof sa) == -1) {
130                     saved_errno = errno;
131                     close(fd);
132                     errno = saved_errno;
133                     goto fail;
134           }
135           umask(mask);
136 
137           if (listen(fd, 128) == -1) {
138                     saved_errno = errno;
139                     close(fd);
140                     errno = saved_errno;
141                     goto fail;
142           }
143           setblocking(fd, 0);
144 
145           return (fd);
146 
147 fail:
148           if (cause != NULL) {
149                     xasprintf(cause, "error creating %s (%s)", socket_path,
150                         strerror(errno));
151           }
152           return (-1);
153 }
154 
155 /* Tidy up every hour. */
156 static void
server_tidy_event(__unused int fd,__unused short events,__unused void * data)157 server_tidy_event(__unused int fd, __unused short events, __unused void *data)
158 {
159     struct timeval  tv = { .tv_sec = 3600 };
160     uint64_t                  t = get_timer();
161 
162     format_tidy_jobs();
163 
164 #ifdef HAVE_MALLOC_TRIM
165     malloc_trim(0);
166 #endif
167 
168     log_debug("%s: took %ju milliseconds", __func__, (uintmax_t)get_timer() - t);
169     evtimer_add(&server_ev_tidy, &tv);
170 }
171 
172 /* Fork new server. */
173 int
server_start(struct tmuxproc * client,uint64_t flags,struct event_base * base,int lockfd,char * lockfile)174 server_start(struct tmuxproc *client, uint64_t flags, struct event_base *base,
175     int lockfd, char *lockfile)
176 {
177           int                  fd;
178           sigset_t   set, oldset;
179           struct client       *c = NULL;
180           char                *cause = NULL;
181           struct timeval       tv = { .tv_sec = 3600 };
182 
183           sigfillset(&set);
184           sigprocmask(SIG_BLOCK, &set, &oldset);
185 
186           if (~flags & CLIENT_NOFORK) {
187                     if (proc_fork_and_daemon(&fd) != 0) {
188                               sigprocmask(SIG_SETMASK, &oldset, NULL);
189                               return (fd);
190                     }
191           }
192           proc_clear_signals(client, 0);
193           server_client_flags = flags;
194 
195           if (event_reinit(base) != 0)
196                     fatalx("event_reinit failed");
197           server_proc = proc_start("server");
198 
199           proc_set_signals(server_proc, server_signal);
200           sigprocmask(SIG_SETMASK, &oldset, NULL);
201 
202           if (log_get_level() > 1)
203                     tty_create_log();
204           if (pledge("stdio rpath wpath cpath fattr unix getpw recvfd proc exec "
205               "tty ps", NULL) != 0)
206                     fatal("pledge failed");
207 
208           input_key_build();
209           RB_INIT(&windows);
210           RB_INIT(&all_window_panes);
211           TAILQ_INIT(&clients);
212           RB_INIT(&sessions);
213           key_bindings_init();
214           TAILQ_INIT(&message_log);
215           gettimeofday(&start_time, NULL);
216 
217 #ifdef HAVE_SYSTEMD
218           server_fd = systemd_create_socket(flags, &cause);
219 #else
220           server_fd = server_create_socket(flags, &cause);
221 #endif
222           if (server_fd != -1)
223                     server_update_socket();
224           if (~flags & CLIENT_NOFORK)
225                     c = server_client_create(fd);
226           else
227                     options_set_number(global_options, "exit-empty", 0);
228 
229           if (lockfd >= 0) {
230                     unlink(lockfile);
231                     free(lockfile);
232                     close(lockfd);
233           }
234 
235           if (cause != NULL) {
236                     if (c != NULL) {
237                               c->exit_message = cause;
238                               c->flags |= CLIENT_EXIT;
239                     } else {
240                               fprintf(stderr, "%s\n", cause);
241                               exit(1);
242                     }
243           }
244 
245           evtimer_set(&server_ev_tidy, server_tidy_event, NULL);
246           evtimer_add(&server_ev_tidy, &tv);
247 
248           server_acl_init();
249 
250           server_add_accept(0);
251           proc_loop(server_proc, server_loop);
252 
253           job_kill_all();
254           status_prompt_save_history();
255 
256           exit(0);
257 }
258 
259 /* Server loop callback. */
260 static int
server_loop(void)261 server_loop(void)
262 {
263           struct client       *c;
264           u_int                items;
265 
266           current_time = time(NULL);
267 
268           do {
269                     items = cmdq_next(NULL);
270                     TAILQ_FOREACH(c, &clients, entry) {
271                               if (c->flags & CLIENT_IDENTIFIED)
272                                         items += cmdq_next(c);
273                     }
274           } while (items != 0);
275 
276           server_client_loop();
277 
278           if (!options_get_number(global_options, "exit-empty") && !server_exit)
279                     return (0);
280 
281           if (!options_get_number(global_options, "exit-unattached")) {
282                     if (!RB_EMPTY(&sessions))
283                               return (0);
284           }
285 
286           TAILQ_FOREACH(c, &clients, entry) {
287                     if (c->session != NULL)
288                               return (0);
289           }
290 
291           /*
292            * No attached clients therefore want to exit - flush any waiting
293            * clients but don't actually exit until they've gone.
294            */
295           cmd_wait_for_flush();
296           if (!TAILQ_EMPTY(&clients))
297                     return (0);
298 
299           if (job_still_running())
300                     return (0);
301 
302           return (1);
303 }
304 
305 /* Exit the server by killing all clients and windows. */
306 static void
server_send_exit(void)307 server_send_exit(void)
308 {
309           struct client       *c, *c1;
310           struct session      *s, *s1;
311 
312           cmd_wait_for_flush();
313 
314           TAILQ_FOREACH_SAFE(c, &clients, entry, c1) {
315                     if (c->flags & CLIENT_SUSPENDED)
316                               server_client_lost(c);
317                     else {
318                               c->flags |= CLIENT_EXIT;
319                               c->exit_type = CLIENT_EXIT_SHUTDOWN;
320                     }
321                     c->session = NULL;
322           }
323 
324           RB_FOREACH_SAFE(s, sessions, &sessions, s1)
325                     session_destroy(s, 1, __func__);
326 }
327 
328 /* Update socket execute permissions based on whether sessions are attached. */
329 void
server_update_socket(void)330 server_update_socket(void)
331 {
332           struct session      *s;
333           static int           last = -1;
334           int                  n, mode;
335           struct stat      sb;
336 
337           n = 0;
338           RB_FOREACH(s, sessions, &sessions) {
339                     if (s->attached != 0) {
340                               n++;
341                               break;
342                     }
343           }
344 
345           if (n != last) {
346                     last = n;
347 
348                     if (stat(socket_path, &sb) != 0)
349                               return;
350                     mode = sb.st_mode & ACCESSPERMS;
351                     if (n != 0) {
352                               if (mode & S_IRUSR)
353                                         mode |= S_IXUSR;
354                               if (mode & S_IRGRP)
355                                         mode |= S_IXGRP;
356                               if (mode & S_IROTH)
357                                         mode |= S_IXOTH;
358                     } else
359                               mode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
360                     chmod(socket_path, mode);
361           }
362 }
363 
364 /* Callback for server socket. */
365 static void
server_accept(int fd,short events,__unused void * data)366 server_accept(int fd, short events, __unused void *data)
367 {
368           struct sockaddr_storage        sa;
369           socklen_t            slen = sizeof sa;
370           int                            newfd;
371           struct client                 *c;
372 
373           server_add_accept(0);
374           if (!(events & EV_READ))
375                     return;
376 
377           newfd = accept(fd, (struct sockaddr *) &sa, &slen);
378           if (newfd == -1) {
379                     if (errno == EAGAIN || errno == EINTR || errno == ECONNABORTED)
380                               return;
381                     if (errno == ENFILE || errno == EMFILE) {
382                               /* Delete and don't try again for 1 second. */
383                               server_add_accept(1);
384                               return;
385                     }
386                     fatal("accept failed");
387           }
388 
389           if (server_exit) {
390                     close(newfd);
391                     return;
392           }
393           c = server_client_create(newfd);
394           if (!server_acl_join(c)) {
395                     c->exit_message = xstrdup("access not allowed");
396                     c->flags |= CLIENT_EXIT;
397           }
398 }
399 
400 /*
401  * Add accept event. If timeout is nonzero, add as a timeout instead of a read
402  * event - used to backoff when running out of file descriptors.
403  */
404 void
server_add_accept(int timeout)405 server_add_accept(int timeout)
406 {
407           struct timeval tv = { timeout, 0 };
408 
409           if (server_fd == -1)
410                     return;
411 
412           if (event_initialized(&server_ev_accept))
413                     event_del(&server_ev_accept);
414 
415           if (timeout == 0) {
416                     event_set(&server_ev_accept, server_fd, EV_READ, server_accept,
417                         NULL);
418                     event_add(&server_ev_accept, NULL);
419           } else {
420                     event_set(&server_ev_accept, server_fd, EV_TIMEOUT,
421                         server_accept, NULL);
422                     event_add(&server_ev_accept, &tv);
423           }
424 }
425 
426 /* Signal handler. */
427 static void
server_signal(int sig)428 server_signal(int sig)
429 {
430           int       fd;
431 
432           log_debug("%s: %s", __func__, strsignal(sig));
433           switch (sig) {
434           case SIGINT:
435           case SIGTERM:
436                     server_exit = 1;
437                     server_send_exit();
438                     break;
439           case SIGCHLD:
440                     server_child_signal();
441                     break;
442           case SIGUSR1:
443                     event_del(&server_ev_accept);
444                     fd = server_create_socket(server_client_flags, NULL);
445                     if (fd != -1) {
446                               close(server_fd);
447                               server_fd = fd;
448                               server_update_socket();
449                     }
450                     server_add_accept(0);
451                     break;
452           case SIGUSR2:
453                     proc_toggle_log(server_proc);
454                     break;
455           }
456 }
457 
458 /* Handle SIGCHLD. */
459 static void
server_child_signal(void)460 server_child_signal(void)
461 {
462           int        status;
463           pid_t      pid;
464 
465           for (;;) {
466                     switch (pid = waitpid(WAIT_ANY, &status, WNOHANG|WUNTRACED)) {
467                     case -1:
468                               if (errno == ECHILD)
469                                         return;
470                               fatal("waitpid failed");
471                     case 0:
472                               return;
473                     }
474                     if (WIFSTOPPED(status))
475                               server_child_stopped(pid, status);
476                     else if (WIFEXITED(status) || WIFSIGNALED(status))
477                               server_child_exited(pid, status);
478           }
479 }
480 
481 /* Handle exited children. */
482 static void
server_child_exited(pid_t pid,int status)483 server_child_exited(pid_t pid, int status)
484 {
485           struct window                 *w, *w1;
486           struct window_pane  *wp;
487 
488           RB_FOREACH_SAFE(w, windows, &windows, w1) {
489                     TAILQ_FOREACH(wp, &w->panes, entry) {
490                               if (wp->pid == pid) {
491                                         wp->status = status;
492                                         wp->flags |= PANE_STATUSREADY;
493 
494                                         log_debug("%%%u exited", wp->id);
495                                         wp->flags |= PANE_EXITED;
496 
497                                         if (window_pane_destroy_ready(wp))
498                                                   server_destroy_pane(wp, 1);
499                                         break;
500                               }
501                     }
502           }
503           job_check_died(pid, status);
504 }
505 
506 /* Handle stopped children. */
507 static void
server_child_stopped(pid_t pid,int status)508 server_child_stopped(pid_t pid, int status)
509 {
510           struct window                 *w;
511           struct window_pane  *wp;
512 
513           if (WSTOPSIG(status) == SIGTTIN || WSTOPSIG(status) == SIGTTOU)
514                     return;
515 
516           RB_FOREACH(w, windows, &windows) {
517                     TAILQ_FOREACH(wp, &w->panes, entry) {
518                               if (wp->pid == pid) {
519                                         if (killpg(pid, SIGCONT) != 0)
520                                                   kill(pid, SIGCONT);
521                               }
522                     }
523           }
524           job_check_died(pid, status);
525 }
526 
527 /* Add to message log. */
528 void
server_add_message(const char * fmt,...)529 server_add_message(const char *fmt, ...)
530 {
531           struct message_entry          *msg, *msg1;
532           char                          *s;
533           va_list                        ap;
534           u_int                          limit;
535 
536           va_start(ap, fmt);
537           xvasprintf(&s, fmt, ap);
538           va_end(ap);
539 
540           log_debug("message: %s", s);
541 
542           msg = xcalloc(1, sizeof *msg);
543           gettimeofday(&msg->msg_time, NULL);
544           msg->msg_num = message_next++;
545           msg->msg = s;
546           TAILQ_INSERT_TAIL(&message_log, msg, entry);
547 
548           limit = options_get_number(global_options, "message-limit");
549           TAILQ_FOREACH_SAFE(msg, &message_log, entry, msg1) {
550                     if (msg->msg_num + limit >= message_next)
551                               break;
552                     free(msg->msg);
553                     TAILQ_REMOVE(&message_log, msg, entry);
554                     free(msg);
555           }
556 }
557