version 1.195, 2020/09/16 18:37:55 |
version 1.196, 2021/02/11 09:39:29 |
|
|
server_start(struct tmuxproc *client, int flags, struct event_base *base, |
server_start(struct tmuxproc *client, int flags, struct event_base *base, |
int lockfd, char *lockfile) |
int lockfd, char *lockfile) |
{ |
{ |
int pair[2]; |
int fd; |
sigset_t set, oldset; |
sigset_t set, oldset; |
struct client *c = NULL; |
struct client *c = NULL; |
char *cause = NULL; |
char *cause = NULL; |
|
|
sigfillset(&set); |
sigfillset(&set); |
sigprocmask(SIG_BLOCK, &set, &oldset); |
sigprocmask(SIG_BLOCK, &set, &oldset); |
|
|
if (~flags & CLIENT_NOFORK) { |
if (~flags & CLIENT_NOFORK) { |
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0) |
if (proc_fork_and_daemon(&fd) != 0) { |
fatal("socketpair failed"); |
|
|
|
switch (fork()) { |
|
case -1: |
|
fatal("fork failed"); |
|
case 0: |
|
break; |
|
default: |
|
sigprocmask(SIG_SETMASK, &oldset, NULL); |
sigprocmask(SIG_SETMASK, &oldset, NULL); |
close(pair[1]); |
return (fd); |
return (pair[0]); |
|
} |
} |
close(pair[0]); |
|
if (daemon(1, 0) != 0) |
|
fatal("daemon failed"); |
|
} |
} |
|
|
server_client_flags = flags; |
|
proc_clear_signals(client, 0); |
proc_clear_signals(client, 0); |
|
server_client_flags = flags; |
|
|
if (event_reinit(base) != 0) |
if (event_reinit(base) != 0) |
fatalx("event_reinit failed"); |
fatalx("event_reinit failed"); |
|
|
if (server_fd != -1) |
if (server_fd != -1) |
server_update_socket(); |
server_update_socket(); |
if (~flags & CLIENT_NOFORK) |
if (~flags & CLIENT_NOFORK) |
c = server_client_create(pair[1]); |
c = server_client_create(fd); |
else |
else |
options_set_number(global_options, "exit-empty", 0); |
options_set_number(global_options, "exit-empty", 0); |
|
|