From 7e6b99b847a3a83f0fb1089ff557827b5b5d0dc3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
Date: Wed, 20 Mar 2013 16:32:21 +0100
Subject: [PATCH 6/6] DNS sites support - use SRV DNS lookup plugin for all
 providers

https://fedorahosted.org/sssd/ticket/1032

This patch finishes the replacement of hard coded SRV lookup code
with pluggable interface. At the moment all providers uses the
same plugin.
---
 src/providers/data_provider_be.c | 14 +++++++-------
 src/providers/data_provider_fo.c | 40 ++++++++++++++++++++++++++++++++++++----
 2 files changed, 43 insertions(+), 11 deletions(-)

diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index 823dc00e955496babc54343c92e73768d50bd5be..41e811d9369811e8301fe09f529238083796d5b2 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -2490,19 +2490,19 @@ int be_process_init(TALLOC_CTX *mem_ctx,
         goto fail;
     }
 
-    ret = be_init_failover(ctx);
-    if (ret != EOK) {
-        DEBUG(SSSDBG_FATAL_FAILURE,
-              ("fatal error initializing failover context\n"));
-        goto fail;
-    }
-
     ret = sssd_domain_init(ctx, cdb, be_domain, DB_PATH, &ctx->domain);
     if (ret != EOK) {
         DEBUG(SSSDBG_FATAL_FAILURE, ("fatal error opening cache database\n"));
         goto fail;
     }
 
+    ret = be_init_failover(ctx);
+    if (ret != EOK) {
+        DEBUG(SSSDBG_FATAL_FAILURE,
+              ("fatal error initializing failover context\n"));
+        goto fail;
+    }
+
     ret = sss_monitor_init(ctx, ctx->ev, &monitor_be_interface,
                            ctx->identity, DATA_PROVIDER_VERSION,
                            ctx, &ctx->mon_conn);
diff --git a/src/providers/data_provider_fo.c b/src/providers/data_provider_fo.c
index 04944e52a525b7efa7dc7f542ba47bd5685b2a27..542601f412e4ddc0350eb50edebf4f2064f02b1a 100644
--- a/src/providers/data_provider_fo.c
+++ b/src/providers/data_provider_fo.c
@@ -80,6 +80,8 @@ int be_init_failover(struct be_ctx *ctx)
 {
     int ret;
     struct fo_options fopts;
+    struct fo_resolve_srv_dns_ctx *srv_plugin_ctx;
+    char hostname[HOST_NAME_MAX];
 
     if (ctx->be_fo != NULL) {
         return EOK;
@@ -101,17 +103,47 @@ int be_init_failover(struct be_ctx *ctx)
 
     ret = be_fo_get_options(ctx, &fopts);
     if (ret != EOK) {
-        talloc_zfree(ctx->be_fo);
-        return ret;
+        goto done;
     }
 
     ctx->be_fo->fo_ctx = fo_context_init(ctx->be_fo, &fopts);
     if (!ctx->be_fo->fo_ctx) {
+        ret = ENOMEM;
+        goto done;
+    }
+
+    ret = gethostname(hostname, HOST_NAME_MAX);
+    if (ret) {
+        ret = errno;
+        DEBUG(SSSDBG_CRIT_FAILURE,
+              ("gethostname() failed: [%d]: %s\n",ret, strerror(ret)));
+        goto done;
+    }
+    hostname[HOST_NAME_MAX-1] = '\0';
+
+
+    srv_plugin_ctx = fo_resolve_srv_dns_ctx_init(ctx->be_fo->fo_ctx,
+                                             ctx->be_fo->be_res->resolv,
+                                             ctx->be_fo->be_res->family_order,
+                                             default_host_dbs,
+                                             hostname,
+                                             ctx->domain->name);
+    if (srv_plugin_ctx == NULL) {
+        ret = ENOMEM;
+        goto done;
+    }
+
+    fo_set_srv_lookup_plugin(ctx->be_fo->fo_ctx, fo_resolve_srv_dns_send,
+                             fo_resolve_srv_dns_recv, srv_plugin_ctx);
+
+    ret = EOK;
+
+done:
+    if (ret != EOK) {
         talloc_zfree(ctx->be_fo);
-        return ENOMEM;
     }
 
-    return EOK;
+    return ret;
 }
 
 static int be_svc_data_destroy(void *memptr)
-- 
1.7.11.7

