From 067f6086bd5b8a589afe9fdb200c0e39ce4560cf Mon Sep 17 00:00:00 2001 From: root Date: Mon, 23 Feb 2015 02:44:34 +0100 Subject: [PATCH] dns roundrobin --- support/ab.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/support/ab.c b/support/ab.c index b26f0ac..8eb11c7 100644 --- a/support/ab.c +++ b/support/ab.c @@ -256,6 +256,12 @@ struct data { apr_interval_time_t time; /* time for connection */ }; +struct sockaddr_pool /* standard linked list */ +{ + apr_sockaddr_t* val; + struct sockaddr_pool* next; +}; + #define ap_min(a,b) (((a)<(b))?(a):(b)) #define ap_max(a,b) (((a)>(b))?(a):(b)) #define ap_round_ms(a) ((apr_time_t)((a) + 500)/1000) @@ -357,7 +363,7 @@ apr_pool_t *cntxt; apr_pollset_t *readbits; apr_sockaddr_t *mysa; -apr_sockaddr_t *destsa; +struct sockaddr_pool* destsa_pool; #ifdef NOT_ASCII apr_xlate_t *from_ascii, *to_ascii; @@ -1235,10 +1241,11 @@ static void start_connect(struct connection * c) else apr_pool_create(&c->ctx, cntxt); - if ((rv = apr_socket_create(&c->aprsock, destsa->family, + if ((rv = apr_socket_create(&c->aprsock, destsa_pool->val->family, SOCK_STREAM, 0, c->ctx)) != APR_SUCCESS) { apr_err("socket", rv); } + destsa_pool = destsa_pool->next; if (myhost) { if ((rv = apr_socket_bind(c->aprsock, mysa)) != APR_SUCCESS) { @@ -1293,7 +1300,7 @@ static void start_connect(struct connection * c) c->ssl = NULL; } #endif - if ((rv = apr_socket_connect(c->aprsock, destsa)) != APR_SUCCESS) { + if ((rv = apr_socket_connect(c->aprsock, destsa_pool->val)) != APR_SUCCESS) { if (APR_STATUS_IS_EINPROGRESS(rv)) { set_conn_state(c, STATE_CONNECTING); c->rwrite = 0; @@ -1630,6 +1637,7 @@ static void test(void) int i; apr_status_t status; int snprintf_res = 0; + apr_sockaddr_t *destsa; #ifdef NOT_ASCII apr_size_t inbytes_left, outbytes_left; #endif @@ -1768,7 +1776,18 @@ static void test(void) "apr_sockaddr_info_get() for %s", connecthost); apr_err(buf, rv); } - + destsa_pool = malloc(sizeof(struct sockaddr_pool)); + destsa_pool->val = destsa; + { + struct sockaddr_pool* head = destsa_pool; + while(destsa_pool->val->next) + { + destsa_pool->next = malloc(sizeof(struct sockaddr_pool)); + destsa_pool->next->val = destsa_pool->val->next; + destsa_pool = destsa_pool->next; + } + destsa_pool->next = head; + } /* ok - lets start */ start = lasttime = apr_time_now(); stoptime = tlimit ? (start + apr_time_from_sec(tlimit)) : AB_MAX; @@ -1843,7 +1862,7 @@ static void test(void) } if (rtnev & APR_POLLOUT) { if (c->state == STATE_CONNECTING) { - rv = apr_socket_connect(c->aprsock, destsa); + rv = apr_socket_connect(c->aprsock, destsa_pool->val); if (rv != APR_SUCCESS) { set_conn_state(c, STATE_UNCONNECTED); apr_socket_close(c->aprsock); -- 2.0.5