apr_status_t procmgr_fetch_cmd(fcgid_command * command, server_rec * main_server) { apr_status_t rv; /* Sanity check */ if (!g_pm_read_pipe) return APR_EPIPE; /* Wait for next command */ #if APR_MAJOR_VERSION < 2 rv = apr_wait_for_io_or_timeout(g_pm_read_pipe, NULL, FOR_READ); #else rv = apr_file_pipe_wait(g_pm_read_pipe, APR_WAIT_READ); #endif /* Log any unexpect result */ if (rv != APR_SUCCESS && !APR_STATUS_IS_TIMEUP(rv)) { ap_log_error(APLOG_MARK, APLOG_WARNING, rv, main_server, "mod_fcgid: error while waiting for message from pipe"); return rv; } /* Timeout */ if (rv != APR_SUCCESS) return rv; return apr_file_read_full(g_pm_read_pipe, command, sizeof(*command), NULL); }
apr_status_t apr_wait_for_io_or_timeout(apr_file_t *f, apr_socket_t *s, int for_read) { if (f) { return apr_file_pipe_wait(f, for_read ? APR_WAIT_READ : APR_WAIT_WRITE); } else if (s) { return apr_socket_wait(s, for_read ? APR_WAIT_READ : APR_WAIT_WRITE); } /* Didn't specify a file or socket */ return APR_EINVAL; }