summaryrefslogtreecommitdiffstats
path: root/src/providers/data_provider_fo.c
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2010-11-25 11:08:37 +0100
committerStephen Gallagher <sgallagh@redhat.com>2010-12-01 13:50:48 -0500
commit40def28805f9df3ff640209def765723cd8e2de3 (patch)
tree5c86c851d617901206c64c95d99b36de535d710a /src/providers/data_provider_fo.c
parent09f6d093d38744fc1ba8db5e031ac0f16282210d (diff)
downloadsssd-40def28805f9df3ff640209def765723cd8e2de3.tar.gz
sssd-40def28805f9df3ff640209def765723cd8e2de3.tar.xz
sssd-40def28805f9df3ff640209def765723cd8e2de3.zip
Allow protocol fallback for SRV queries
https://fedorahosted.org/sssd/ticket/691
Diffstat (limited to 'src/providers/data_provider_fo.c')
-rw-r--r--src/providers/data_provider_fo.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/providers/data_provider_fo.c b/src/providers/data_provider_fo.c
index dff0aef24..8617cd236 100644
--- a/src/providers/data_provider_fo.c
+++ b/src/providers/data_provider_fo.c
@@ -54,6 +54,8 @@ struct be_failover_ctx {
struct be_svc_data *svcs;
};
+static const char *proto_table[] = { FO_PROTO_TCP, FO_PROTO_UDP, NULL };
+
int be_fo_is_srv_identifier(const char *server)
{
return server && strcasecmp(server, BE_SRV_IDENTIFIER) == 0;
@@ -258,12 +260,13 @@ int be_fo_service_add_callback(TALLOC_CTX *memctx,
}
int be_fo_add_srv_server(struct be_ctx *ctx, const char *service_name,
- const char *query_service, const char *proto,
- void *user_data)
+ const char *query_service, enum be_fo_protocol proto,
+ bool proto_fallback, void *user_data)
{
struct be_svc_data *svc;
char *domain;
int ret;
+ int i;
svc = be_fo_find_svc_data(ctx, service_name);
if (NULL == svc) {
@@ -279,13 +282,29 @@ int be_fo_add_srv_server(struct be_ctx *ctx, const char *service_name,
return ret;
}
+ /* Add the first protocol as the primary lookup */
ret = fo_add_srv_server(svc->fo_service, query_service,
- domain, proto, user_data);
+ domain, proto_table[proto], user_data);
if (ret && ret != EEXIST) {
DEBUG(1, ("Failed to add SRV lookup reference to failover service\n"));
return ret;
}
+ if (proto_fallback) {
+ i = (proto + 1) % BE_FO_PROTO_SENTINEL;
+ /* All the rest as fallback */
+ while (i != proto) {
+ ret = fo_add_srv_server(svc->fo_service, query_service,
+ domain, proto_table[i], user_data);
+ if (ret && ret != EEXIST) {
+ DEBUG(1, ("Failed to add SRV lookup reference to failover service\n"));
+ return ret;
+ }
+
+ i = (i + 1) % BE_FO_PROTO_SENTINEL;
+ }
+ }
+
return EOK;
}