diff options
author | Pavel Březina <pbrezina@redhat.com> | 2013-03-13 15:13:46 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2013-04-10 15:36:55 +0200 |
commit | 77d165f0629966db65753a3aee84a8b4971673af (patch) | |
tree | 19e9d6b94426dec048b02d56663da2a981516195 /src/providers/data_provider_fo.c | |
parent | f9961e5f82e0ef474d6492371bfdf9e74e208a99 (diff) | |
download | sssd-77d165f0629966db65753a3aee84a8b4971673af.tar.gz sssd-77d165f0629966db65753a3aee84a8b4971673af.tar.xz sssd-77d165f0629966db65753a3aee84a8b4971673af.zip |
DNS sites support - SRV DNS lookup plugin
https://fedorahosted.org/sssd/ticket/1032
This plugin mimics the current behaviour.
If discovery_domain is set it is the only domain that is tried.
If discovery_domain is not set, we try to autodetect domain first
and if that fails or SRV lookup on this domain fails, we fallback
to SSSD domain name.
Diffstat (limited to 'src/providers/data_provider_fo.c')
-rw-r--r-- | src/providers/data_provider_fo.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/providers/data_provider_fo.c b/src/providers/data_provider_fo.c index 232717e75..83294b59f 100644 --- a/src/providers/data_provider_fo.c +++ b/src/providers/data_provider_fo.c @@ -254,6 +254,40 @@ void be_fo_set_srv_lookup_plugin(struct be_ctx *ctx, } } +errno_t be_fo_set_dns_srv_lookup_plugin(struct be_ctx *be_ctx, + const char *hostname) +{ + struct fo_resolve_srv_dns_ctx *srv_ctx = NULL; + char resolved_hostname[HOST_NAME_MAX]; + errno_t ret; + + if (hostname == NULL) { + ret = gethostname(resolved_hostname, HOST_NAME_MAX); + if (ret != EOK) { + ret = errno; + DEBUG(SSSDBG_CRIT_FAILURE, + ("gethostname() failed: [%d]: %s\n", ret, strerror(ret))); + return ret; + } + resolved_hostname[HOST_NAME_MAX-1] = '\0'; + hostname = resolved_hostname; + } + + srv_ctx = fo_resolve_srv_dns_ctx_init(be_ctx, be_ctx->be_res->resolv, + be_ctx->be_res->family_order, + default_host_dbs, hostname, + be_ctx->domain->name); + if (srv_ctx == NULL) { + DEBUG(SSSDBG_FATAL_FAILURE, ("Out of memory?\n")); + return ENOMEM; + } + + be_fo_set_srv_lookup_plugin(be_ctx, fo_resolve_srv_dns_send, + fo_resolve_srv_dns_recv, srv_ctx, "DNS"); + + return EOK; +} + int be_fo_add_srv_server(struct be_ctx *ctx, const char *service_name, const char *query_service, |