version 1.87, 2010/05/04 08:48:06 |
version 1.88, 2010/05/04 17:28:16 |
|
|
int server_fd; |
int server_fd; |
int server_shutdown; |
int server_shutdown; |
struct event server_ev_accept; |
struct event server_ev_accept; |
struct event server_ev_sigterm; |
|
struct event server_ev_sigusr1; |
|
struct event server_ev_sigchld; |
|
struct event server_ev_second; |
struct event server_ev_second; |
|
|
int server_create_socket(void); |
int server_create_socket(void); |
|
|
if (daemon(1, 0) != 0) |
if (daemon(1, 0) != 0) |
fatal("daemon failed"); |
fatal("daemon failed"); |
|
|
|
/* event_init() was called in our parent, need to reinit. */ |
|
if (event_reinit(ev_base) != 0) |
|
fatal("event_reinit failed"); |
|
clear_signals(); |
|
|
logfile("server"); |
logfile("server"); |
log_debug("server started, pid %ld", (long) getpid()); |
log_debug("server started, pid %ld", (long) getpid()); |
|
|
|
|
log_debug("socket path %s", socket_path); |
log_debug("socket path %s", socket_path); |
setproctitle("server (%s)", rpathbuf); |
setproctitle("server (%s)", rpathbuf); |
|
|
event_init(); |
|
|
|
server_fd = server_create_socket(); |
server_fd = server_create_socket(); |
server_client_create(pair[1]); |
server_client_create(pair[1]); |
|
|
|
|
evtimer_set(&server_ev_second, server_second_callback, NULL); |
evtimer_set(&server_ev_second, server_second_callback, NULL); |
evtimer_add(&server_ev_second, &tv); |
evtimer_add(&server_ev_second, &tv); |
|
|
server_signal_set(); |
set_signals(server_signal_callback); |
server_loop(); |
server_loop(); |
exit(0); |
exit(0); |
} |
} |
|
|
return; |
return; |
} |
} |
server_client_create(newfd); |
server_client_create(newfd); |
} |
|
|
|
/* Set up server signal handling. */ |
|
void |
|
server_signal_set(void) |
|
{ |
|
struct sigaction sigact; |
|
|
|
memset(&sigact, 0, sizeof sigact); |
|
sigemptyset(&sigact.sa_mask); |
|
sigact.sa_flags = SA_RESTART; |
|
sigact.sa_handler = SIG_IGN; |
|
if (sigaction(SIGINT, &sigact, NULL) != 0) |
|
fatal("sigaction failed"); |
|
if (sigaction(SIGPIPE, &sigact, NULL) != 0) |
|
fatal("sigaction failed"); |
|
if (sigaction(SIGUSR2, &sigact, NULL) != 0) |
|
fatal("sigaction failed"); |
|
if (sigaction(SIGTSTP, &sigact, NULL) != 0) |
|
fatal("sigaction failed"); |
|
if (sigaction(SIGHUP, &sigact, NULL) != 0) |
|
fatal("sigaction failed"); |
|
|
|
signal_set(&server_ev_sigchld, SIGCHLD, server_signal_callback, NULL); |
|
signal_add(&server_ev_sigchld, NULL); |
|
signal_set(&server_ev_sigterm, SIGTERM, server_signal_callback, NULL); |
|
signal_add(&server_ev_sigterm, NULL); |
|
signal_set(&server_ev_sigusr1, SIGUSR1, server_signal_callback, NULL); |
|
signal_add(&server_ev_sigusr1, NULL); |
|
} |
|
|
|
/* Destroy server signal events. */ |
|
void |
|
server_signal_clear(void) |
|
{ |
|
struct sigaction sigact; |
|
|
|
memset(&sigact, 0, sizeof sigact); |
|
sigemptyset(&sigact.sa_mask); |
|
sigact.sa_flags = SA_RESTART; |
|
sigact.sa_handler = SIG_DFL; |
|
if (sigaction(SIGINT, &sigact, NULL) != 0) |
|
fatal("sigaction failed"); |
|
if (sigaction(SIGPIPE, &sigact, NULL) != 0) |
|
fatal("sigaction failed"); |
|
if (sigaction(SIGUSR2, &sigact, NULL) != 0) |
|
fatal("sigaction failed"); |
|
if (sigaction(SIGTSTP, &sigact, NULL) != 0) |
|
fatal("sigaction failed"); |
|
if (sigaction(SIGHUP, &sigact, NULL) != 0) |
|
fatal("sigaction failed"); |
|
|
|
signal_del(&server_ev_sigchld); |
|
signal_del(&server_ev_sigterm); |
|
signal_del(&server_ev_sigusr1); |
|
} |
} |
|
|
/* Signal handler. */ |
/* Signal handler. */ |