void set_hostport(char *hostport, int max_size, char *host, int port, ibp_connect_context_t *cc) { char in_addr[DNS_ADDR_MAX]; char ip[64]; int type, i; type = (cc == NULL) ? NS_TYPE_SOCK : cc->type; i = 0; while ((host[i] != 0) && (host[i] != '#')) i++; if (host[i] == '#') { host[i] = 0; i=-i; } if (tbx_dnsc_lookup(host, in_addr, ip) != 0) { if (i<0) host[-i] = '#'; log_printf(1, "set_hostport: Failed to lookup host: %s\n", host); hostport[max_size-1] = '\0'; snprintf(hostport, max_size-1, "%s:%d:%d:0", host, port, type); return; } if (i<0) host[-i] = '#'; ip[63] = '\0'; hostport[max_size-1] = '\0'; snprintf(hostport, max_size-1, "%s" HP_HOSTPORT_SEPARATOR "%d" HP_HOSTPORT_SEPARATOR "%d" HP_HOSTPORT_SEPARATOR "0", host, port, type); }
host_portal_t *create_hportal(portal_context_t *hpc, void *connect_context, char *hostport, int min_conn, int max_conn, apr_time_t dt_connect) { host_portal_t *hp; log_printf(15, "create_hportal: hpc=%p\n", hpc); tbx_type_malloc_clear(hp, host_portal_t, 1); assert_result(apr_pool_create(&(hp->mpool), NULL), APR_SUCCESS); char host[sizeof(hp->host)]; int port; char *hp2 = strdup(hostport); char *bstate; int fin; host[0] = '\0'; strncpy(host, tbx_stk_string_token(hp2, HP_HOSTPORT_SEPARATOR, &bstate, &fin), sizeof(host)-1); host[sizeof(host)-1] = '\0'; port = atoi(bstate); free(hp2); log_printf(15, "create_hportal: hostport: %s host=%s port=%d min=%d max=%d dt=" TT "\n", hostport, host, port, min_conn, max_conn, dt_connect); strncpy(hp->host, host, sizeof(hp->host)-1); hp->host[sizeof(hp->host)-1] = '\0'; //** Check if we can resolve the host's IP address char in_addr[6]; if (tbx_dnsc_lookup(host, in_addr, NULL) != 0) { log_printf(1, "create_hportal: Can\'t resolve host address: %s:%d\n", host, port); hp->invalid_host = 0; // hp->invalid_host = 1; } else { hp->invalid_host = 0; } hp->port = port; snprintf(hp->skey, sizeof(hp->skey), "%s", hostport); hp->connect_context = hpc->fn->dup_connect_context(connect_context); hp->context = hpc; hp->min_conn = min_conn; hp->max_conn = max_conn; hp->dt_connect = dt_connect; hp->sleeping_conn = 0; hp->workload = 0; hp->executing_workload = 0; hp->cmds_processed = 0; hp->n_conn = 0; hp->conn_list = tbx_stack_new(); hp->closed_que = tbx_stack_new(); hp->que = tbx_stack_new(); hp->direct_list = tbx_stack_new(); hp->pause_until = 0; hp->stable_conn = max_conn; hp->closing_conn = 0; hp->failed_conn_attempts = 0; hp->successful_conn_attempts = 0; hp->abort_conn_attempts = hpc->abort_conn_attempts; apr_thread_mutex_create(&(hp->lock), APR_THREAD_MUTEX_DEFAULT, hp->mpool); apr_thread_cond_create(&(hp->cond), hp->mpool); return(hp); }