in modules/fcgid/fcgid_proc_win.c [252:316]
apr_status_t proc_connect_ipc(fcgid_procnode *procnode, fcgid_ipc *ipc_handle)
{
/* Prepare the ipc struct */
fcgid_namedpipe_handle *handle_info;
ipc_handle->ipc_handle_info =
(fcgid_namedpipe_handle *) apr_pcalloc(ipc_handle->request->pool,
sizeof
(fcgid_namedpipe_handle));
handle_info = (fcgid_namedpipe_handle *) ipc_handle->ipc_handle_info;
/* Prepare OVERLAPPED struct for non-block I/O */
handle_info->overlap_read.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
handle_info->overlap_write.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
handle_info->handle_pipe = INVALID_HANDLE_VALUE;
apr_pool_cleanup_register(ipc_handle->request->pool,
handle_info,
ipc_handle_cleanup, apr_pool_cleanup_null);
if (handle_info->overlap_read.hEvent == NULL
|| handle_info->overlap_write.hEvent == NULL)
return APR_ENOMEM;
/* Connect to name pipe */
handle_info->handle_pipe = CreateFile(procnode->socket_path,
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, NULL);
if (handle_info->handle_pipe == INVALID_HANDLE_VALUE
&& ipc_handle->connect_timeout != 0
&& GetLastError() == ERROR_PIPE_BUSY)
{
/* XXX - there appears to be a race, here
* Wait for pipe to be ready for connect, and try again
*/
if (WaitNamedPipe(procnode->socket_path, ipc_handle->connect_timeout))
{
handle_info->handle_pipe = CreateFile(procnode->socket_path,
GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, NULL);
}
}
if (handle_info->handle_pipe == INVALID_HANDLE_VALUE)
{
if (GetLastError() == ERROR_FILE_NOT_FOUND) /* The process has exited */
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, ipc_handle->request,
"mod_fcgid: can't connect to named pipe, FastCGI"
" server %" APR_PID_T_FMT " has been terminated",
procnode->proc_id.pid);
else
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, apr_get_os_error(),
ipc_handle->request,
"mod_fcgid: can't connect to named pipe, FastCGI"
" server pid %" APR_PID_T_FMT,
procnode->proc_id.pid);
return APR_ESPIPE;
}
/* Now named pipe connected */
return APR_SUCCESS;
}