static void auto_connect_relay(redsocks_client *client) { socks5_client *socks5 = (void*)(client + 1); struct timeval tv; tv.tv_sec = CONNECT_TIMEOUT_SECONDS; tv.tv_usec = 0; if (client->state == socks5_pre_detect) { if (is_addr_in_cache(&client->destaddr)) { client->state = socks5_new; /* Connect SOCKS5 */ redsocks_log_error(client, LOG_DEBUG, "Found in cache"); } } client->relay = red_connect_relay2( client->state == socks5_pre_detect ? &client->destaddr : &client->instance->config.relayaddr, auto_relay_connected, auto_event_error, client, client->state == socks5_pre_detect ? &tv: NULL); socks5->time_connect_relay = redsocks_time(NULL); if (!client->relay) { redsocks_log_errno(client, LOG_ERR, "auto_connect_relay"); redsocks_drop_client(client); } }
static void auto_connect_relay(redsocks_client *client) { autoproxy_client * aclient = (void*)(client + 1) + client->instance->relay_ss->payload_len; struct timeval tv; tv.tv_sec = client->instance->config.timeout; tv.tv_usec = 0; time_t * acc_time = NULL; time_t now = redsocks_time(NULL); /* use default timeout if timeout is not configured */ if (tv.tv_sec == 0) tv.tv_sec = DEFAULT_CONNECT_TIMEOUT_SECONDS; if (aclient->state == AUTOPROXY_NEW) { acc_time = get_addr_time_in_cache(&client->destaddr); if (acc_time) { if (now - *acc_time < CACHE_ITEM_STALE_SECONDS ) { redsocks_log_error(client, LOG_DEBUG, "Found dest IP in cache"); auto_retry(client, 0); return ; } else { /* stale this address in cache */ del_addr_from_cache(&client->destaddr); /* update timeout value for quick detection */ tv.tv_sec = QUICK_CONNECT_TIMEOUT_SECONDS; } } /* connect to target directly without going through proxy */ client->relay = red_connect_relay2(&client->destaddr, auto_relay_connected, auto_event_error, client, &tv); aclient->time_connect_relay = redsocks_time(NULL); if (!client->relay) { redsocks_log_errno(client, LOG_ERR, "auto_connect_relay"); redsocks_drop_client(client); } } else { redsocks_log_errno(client, LOG_ERR, "invalid state: %d", aclient->state); } }
static int ss_connect_relay(redsocks_client *client) { struct timeval tv; tv.tv_sec = client->instance->config.timeout; tv.tv_usec = 0; /* use default timeout if timeout is not configured */ if (tv.tv_sec == 0) tv.tv_sec = DEFAULT_CONNECT_TIMEOUT; client->relay = red_connect_relay2(&client->instance->config.relayaddr, NULL, ss_relay_connected, redsocks_event_error, client, &tv); if (!client->relay) { redsocks_log_errno(client, LOG_ERR, "ss_connect_relay"); redsocks_drop_client(client); return -1; } return 0; }