TODO: In APR 2.x: Extend apr_sockaddr_t to possibly be a path !!! */
| 3649 | |
| 3650 | /* TODO: In APR 2.x: Extend apr_sockaddr_t to possibly be a path !!! */ |
| 3651 | PROXY_DECLARE(apr_status_t) ap_proxy_connect_uds(apr_socket_t *sock, |
| 3652 | const char *uds_path, |
| 3653 | apr_pool_t *p) |
| 3654 | { |
| 3655 | #if APR_HAVE_SYS_UN_H |
| 3656 | apr_status_t rv; |
| 3657 | apr_os_sock_t rawsock; |
| 3658 | apr_interval_time_t t; |
| 3659 | struct sockaddr_un *sa; |
| 3660 | apr_socklen_t addrlen, pathlen; |
| 3661 | |
| 3662 | rv = apr_os_sock_get(&rawsock, sock); |
| 3663 | if (rv != APR_SUCCESS) { |
| 3664 | return rv; |
| 3665 | } |
| 3666 | |
| 3667 | rv = apr_socket_timeout_get(sock, &t); |
| 3668 | if (rv != APR_SUCCESS) { |
| 3669 | return rv; |
| 3670 | } |
| 3671 | |
| 3672 | pathlen = strlen(uds_path); |
| 3673 | /* copy the UDS path (including NUL) to the sockaddr_un */ |
| 3674 | addrlen = APR_OFFSETOF(struct sockaddr_un, sun_path) + pathlen; |
| 3675 | sa = (struct sockaddr_un *)apr_palloc(p, addrlen + 1); |
| 3676 | memcpy(sa->sun_path, uds_path, pathlen + 1); |
| 3677 | sa->sun_family = AF_UNIX; |
| 3678 | |
| 3679 | do { |
| 3680 | rv = connect(rawsock, (struct sockaddr*)sa, addrlen); |
| 3681 | } while (rv == -1 && (rv = errno) == EINTR); |
| 3682 | |
| 3683 | if (rv && rv != EISCONN) { |
| 3684 | if ((rv == EINPROGRESS || rv == EALREADY) && (t > 0)) { |
| 3685 | #if APR_MAJOR_VERSION < 2 |
| 3686 | rv = apr_wait_for_io_or_timeout(NULL, sock, 0); |
| 3687 | #else |
| 3688 | rv = apr_socket_wait(sock, APR_WAIT_WRITE); |
| 3689 | #endif |
| 3690 | } |
| 3691 | if (rv != APR_SUCCESS) { |
| 3692 | return rv; |
| 3693 | } |
| 3694 | } |
| 3695 | |
| 3696 | return APR_SUCCESS; |
| 3697 | #else |
| 3698 | return APR_ENOTIMPL; |
| 3699 | #endif |
| 3700 | } |
| 3701 | |
| 3702 | PROXY_DECLARE(apr_status_t) ap_proxy_check_connection(const char *scheme, |
| 3703 | proxy_conn_rec *conn, |
no outgoing calls
no test coverage detected