| 72 | } |
| 73 | |
| 74 | static apr_status_t send_socket(apr_pool_t *p, |
| 75 | apr_socket_t *s, |
| 76 | apr_socket_t *outbound) |
| 77 | { |
| 78 | apr_status_t rv; |
| 79 | apr_os_sock_t rawsock; |
| 80 | apr_os_sock_t srawsock; |
| 81 | struct msghdr msg; |
| 82 | struct cmsghdr *cmsg; |
| 83 | struct iovec iov; |
| 84 | char b = '\0'; |
| 85 | |
| 86 | rv = apr_os_sock_get(&rawsock, outbound); |
| 87 | if (rv != APR_SUCCESS) { |
| 88 | return rv; |
| 89 | } |
| 90 | |
| 91 | rv = apr_os_sock_get(&srawsock, s); |
| 92 | if (rv != APR_SUCCESS) { |
| 93 | return rv; |
| 94 | } |
| 95 | |
| 96 | memset(&msg, 0, sizeof(msg)); |
| 97 | |
| 98 | msg.msg_iov = &iov; |
| 99 | msg.msg_iovlen = 1; |
| 100 | |
| 101 | iov.iov_base = &b; |
| 102 | iov.iov_len = 1; |
| 103 | |
| 104 | cmsg = apr_palloc(p, sizeof(*cmsg) + sizeof(rawsock)); |
| 105 | cmsg->cmsg_len = sizeof(*cmsg) + sizeof(rawsock); |
| 106 | cmsg->cmsg_level = SOL_SOCKET; |
| 107 | cmsg->cmsg_type = SCM_RIGHTS; |
| 108 | |
| 109 | memcpy(CMSG_DATA(cmsg), &rawsock, sizeof(rawsock)); |
| 110 | |
| 111 | msg.msg_control = cmsg; |
| 112 | msg.msg_controllen = cmsg->cmsg_len; |
| 113 | |
| 114 | rv = sendmsg(srawsock, &msg, 0); |
| 115 | |
| 116 | if (rv == -1) { |
| 117 | return errno; |
| 118 | } |
| 119 | |
| 120 | return APR_SUCCESS; |
| 121 | } |
| 122 | |
| 123 | static int proxy_fdpass_handler(request_rec *r, proxy_worker *worker, |
| 124 | proxy_server_conf *conf, |
no outgoing calls
no test coverage detected