in modules/fcgid/fcgid_proc_unix.c [508:554]
apr_status_t proc_connect_ipc(fcgid_procnode *procnode, fcgid_ipc *ipc_handle)
{
fcgid_namedpipe_handle *handle_info;
struct sockaddr_un unix_addr;
apr_status_t rv;
/* Alloc memory for unix domain socket */
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;
handle_info->handle_socket = socket(AF_UNIX, SOCK_STREAM, 0);
apr_pool_cleanup_register(ipc_handle->request->pool,
handle_info, ipc_handle_cleanup,
apr_pool_cleanup_null);
/* Connect to fastcgi server */
memset(&unix_addr, 0, sizeof(unix_addr));
unix_addr.sun_family = AF_UNIX;
/* PM already made this check for truncation */
AP_DEBUG_ASSERT(sizeof unix_addr.sun_path > strlen(procnode->socket_path));
apr_cpystrn(unix_addr.sun_path, procnode->socket_path,
sizeof(unix_addr.sun_path));
/* I am the only one who connecting the server
So I don't have to worry about ECONNREFUSED(listen queue overflow) problem,
and I will never retry on error */
if (connect(handle_info->handle_socket, (struct sockaddr *) &unix_addr,
sizeof(unix_addr)) < 0) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, apr_get_os_error(),
ipc_handle->request,
"mod_fcgid: can't connect unix domain socket: %s",
procnode->socket_path);
return APR_ECONNREFUSED;
}
/* Set nonblock option */
if ((rv = set_socket_nonblock(handle_info->handle_socket)) != APR_SUCCESS) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, ipc_handle->request,
"mod_fcgid: can't make unix domain socket nonblocking");
return rv;
}
return APR_SUCCESS;
}