diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2010-11-25 11:08:37 +0100 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2010-12-01 13:50:48 -0500 |
commit | 40def28805f9df3ff640209def765723cd8e2de3 (patch) | |
tree | 5c86c851d617901206c64c95d99b36de535d710a /src/providers/data_provider_fo.c | |
parent | 09f6d093d38744fc1ba8db5e031ac0f16282210d (diff) | |
download | sssd-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.c | 25 |
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; } |