summaryrefslogtreecommitdiffhomepage
path: root/plugins/fcgi/fastcgiprocess.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/fcgi/fastcgiprocess.cpp')
-rw-r--r--plugins/fcgi/fastcgiprocess.cpp84
1 files changed, 49 insertions, 35 deletions
diff --git a/plugins/fcgi/fastcgiprocess.cpp b/plugins/fcgi/fastcgiprocess.cpp
index dd51583..d43fa75 100644
--- a/plugins/fcgi/fastcgiprocess.cpp
+++ b/plugins/fcgi/fastcgiprocess.cpp
@@ -61,6 +61,51 @@ FastCGIProcess::~FastCGIProcess()
stop();
}
+void run_fcgi_app(const std::string& command, const std::string& host, unsigned short port)
+{
+ boost::asio::io_context ioc;
+ boost::asio::ip::tcp::resolver resolver(ioc);
+ boost::asio::ip::tcp::acceptor acceptor(ioc);
+ auto const results = resolver.resolve(host.c_str(), std::to_string(port).c_str());
+ if (results.begin() == results.end())
+ std::runtime_error("no resolve result");
+ boost::asio::ip::tcp::endpoint endpoint{*results.begin()};
+ acceptor.open(endpoint.protocol());
+ acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
+ acceptor.bind(endpoint);
+ acceptor.listen();
+ int fd{acceptor.native_handle()};
+ if (fd != FCGI_LISTENSOCK_FILENO) {
+ close(FCGI_LISTENSOCK_FILENO);
+ dup2(fd, FCGI_LISTENSOCK_FILENO);
+ close(fd);
+ }
+
+ execl(command.c_str(), command.c_str(), (const char*)nullptr);
+}
+
+void run_fcgi_app(const std::string& command, const std::filesystem::path& socket_path)
+{
+ boost::asio::io_context ioc;
+ boost::asio::local::stream_protocol::acceptor file_acceptor(ioc);
+ std::error_code ec;
+ fs::remove(socket_path, ec); // otherwise we get: "bind: Address already in use"
+
+ boost::asio::local::stream_protocol::endpoint endpoint(socket_path);
+ file_acceptor.open(endpoint.protocol());
+ file_acceptor.set_option(boost::asio::local::stream_protocol::acceptor::reuse_address(true));
+ file_acceptor.bind(endpoint);
+ file_acceptor.listen();
+ int fd {file_acceptor.native_handle()};
+ if (fd != FCGI_LISTENSOCK_FILENO) {
+ close(FCGI_LISTENSOCK_FILENO);
+ dup2(fd, FCGI_LISTENSOCK_FILENO);
+ close(fd);
+ }
+
+ execl(command.c_str(), command.c_str(), (const char*)nullptr);
+}
+
void FastCGIProcess::start()
{
if (m_pid != 0)
@@ -72,41 +117,10 @@ void FastCGIProcess::start()
if (m_pid == 0) { // child process branch
try {
- int fd{};
- boost::asio::io_context ioc;
- boost::asio::ip::tcp::resolver resolver(ioc);
- boost::asio::ip::tcp::acceptor acceptor(ioc);
- boost::asio::local::stream_protocol::acceptor file_acceptor(ioc);
-
- if (m_socket_path.empty()) { // tcp connection
- auto const results = resolver.resolve(m_host.c_str(), std::to_string(m_port).c_str());
- if (results.begin() == results.end())
- std::runtime_error("no resolve result");
- boost::asio::ip::tcp::endpoint endpoint{*results.begin()};
- acceptor.open(endpoint.protocol());
- acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
- acceptor.bind(endpoint);
- acceptor.listen();
- fd = acceptor.native_handle();
- } else { // unix domain socket
- std::error_code ec;
- fs::remove(m_socket_path, ec); // otherwise we get: "bind: Address already in use"
-
- boost::asio::local::stream_protocol::endpoint endpoint(m_socket_path);
- file_acceptor.open(endpoint.protocol());
- file_acceptor.set_option(boost::asio::local::stream_protocol::acceptor::reuse_address(true));
- file_acceptor.bind(endpoint);
- file_acceptor.listen();
- fd = file_acceptor.native_handle();
- }
-
- if (fd != FCGI_LISTENSOCK_FILENO) {
- close(FCGI_LISTENSOCK_FILENO);
- dup2(fd, FCGI_LISTENSOCK_FILENO);
- close(fd);
- }
-
- execl(m_command.c_str(), m_command.c_str(), (const char*)nullptr);
+ if (m_socket_path.empty())
+ run_fcgi_app(m_command, m_host, m_port);
+ else
+ run_fcgi_app(m_command, m_socket_path);
} catch (const std::exception& ex) {
std::cout << "FastCGI process error: " << ex.what() << std::endl;
}