static const char * fcgi_pass_fd(struct fcgi_context *fc, int *fdp, FCGI_FILE *ffp, char *buf, size_t bufsize) { ssize_t nread; char *p = buf; unsigned char cclass, next_state; nread = read(*fdp, buf, bufsize); if (nread > 0) { while (p < buf + nread) { if (*p == '\r') { cclass = CC_CR; } else if (*p == '\n') { cclass = CC_LF; } else { cclass = CC_NORMAL; } next_state = header_state_machine[fc->reply_state][cclass]; fc->reply_state = next_state & ~ACTION_MASK; switch(next_state & ACTION_MASK) { case ACTION_ERROR: return "parsing CGI reply"; case ACTION_END: goto out_of_loop; case ACTION_SKIP: goto next_char; case ACTION_EXTRA_CR: if (FCGI_fputc('\r', ffp) == EOF) return "writing CGI reply"; break; case ACTION_EXTRA_LF: if (FCGI_fputc('\n', ffp) == EOF) return "writing CGI reply"; break; } if (FCGI_fputc(*p, ffp) == EOF) { return "writing CGI reply"; } next_char: p++; } out_of_loop: if (p < buf + nread) { if (FCGI_fwrite(p, 1, buf + nread - p, ffp) != (size_t)(buf + nread - p)) { return "writing CGI reply"; } } } else { if (nread < 0) { return "reading CGI reply"; } close(*fdp); *fdp = -1; } return NULL; }
static void error_403(const char *reason, const char *filename) { FCGI_fputs("Status: 403 Forbidden\nContent-type: text/plain\n\n403", FCGI_stdout); if (filename) { FCGI_fprintf(FCGI_stderr, "%s (%s)\n", reason, filename); } else { FCGI_fputs(reason, FCGI_stderr); FCGI_fputc('\n', FCGI_stderr); } exit(99); }
int FCGI_putchar(int c) { return FCGI_fputc(c, FCGI_stdout); }