/* This file is part of libmicrohttpd Copyright (C) 2007-2018 Daniel Pittman and Christian Grothoff This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /** * @file lib/daemon_run.c * @brief generic function to run event loop of a daemon * @author Christian Grothoff */ #include "internal.h" #include "connection_cleanup.h" #include "daemon_epoll.h" #include "daemon_poll.h" #include "daemon_select.h" /** * Run webserver operations (without blocking unless in client * callbacks). This method should be called by clients in combination * with #MHD_get_fdset if the client-controlled select method is used * and #MHD_get_timeout(). * * This function is a convenience method, which is useful if the * fd_sets from #MHD_get_fdset were not directly passed to `select()`; * with this function, MHD will internally do the appropriate `select()` * call itself again. While it is always safe to call #MHD_run (if * #MHD_USE_INTERNAL_POLLING_THREAD is not set), you should call * #MHD_run_from_select if performance is important (as it saves an * expensive call to `select()`). * * @param daemon daemon to run * @return #MHD_SC_OK on success * @ingroup event */ enum MHD_StatusCode MHD_daemon_run (struct MHD_Daemon *daemon) { enum MHD_StatusCode sc; if (daemon->shutdown) return MHD_SC_DAEMON_ALREADY_SHUTDOWN; if (MHD_TM_EXTERNAL_EVENT_LOOP != daemon->threading_mode) return MHD_SC_CONFIGURATION_MISSMATCH_FOR_RUN_EXTERNAL; switch (daemon->event_loop_syscall) { case MHD_ELS_POLL: sc = MHD_daemon_poll_ (daemon, MHD_NO); MHD_connection_cleanup_ (daemon); return sc; #ifdef EPOLL_SUPPORT case MHD_ELS_EPOLL: sc = MHD_daemon_epoll_ (daemon, MHD_NO); MHD_connection_cleanup_ (daemon); return sc; #endif case MHD_ELS_SELECT: return MHD_daemon_select_ (daemon, MHD_NO); /* MHD_select does MHD_connection_cleanup_ already */ default: return MHD_SC_CONFIGURATION_UNEXPECTED_ELS; } } /* end of daemon_run.c */