version 1.190, 2020/05/16 15:47:22 |
version 1.191, 2020/05/16 16:07:55 |
|
|
struct client *c; |
struct client *c; |
char *cause = NULL; |
char *cause = NULL; |
|
|
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0) |
|
fatal("socketpair failed"); |
|
server_client_flags = flags; |
|
|
|
sigfillset(&set); |
sigfillset(&set); |
sigprocmask(SIG_BLOCK, &set, &oldset); |
sigprocmask(SIG_BLOCK, &set, &oldset); |
switch (fork()) { |
|
case -1: |
if (~flags & CLIENT_NOFORK) { |
fatal("fork failed"); |
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0) |
case 0: |
fatal("socketpair failed"); |
break; |
|
default: |
switch (fork()) { |
sigprocmask(SIG_SETMASK, &oldset, NULL); |
case -1: |
close(pair[1]); |
fatal("fork failed"); |
return (pair[0]); |
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) |
server_client_flags = flags; |
fatal("daemon failed"); |
|
proc_clear_signals(client, 0); |
proc_clear_signals(client, 0); |
|
|
if (event_reinit(base) != 0) |
if (event_reinit(base) != 0) |
fatalx("event_reinit failed"); |
fatalx("event_reinit failed"); |
server_proc = proc_start("server"); |
server_proc = proc_start("server"); |
|
|
proc_set_signals(server_proc, server_signal); |
proc_set_signals(server_proc, server_signal); |
sigprocmask(SIG_SETMASK, &oldset, NULL); |
sigprocmask(SIG_SETMASK, &oldset, NULL); |
|
|
|
|
server_fd = server_create_socket(flags, &cause); |
server_fd = server_create_socket(flags, &cause); |
if (server_fd != -1) |
if (server_fd != -1) |
server_update_socket(); |
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) { |
if (lockfd >= 0) { |
unlink(lockfile); |
unlink(lockfile); |
|
|
|
|
log_debug("%s: %s", __func__, strsignal(sig)); |
log_debug("%s: %s", __func__, strsignal(sig)); |
switch (sig) { |
switch (sig) { |
|
case SIGINT: |
case SIGTERM: |
case SIGTERM: |
server_exit = 1; |
server_exit = 1; |
server_send_exit(); |
server_send_exit(); |