static service_filegetter_download_tp service_filegetter_get_download_from_args( service_filegetter_tp sfg, service_filegetter_server_args_tp http_server, service_filegetter_server_args_tp socks_proxy, gchar* filepath, service_filegetter_hostbyname_cb hostbyname_cb) { /* absolute file path to get from server */ if(filepath[0] != '/') { service_filegetter_log(sfg, SFG_CRITICAL, "filepath %s does not begin with '/'", filepath); return NULL; } /* we require http info */ if(http_server == NULL) { service_filegetter_log(sfg, SFG_CRITICAL, "no HTTP server specified"); return NULL; } GString* strbuf = g_string_new(http_server->host); gint hostlength = strbuf->len; gboolean isOnionAddress = g_strstr_len(strbuf->str, strbuf->len, ".onion") ? TRUE : FALSE; g_string_free(strbuf, TRUE); in_addr_t http_addr = 0; if(!isOnionAddress) { http_addr = service_filegetter_getaddr(sfg, http_server, hostbyname_cb); } in_port_t http_port = htons((in_port_t) atoi(http_server->port)); if((!isOnionAddress && http_addr == 0) || http_port == 0) { service_filegetter_log(sfg, SFG_CRITICAL, "HTTP server specified but 0"); return NULL; } /* there may not be a socks proxy, so NULL is ok */ in_addr_t socks_addr = 0; in_port_t socks_port = 0; if(socks_proxy != NULL) { socks_addr = service_filegetter_getaddr(sfg, socks_proxy, hostbyname_cb); socks_port = htons((in_port_t) atoi(socks_proxy->port)); } if(isOnionAddress && !socks_addr) { service_filegetter_log(sfg, SFG_WARNING, "it probably wont work to specify an .onion address without a Tor socks proxy"); return NULL; } /* validation successful */ service_filegetter_download_tp dl = calloc(1, sizeof(service_filegetter_download_t)); strncpy(dl->fspec.remote_path, filepath, sizeof(dl->fspec.remote_path)); strncpy(dl->sspec.http_hostname, http_server->host, sizeof(dl->sspec.http_hostname)); dl->sspec.http_addr = http_addr; dl->sspec.http_port = http_port; dl->sspec.socks_addr = socks_addr; dl->sspec.socks_port = socks_port; dl->sspec.useHostname = isOnionAddress; dl->sspec.hostnameLength = hostlength; return dl; }
static service_filegetter_download_tp service_filegetter_get_download_from_args( service_filegetter_tp sfg, service_filegetter_server_args_tp http_server, service_filegetter_server_args_tp socks_proxy, gchar* filepath, service_filegetter_hostbyname_cb hostbyname_cb) { /* absolute file path to get from server */ if(filepath[0] != '/') { service_filegetter_log(sfg, SFG_CRITICAL, "filepath %s does not begin with '/'", filepath); return NULL; } /* we require http info */ if(http_server == NULL) { service_filegetter_log(sfg, SFG_CRITICAL, "no HTTP server specified"); return NULL; } in_addr_t http_addr = service_filegetter_getaddr(sfg, http_server, hostbyname_cb); in_port_t http_port = htons((in_port_t) atoi(http_server->port)); if(http_addr == 0 || http_port == 0) { service_filegetter_log(sfg, SFG_CRITICAL, "HTTP server specified but 0"); return NULL; } /* there may not be a socks proxy, so NULL is ok */ in_addr_t socks_addr = 0; in_port_t socks_port = 0; if(socks_proxy != NULL) { socks_addr = service_filegetter_getaddr(sfg, socks_proxy, hostbyname_cb); socks_port = htons((in_port_t) atoi(socks_proxy->port)); } /* validation successful */ service_filegetter_download_tp dl = calloc(1, sizeof(service_filegetter_download_t)); strncpy(dl->fspec.remote_path, filepath, sizeof(dl->fspec.remote_path)); strncpy(dl->sspec.http_hostname, http_server->host, sizeof(dl->sspec.http_hostname)); dl->sspec.http_addr = http_addr; dl->sspec.http_port = http_port; dl->sspec.socks_addr = socks_addr; dl->sspec.socks_port = socks_port; return dl; }