/* output: apr_socket_t, apr_sockaddr_t */
static apr_status_t build_connection (request_rec *r,
                                      const char *hostname,
                                      const apr_int64_t port,
                                      apr_socket_t **ps,
                                      apr_sockaddr_t **psa)
{
    apr_status_t rv;
    apr_pool_t *rp = r->pool;
    rv = apr_sockaddr_info_get (psa, hostname, APR_INET, port, 0, rp);
    if (rv != APR_SUCCESS)
        return rv;
#if APR_MAJOR_VERSION != 0
    rv = apr_socket_create (ps, (*psa)->family,
                            SOCK_STREAM, APR_PROTO_TCP, rp);
#else
    rv = apr_socket_create_ex (ps, (*psa)->family,
                               SOCK_STREAM, APR_PROTO_TCP, rp);
#endif
    if (rv != APR_SUCCESS)
        return rv;
    rv = apr_socket_connect (*ps, *psa);
    return rv;
}
Exemple #2
0
apr_status_t jxr_connect_socket(jaxer_connection * ac)
{
	apr_status_t rv;
	apr_socket_t *sock = 0;
	jaxer_worker *aworker = ac->worker;
	apr_sockaddr_t *remote_sa = aworker->remote_sa;
	apr_pool_t *p = ac->worker->pool;

	ap_log_perror(APLOG_MARK, APLOG_ZDEBUG, 0, p, "in jxr_connect-socket");

	if (ac->sock)
	{
		if ((rv=apr_socket_close(ac->sock)) != APR_SUCCESS)
		{
			ap_log_perror(APLOG_MARK, APLOG_WARNING, rv, p,
				"mod_jaxer: faied to close socket: return code=%d", rv);
			// return rv;
		}
		ac->sock = 0;
	}

#ifdef _APACHE20
	rv = apr_socket_create_ex(&sock, APR_INET, SOCK_STREAM, APR_PROTO_TCP, p);
#else
	rv = apr_socket_create(&sock, APR_INET, SOCK_STREAM, APR_PROTO_TCP, p);
#endif
	ap_log_perror(APLOG_MARK, APLOG_ZDEBUG, 0, p, "in jxr_connect-socket: apr_socket_create returned %d", rv);

	if (rv != APR_SUCCESS)
	{
		ap_log_perror(APLOG_MARK, APLOG_WARNING, rv, p,
				"mod_jaxer: faied to create socket: return code=%d", rv);
		return rv;
	}

	

	/*
	 * The options for the sockets
	 */
#if 0
	// KEEPALIVE
	rv = apr_socket_opt_set(sock, APR_SO_KEEPALIVE, 1);
	if (rv != APR_SUCCESS)
	{
		compat_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r,
				"mod_jaxer: apr_socket_opt_set failed to set keep alive: return code=%d", rv);
		return rv;
	}
	

	// APR_SO_LINGER?
	rv = apr_socket_opt_set(sock, APR_SO_LINGER, 0);
	if (rv != APR_SUCCESS)
	{
		compat_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r,
				"mod_jaxer: apr_socket_opt_set failed to set keep alive: return code=%d", rv);
		return rv;
	}

	//TIME OUT
	rv = apr_socket_timeout_set(sock, apr_time_from_sec(3));
    if (rv != APR_SUCCESS)
	{
		compat_log_rerror(APLOG_MARK, APLOG_WARNING, rv, r,
				"mod_jaxer: apr_socket_opt_set failed to set timeout: return code=%d", rv);
		return rv;
	} 
#endif
	
	// Block first
	rv = apr_socket_opt_set(sock, APR_SO_NONBLOCK, 0);
	ap_log_perror(APLOG_MARK, APLOG_ZDEBUG, 0, p, "apr_socket_opt_set return %d", rv);
	if (rv != APR_SUCCESS)
	{
		ap_log_perror(APLOG_MARK, APLOG_WARNING, rv, p,
				"mod_jaxer: apr_socket_opt_set failed to set blocking: return code=%d", rv);
		return rv;
	}

	rv = apr_socket_connect(sock, remote_sa);
	ap_log_perror(APLOG_MARK, APLOG_ZDEBUG, 0, p, "apr_socket_connect return %d", rv);
	ap_log_perror(APLOG_MARK, APLOG_ZDEBUG, 0, p, "sa: hostname=%s servername=%s port=%d family=%d salen=%d", 
      remote_sa->hostname,
      remote_sa->servname,
      remote_sa->port,
      remote_sa->family,
      remote_sa->salen
);
if (APR_STATUS_IS_EAGAIN(rv))
{
fprintf(stderr, "EAGAIN\n");
}else if (APR_STATUS_IS_EINPROGRESS(rv))
{
fprintf(stderr, "EEINPROGRESS\n");
}

	if (rv != APR_SUCCESS)
	{
		ap_log_perror(APLOG_MARK, APLOG_WARNING, rv, p,
				"mod_jaxer: apr_socket_connect failed: return code=%d", rv);
		return rv;
	}

	ac->sock = sock;
	return rv;
}