From aa79e8701d39de2a24b2de7b97d3fc137e87b27b Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Sun, 12 Feb 2023 18:54:34 +0100 Subject: Enable multiple arguments for FCGI app when run via webapp-runner --- plugins/fcgi/fastcgiprocess.cpp | 13 +++++++------ plugins/fcgi/fastcgiprocess.h | 4 ++-- plugins/fcgi/webapp-runner.cpp | 6 +++--- 3 files changed, 12 insertions(+), 11 deletions(-) (limited to 'plugins/fcgi') diff --git a/plugins/fcgi/fastcgiprocess.cpp b/plugins/fcgi/fastcgiprocess.cpp index d43fa75..017cab6 100644 --- a/plugins/fcgi/fastcgiprocess.cpp +++ b/plugins/fcgi/fastcgiprocess.cpp @@ -61,7 +61,7 @@ FastCGIProcess::~FastCGIProcess() stop(); } -void run_fcgi_app(const std::string& command, const std::string& host, unsigned short port) +void run_fcgi_app(const std::string& command, const std::string& host, unsigned short port, int arg, char* argv[]) { boost::asio::io_context ioc; boost::asio::ip::tcp::resolver resolver(ioc); @@ -81,10 +81,10 @@ void run_fcgi_app(const std::string& command, const std::string& host, unsigned close(fd); } - execl(command.c_str(), command.c_str(), (const char*)nullptr); + execv(command.c_str(), argv); } -void run_fcgi_app(const std::string& command, const std::filesystem::path& socket_path) +void run_fcgi_app(const std::string& command, const std::filesystem::path& socket_path, int arg, char* argv[]) { boost::asio::io_context ioc; boost::asio::local::stream_protocol::acceptor file_acceptor(ioc); @@ -103,7 +103,7 @@ void run_fcgi_app(const std::string& command, const std::filesystem::path& socke close(fd); } - execl(command.c_str(), command.c_str(), (const char*)nullptr); + execv(command.c_str(), argv); } void FastCGIProcess::start() @@ -116,11 +116,12 @@ void FastCGIProcess::start() throw std::runtime_error("Fork unsuccessful."); if (m_pid == 0) { // child process branch + char* argv[] {m_command.data(), nullptr}; try { if (m_socket_path.empty()) - run_fcgi_app(m_command, m_host, m_port); + run_fcgi_app(m_command, m_host, m_port, 2, argv); else - run_fcgi_app(m_command, m_socket_path); + run_fcgi_app(m_command, m_socket_path, 2, argv); } catch (const std::exception& ex) { std::cout << "FastCGI process error: " << ex.what() << std::endl; } diff --git a/plugins/fcgi/fastcgiprocess.h b/plugins/fcgi/fastcgiprocess.h index 18a5d5b..4c01609 100644 --- a/plugins/fcgi/fastcgiprocess.h +++ b/plugins/fcgi/fastcgiprocess.h @@ -10,8 +10,8 @@ #include #include -void run_fcgi_app(const std::string& command, const std::string& host, unsigned short port); -void run_fcgi_app(const std::string& command, const std::filesystem::path& socket_path); +void run_fcgi_app(const std::string& command, const std::string& host, unsigned short port, int arg, char* argv[]); +void run_fcgi_app(const std::string& command, const std::filesystem::path& socket_path, int arg, char* argv[]); class FastCGIProcess { diff --git a/plugins/fcgi/webapp-runner.cpp b/plugins/fcgi/webapp-runner.cpp index 64268f3..ad8c396 100644 --- a/plugins/fcgi/webapp-runner.cpp +++ b/plugins/fcgi/webapp-runner.cpp @@ -30,16 +30,16 @@ webapp-runner fcgi-socket0 ./fcgi1 int main(int argc, char* argv[]) { try { - if (argc == 3) { + if (argc >= 3) { std::string address{argv[1]}; std::string command{argv[2]}; if (auto pos{address.find_last_of(':')}; pos != std::string::npos) { std::string host{address.substr(0, pos)}; unsigned short port{static_cast(std::stoul(address.substr(pos + 1)))}; - run_fcgi_app(command, host, port); + run_fcgi_app(command, host, port, argc - 2, &argv[2]); } else { - run_fcgi_app(command, address); + run_fcgi_app(command, address, argc - 2, &argv[2]); } } else { usage(); -- cgit v1.2.3