From: Martin Willi Date: Wed, 15 May 2013 14:34:12 +0000 (+0200) Subject: curl: add an option to fetch bound to a local source address X-Git-Tag: 5.1.0dr1~124^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fe20f752f1bd1cecdc0b71a91f605f590bc6c404;p=thirdparty%2Fstrongswan.git curl: add an option to fetch bound to a local source address --- diff --git a/src/libstrongswan/fetcher/fetcher.h b/src/libstrongswan/fetcher/fetcher.h index 58451aef23..890258c3ca 100644 --- a/src/libstrongswan/fetcher/fetcher.h +++ b/src/libstrongswan/fetcher/fetcher.h @@ -89,6 +89,12 @@ enum fetcher_option_t { */ FETCH_CALLBACK, + /** + * Source IP address to bind for a fetch. + * Additional argument is a host_t*, which may be NULL. + */ + FETCH_SOURCEIP, + /** * end of fetching options */ diff --git a/src/libstrongswan/fetcher/fetcher_manager.c b/src/libstrongswan/fetcher/fetcher_manager.c index 47d4f9bded..21cd1aff45 100644 --- a/src/libstrongswan/fetcher/fetcher_manager.c +++ b/src/libstrongswan/fetcher/fetcher_manager.c @@ -73,6 +73,7 @@ METHOD(fetcher_manager_t, fetch, status_t, fetcher_option_t opt; fetcher_t *fetcher; bool good = TRUE; + host_t *host; va_list args; /* check URL support of fetcher */ @@ -112,6 +113,13 @@ METHOD(fetcher_manager_t, fetch, status_t, good = fetcher->set_option(fetcher, opt, va_arg(args, fetcher_callback_t)); continue; + case FETCH_SOURCEIP: + host = va_arg(args, host_t*); + if (host && !host->is_anyaddr(host)) + { + good = fetcher->set_option(fetcher, opt, host); + } + continue; case FETCH_END: break; } diff --git a/src/libstrongswan/plugins/curl/curl_fetcher.c b/src/libstrongswan/plugins/curl/curl_fetcher.c index b49961a90b..a8cca98daa 100644 --- a/src/libstrongswan/plugins/curl/curl_fetcher.c +++ b/src/libstrongswan/plugins/curl/curl_fetcher.c @@ -177,6 +177,15 @@ METHOD(fetcher_t, set_option, bool, this->cb = va_arg(args, fetcher_callback_t); break; } + case FETCH_SOURCEIP: + { + char buf[64]; + + snprintf(buf, sizeof(buf), "%H", va_arg(args, host_t*)); + supported = curl_easy_setopt(this->curl, CURLOPT_INTERFACE, + buf) == CURLE_OK; + break; + } default: supported = FALSE; break;