From 24ff3e0b9ff67da13eb5280925d5816988472f73 Mon Sep 17 00:00:00 2001 From: Spencer Sevilla Date: Sat, 8 Feb 2025 11:15:11 -0800 Subject: [PATCH] add option to support curl binding local interface/ip for sbi calls --- lib/sbi/client.c | 6 ++++++ lib/sbi/client.h | 1 + lib/sbi/context.c | 10 ++++++++++ 3 files changed, 17 insertions(+) diff --git a/lib/sbi/client.c b/lib/sbi/client.c index d9fef9bb91..c6b886dda4 100644 --- a/lib/sbi/client.c +++ b/lib/sbi/client.c @@ -217,6 +217,8 @@ void ogs_sbi_client_remove(ogs_sbi_client_t *client) ogs_free(client->cert); if (client->sslkeylog) ogs_free(client->sslkeylog); + if (client->local_if) + ogs_free(client->local_if); if (client->fqdn) ogs_free(client->fqdn); @@ -558,6 +560,10 @@ static connection_t *connection_add( curl_easy_setopt(conn->easy, CURLOPT_RESOLVE, conn->resolve_list); } + if (client->local_if) { + curl_easy_setopt(conn->easy, CURLOPT_INTERFACE, client->local_if); + } + curl_easy_setopt(conn->easy, CURLOPT_PRIVATE, conn); curl_easy_setopt(conn->easy, CURLOPT_WRITEFUNCTION, write_cb); curl_easy_setopt(conn->easy, CURLOPT_WRITEDATA, conn); diff --git a/lib/sbi/client.h b/lib/sbi/client.h index e9bfbc918f..0e6b33faf1 100644 --- a/lib/sbi/client.h +++ b/lib/sbi/client.h @@ -81,6 +81,7 @@ typedef struct ogs_sbi_client_s { OpenAPI_uri_scheme_e scheme; bool insecure_skip_verify; char *cacert, *private_key, *cert, *sslkeylog; + char *local_if; char *fqdn; uint16_t fqdn_port; diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 886accca6f..51408cd16f 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -1073,6 +1073,7 @@ ogs_sbi_client_t *ogs_sbi_context_parse_client_config(ogs_yaml_iter_t *iter) const char *client_private_key = NULL; const char *client_cert = NULL; const char *client_sslkeylog = NULL; + const char *local_if = NULL; bool rc; @@ -1116,6 +1117,8 @@ ogs_sbi_client_t *ogs_sbi_context_parse_client_config(ogs_yaml_iter_t *iter) client_cert = ogs_yaml_iter_value(iter); } else if (!strcmp(key, "client_sslkeylogfile")) { client_sslkeylog = ogs_yaml_iter_value(iter); + } else if (!strcmp(key, "interface")) { + local_if = ogs_yaml_iter_value(iter); } } @@ -1192,6 +1195,13 @@ ogs_sbi_client_t *ogs_sbi_context_parse_client_config(ogs_yaml_iter_t *iter) ogs_assert(client->sslkeylog); } + if (local_if) { + if (client->local_if) + ogs_free(client->local_if); + client->local_if = ogs_strdup(local_if); + ogs_assert(client->local_if); + } + if ((!client_private_key && client_cert) || (client_private_key && !client_cert)) { ogs_error("Either the private key or certificate is missing.");