static int connect_remote(CLI * c) { int fd, ind_try, ind_cur; SOCKADDR_LIST *remote_addr; remote_addr = dynamic_remote_addr(c); for (ind_try = 0; ind_try < remote_addr->num; ind_try++) { if (c->opt->failover == FAILOVER_RR) { ind_cur = remote_addr->cur; remote_addr->cur = (ind_cur + 1) % remote_addr->num; } else { ind_cur = ind_try; } c->fd = s_socket(remote_addr->addr[ind_cur].sa.sa_family, SOCK_STREAM, 0, 1, "remote socket"); if (c->fd < 0) longjmp(c->err, 1); local_bind(c); if (connect_blocking(c, &remote_addr->addr[ind_cur], addr_len(&remote_addr->addr[ind_cur]))) { closesocket(c->fd); c->fd = -1; continue; } print_bound_address(c); fd = c->fd; c->fd = -1; return fd; } longjmp(c->err, 1); return -1; }
/* connect remote host */ static int connect_remote(CLI *c) { int fd, ind_try, ind_cur; SOCKADDR_LIST *remote_addr; /* list of connect_blocking() targets */ remote_addr=dynamic_remote_addr(c); /* try to connect each host from the list */ for(ind_try=0; ind_try<remote_addr->num; ind_try++) { if(c->opt->failover==FAILOVER_RR) { ind_cur=remote_addr->cur; /* the race condition here can be safely ignored */ remote_addr->cur=(ind_cur+1)%remote_addr->num; } else { /* FAILOVER_PRIO */ ind_cur=ind_try; /* ignore remote_addr->cur */ } c->fd=s_socket(remote_addr->addr[ind_cur].sa.sa_family, SOCK_STREAM, 0, 1, "remote socket"); if(c->fd<0) longjmp(c->err, 1); local_bind(c); /* explicit local bind or transparent proxy */ if(connect_blocking(c, &remote_addr->addr[ind_cur], addr_len(&remote_addr->addr[ind_cur]))) { closesocket(c->fd); c->fd=-1; continue; /* next IP */ } print_bound_address(c); fd=c->fd; c->fd=-1; return fd; /* success! */ } longjmp(c->err, 1); return -1; /* some C compilers require a return value */ }