-
- if (drop_privileges(RUNAS_USER, RUNAS_GROUP) < 0) {
- syslog(LOG_CRIT, "unable to drop privileges");
- return EXIT_FAILURE;
- }
-
- if (daemonize && daemon_detach() < 0) {
- syslog(LOG_CRIT, "unable to fork");
- return EXIT_FAILURE;
- }
-
- pidfile_refresh();
-
- addr.sin_port = htons(port);
- sock = tcp_listen_nonblock((struct sockaddr *)&addr, sizeof(addr));
- if (sock < 0)
- return EXIT_FAILURE;
-
- while (!sigint) {
- fd_set rfd;
- struct timeval tv = { 1, 0 };
- int res;
-
- FD_SET(sock, &rfd);
- res = select(sock + 1, &rfd, NULL, NULL, &tv);
-
- if (res < 0) {
- if (errno != EINTR && errno != EAGAIN) {
- UNIXERR("select");
- return EXIT_FAILURE;
- }
- }
- if (res > 0) {
- int fd = accept(sock, NULL, 0);
- if (fd < 0) {
- if (errno != EINTR && errno != EAGAIN) {
- UNIXERR("accept");
- return EXIT_FAILURE;
- }
- continue;
- }
- thread_launch(policy_run, fd, NULL);
- }
- threads_join();
- }
-
- close(sock);
- syslog(LOG_INFO, "Stopping...");
- return EXIT_SUCCESS;