|
|
@ -126,18 +126,18 @@ server_can_accept(int fd, short event, void *ptr) {
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
static void
|
|
|
|
static void
|
|
|
|
server_daemonize(void) {
|
|
|
|
server_daemonize(void) {
|
|
|
|
int fd;
|
|
|
|
int fd;
|
|
|
|
|
|
|
|
|
|
|
|
if (fork() != 0) exit(0); /* parent exits */
|
|
|
|
if (fork() != 0) exit(0); /* parent exits */
|
|
|
|
setsid(); /* create a new session */
|
|
|
|
setsid(); /* create a new session */
|
|
|
|
|
|
|
|
|
|
|
|
/* Every output goes to /dev/null. */
|
|
|
|
/* Every output goes to /dev/null. */
|
|
|
|
if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
|
|
|
|
if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
|
|
|
|
dup2(fd, STDIN_FILENO);
|
|
|
|
dup2(fd, STDIN_FILENO);
|
|
|
|
dup2(fd, STDOUT_FILENO);
|
|
|
|
dup2(fd, STDOUT_FILENO);
|
|
|
|
dup2(fd, STDERR_FILENO);
|
|
|
|
dup2(fd, STDERR_FILENO);
|
|
|
|
if (fd > STDERR_FILENO) close(fd);
|
|
|
|
if (fd > STDERR_FILENO) close(fd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -145,6 +145,10 @@ int
|
|
|
|
server_start(struct server *s) {
|
|
|
|
server_start(struct server *s) {
|
|
|
|
|
|
|
|
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* initialize libevent */
|
|
|
|
|
|
|
|
s->base = event_base_new();
|
|
|
|
|
|
|
|
|
|
|
|
if(s->cfg->daemonize) {
|
|
|
|
if(s->cfg->daemonize) {
|
|
|
|
server_daemonize();
|
|
|
|
server_daemonize();
|
|
|
|
|
|
|
|
|
|
|
@ -172,9 +176,6 @@ server_start(struct server *s) {
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* initialize libevent */
|
|
|
|
|
|
|
|
s->base = event_base_new();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* start http server */
|
|
|
|
/* start http server */
|
|
|
|
event_set(&s->ev, s->fd, EV_READ | EV_PERSIST, server_can_accept, s);
|
|
|
|
event_set(&s->ev, s->fd, EV_READ | EV_PERSIST, server_can_accept, s);
|
|
|
|
event_base_set(s->base, &s->ev);
|
|
|
|
event_base_set(s->base, &s->ev);
|
|
|
|