From bf48ef81f165e14f8b73320973c1fcc978e96e0d 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 16ec19515b..bb108c8da3 100644 --- a/lib/sbi/client.c +++ b/lib/sbi/client.c @@ -212,6 +212,8 @@ void ogs_sbi_client_remove(ogs_sbi_client_t *client) ogs_free(client->private_key); if (client->cert) ogs_free(client->cert); + if (client->local_if) + ogs_free(client->local_if); if (client->fqdn) ogs_free(client->fqdn); @@ -516,6 +518,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 d6687b38ed..4a69ae728e 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; + char *local_if; char *fqdn; uint16_t fqdn_port; diff --git a/lib/sbi/context.c b/lib/sbi/context.c index 8d9a7ea12e..932013516a 100644 --- a/lib/sbi/context.c +++ b/lib/sbi/context.c @@ -935,6 +935,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 *local_if = NULL; bool rc; @@ -976,6 +977,8 @@ ogs_sbi_client_t *ogs_sbi_context_parse_client_config(ogs_yaml_iter_t *iter) client_private_key = ogs_yaml_iter_value(iter); } else if (!strcmp(key, "client_cert")) { client_cert = ogs_yaml_iter_value(iter); + } else if (!strcmp(key, "interface")) { + local_if = ogs_yaml_iter_value(iter); } } @@ -1045,6 +1048,13 @@ ogs_sbi_client_t *ogs_sbi_context_parse_client_config(ogs_yaml_iter_t *iter) ogs_assert(client->cert); } + 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.");