/* 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; }
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; }