static void test_serv_by_name(abts_case *tc, void *data) { apr_status_t rv; apr_sockaddr_t *sa; rv = apr_sockaddr_info_get(&sa, NULL, APR_UNSPEC, 0, 0, p); APR_ASSERT_SUCCESS(tc, "Problem generating sockaddr", rv); rv = apr_getservbyname(sa, "ftp"); APR_ASSERT_SUCCESS(tc, "Problem getting ftp service", rv); ABTS_INT_EQUAL(tc, 21, sa->port); rv = apr_getservbyname(sa, "complete_and_utter_rubbish"); APR_ASSERT_SUCCESS(tc, "Problem getting non-existent service", !rv); rv = apr_getservbyname(sa, "telnet"); APR_ASSERT_SUCCESS(tc, "Problem getting telnet service", rv); ABTS_INT_EQUAL(tc, 23, sa->port); }
/** * Connect to the remote host */ static apr_status_t tcp_proxy_do_tcp_connect(request_rec * r, TcpProxyData * tpd, apr_pool_t * mp) { apr_sockaddr_t *sa; apr_socket_t *s; apr_status_t rv; APACHELOG(APLOG_DEBUG, r, "tcp_proxy_do_tcp_connect: connect to host %s port %s", tpd->host, tpd->port); int port = atoi(tpd->port); rv = apr_sockaddr_info_get(&sa, tpd->host, APR_INET, port, 0, mp); if (rv != APR_SUCCESS) { return rv; } if (!port) { rv = apr_getservbyname(sa, tpd->port); if (rv != APR_SUCCESS) { return rv; } } rv = apr_socket_create(&s, sa->family, SOCK_STREAM, APR_PROTO_TCP, mp); if (rv != APR_SUCCESS) { return rv; } /* it is a good idea to specify socket options explicitly. * in this case, we make a blocking socket with timeout. */ apr_socket_opt_set(s, APR_SO_NONBLOCK, 0); apr_socket_opt_set(s, APR_SO_KEEPALIVE, 1); if (tpd->timeout) apr_socket_timeout_set(s, ((apr_interval_time_t) tpd->timeout) * APR_USEC_PER_SEC); rv = apr_socket_connect(s, sa); if (rv != APR_SUCCESS) { return rv; } /* see the tutorial about the reason why we have to specify options again */ apr_socket_opt_set(s, APR_SO_NONBLOCK, 0); apr_socket_opt_set(s, APR_SO_KEEPALIVE, 1); if (tpd->timeout) apr_socket_timeout_set(s, ((apr_interval_time_t) tpd->timeout) * APR_USEC_PER_SEC); tpd->tcpsocket = s; return APR_SUCCESS; }