diff options
-rw-r--r-- | fcgiwrap.c | 23 |
1 files changed, 17 insertions, 6 deletions
@@ -11,6 +11,7 @@ #include <string.h> #include <sys/stat.h> #include <limits.h> +#include <stdbool.h> extern char **environ; static char * const * inherited_environ; @@ -233,25 +234,35 @@ static const char * fcgi_pass_raw_fd(int *fdp, int fd_out, char *buf, size_t buf return NULL; } -static void fcgi_pass(struct fcgi_context *fc) +static bool fcgi_pass_request(struct fcgi_context *fc) { char buf[FCGI_BUF_SIZE]; ssize_t nread; - fd_set rset; - int maxfd = 1 + max_va(fc->fd_stdout, fc->fd_stderr, MAX_VA_SENTINEL); - int nready; - const char *err; /* eat the whole request and pass it to CGI */ while ((nread = FCGI_fread(buf, 1, sizeof(buf), FCGI_stdin)) > 0) { if (write_all(fc->fd_stdin, buf, nread) <= 0) { fcgi_finish(fc, "reading the request"); - return; + return false; } } close(fc->fd_stdin); fc->fd_stdin = -1; + return true; +} + +static void fcgi_pass(struct fcgi_context *fc) +{ + char buf[FCGI_BUF_SIZE]; + fd_set rset; + int maxfd = 1 + max_va(fc->fd_stdout, fc->fd_stderr, MAX_VA_SENTINEL); + int nready; + const char *err; + + if (!fcgi_pass_request(fc)) + return; + /* now pass CGI reply back */ while (fc->fd_stdout >= 0 && fc->fd_stderr >= 0) { FD_ZERO(&rset); |