int server_start(struct server *s) { int i, ret; /* initialize libevent */ s->base = event_base_new(); if(s->cfg->daemonize) { server_daemonize(s->cfg->pidfile); /* sometimes event mech gets lost on fork */ if(event_reinit(s->base) != 0) { fprintf(stderr, "Error: event_reinit failed after fork"); } } /* ignore sigpipe */ #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); #endif slog_init(s); /* install signal handlers */ server_install_signal_handlers(s); /* start worker threads */ for(i = 0; i < s->cfg->http_threads; ++i) { worker_start(s->w[i]); } /* create socket */ s->fd = socket_setup(s, s->cfg->http_host, s->cfg->http_port); if(s->fd < 0) { return -1; } /*set keepalive socket option to do with half connection*/ int keep_alive = 1; setsockopt(s->fd , SOL_SOCKET, SO_KEEPALIVE, (void*)&keep_alive, sizeof(keep_alive)); /* start http server */ event_set(&s->ev, s->fd, EV_READ | EV_PERSIST, server_can_accept, s); event_base_set(s->base, &s->ev); ret = event_add(&s->ev, NULL); if(ret < 0) { slog(s, WEBDIS_ERROR, "Error calling event_add on socket", 0); return -1; } slog(s, WEBDIS_INFO, "Webdis " WEBDIS_VERSION " up and running", 0); event_base_dispatch(s->base); return 0; }
int server_start(struct server *s) { int i, ret; /* setrlimit */ server_setrlimit(8192); /* daemonize */ if (s->cfg->daemonize) { server_daemonize(s->cfg->pid); /* sometimes event mech gets lost on fork */ if (event_reinit(s->base) != 0) { fprintf(stderr, "Error: event_reinit failed after fork"); } } /* ignore sigpipe */ #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); #endif /* lose root privileges if we have them */ /*ret = server_setuid(s->cfg->user); if(ret < 0) { return -1; }*/ /* slog init */ slog_init(s); /* install signal handlers */ server_install_signal_handlers(s); /* initialize libevent */ s->base = event_base_new(); /* start worker threads */ for (i = 0; i < s->cfg->worker_processes; ++i) { worker_start(s->w[i]); } /* create socket */ ret = socket_setup(s, s->cfg->http.servers); if(ret < 0) { return -1; } /* dispatch */ slog(s, LOG_INFO, "pbiws " PBIWS_VERSION " up and running", 0); event_base_dispatch(s->base); return 0; }