MCPcopy Create free account
hub / github.com/apache/httpd / ap_proxy_connect_uds

Function ap_proxy_connect_uds

modules/proxy/proxy_util.c:3651–3700  ·  view source on GitHub ↗

TODO: In APR 2.x: Extend apr_sockaddr_t to possibly be a path !!! */

Source from the content-addressed store, hash-verified

3649
3650/* TODO: In APR 2.x: Extend apr_sockaddr_t to possibly be a path !!! */
3651PROXY_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
3702PROXY_DECLARE(apr_status_t) ap_proxy_check_connection(const char *scheme,
3703 proxy_conn_rec *conn,

Callers 2

get_socket_from_pathFunction · 0.85
ap_proxy_connect_backendFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected