in modules/fcgid/fcgid_proc_unix.c [567:629]
apr_status_t proc_read_ipc(fcgid_ipc *ipc_handle, const char *buffer,
apr_size_t *size)
{
int retcode, unix_socket;
fcgid_namedpipe_handle *handle_info;
struct pollfd pollfds[1];
handle_info = (fcgid_namedpipe_handle *) ipc_handle->ipc_handle_info;
unix_socket = handle_info->handle_socket;
do {
if ((retcode = read(unix_socket, (void *) buffer, *size)) > 0) {
*size = retcode;
return APR_SUCCESS;
}
} while (retcode == -1 && APR_STATUS_IS_EINTR(errno));
if (retcode == -1 && !APR_STATUS_IS_EAGAIN(errno)) {
ap_log_rerror(APLOG_MARK, APLOG_WARNING, errno,
ipc_handle->request,
"mod_fcgid: error reading data from FastCGI server");
return errno;
}
/* I have to wait a while */
pollfds[0].fd = unix_socket;
pollfds[0].events = POLLIN;
do {
retcode = poll(pollfds, 1, ipc_handle->communation_timeout * 1000);
} while (retcode <= 0 && APR_STATUS_IS_EINTR(errno));
if (retcode == -1) {
ap_log_rerror(APLOG_MARK, APLOG_WARNING, errno,
ipc_handle->request,
"mod_fcgid: error polling unix domain socket");
return errno;
}
else if (retcode == 0) {
ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0,
ipc_handle->request,
"mod_fcgid: read data timeout in %d seconds",
ipc_handle->communation_timeout);
return APR_ETIMEDOUT;
}
do {
if ((retcode = read(unix_socket, (void *) buffer, *size)) > 0) {
*size = retcode;
return APR_SUCCESS;
}
} while (retcode == -1 && APR_STATUS_IS_EINTR(errno));
if (retcode == 0) {
ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0,
ipc_handle->request,
"mod_fcgid: error reading data, FastCGI server closed connection");
return APR_EPIPE;
}
ap_log_rerror(APLOG_MARK, APLOG_WARNING, errno,
ipc_handle->request,
"mod_fcgid: error reading data from FastCGI server");
return errno;
}