summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2013-08-01 16:15:58 +0200
committerPavel Březina <pbrezina@redhat.com>2013-08-08 11:57:37 +0200
commitc901b2d1116e3717f6c3b52717e3f24c3c77fdee (patch)
treeff9126b70abab8a535fa02b66bf7a1d6dad46435
parentdba2e81a9a57ecac082f513d869a9b9a59fdb6c1 (diff)
downloadsssd_unused-c901b2d1116e3717f6c3b52717e3f24c3c77fdee.tar.gz
sssd_unused-c901b2d1116e3717f6c3b52717e3f24c3c77fdee.tar.xz
sssd_unused-c901b2d1116e3717f6c3b52717e3f24c3c77fdee.zip
fo_discover_srv_send: allow custom ordering function
https://fedorahosted.org/sssd/ticket/2001
-rw-r--r--src/providers/ad/ad_srv.c5
-rw-r--r--src/providers/fail_over_srv.c35
-rw-r--r--src/providers/fail_over_srv.h19
-rw-r--r--src/providers/ipa/ipa_srv.c3
4 files changed, 51 insertions, 11 deletions
diff --git a/src/providers/ad/ad_srv.c b/src/providers/ad/ad_srv.c
index 861ae3db..dfb15b30 100644
--- a/src/providers/ad/ad_srv.c
+++ b/src/providers/ad/ad_srv.c
@@ -79,7 +79,7 @@ static struct tevent_req *ad_get_dc_servers_send(TALLOC_CTX *mem_ctx,
domain));
subreq = fo_discover_srv_send(state, ev, resolv_ctx,
- "ldap", FO_PROTO_TCP, domains);
+ "ldap", FO_PROTO_TCP, domains, NULL, NULL);
if (subreq == NULL) {
ret = ENOMEM;
goto immediately;
@@ -719,7 +719,8 @@ static void ad_srv_plugin_site_done(struct tevent_req *subreq)
subreq = fo_discover_servers_send(state, state->ev,
state->ctx->be_res->resolv,
state->service, state->protocol,
- primary_domain, backup_domain);
+ primary_domain, backup_domain,
+ NULL, NULL);
if (subreq == NULL) {
ret = ENOMEM;
goto done;
diff --git a/src/providers/fail_over_srv.c b/src/providers/fail_over_srv.c
index 7fca2668..e374604a 100644
--- a/src/providers/fail_over_srv.c
+++ b/src/providers/fail_over_srv.c
@@ -27,6 +27,9 @@
#include "providers/fail_over_srv.h"
struct fo_discover_srv_state {
+ fo_sort_srv_list_t sort_srv_fn;
+ void *sort_srv_pvt;
+
char *dns_domain;
struct fo_server_info *servers;
size_t num_servers;
@@ -39,7 +42,9 @@ struct tevent_req *fo_discover_srv_send(TALLOC_CTX *mem_ctx,
struct resolv_ctx *resolv_ctx,
const char *service,
const char *protocol,
- const char **discovery_domains)
+ const char **discovery_domains,
+ fo_sort_srv_list_t sort_srv_fn,
+ void *sort_srv_pvt)
{
struct fo_discover_srv_state *state = NULL;
struct tevent_req *req = NULL;
@@ -52,6 +57,9 @@ struct tevent_req *fo_discover_srv_send(TALLOC_CTX *mem_ctx,
return NULL;
}
+ state->sort_srv_fn = sort_srv_fn;
+ state->sort_srv_pvt = sort_srv_pvt;
+
subreq = resolv_discover_srv_send(state, ev, resolv_ctx, service,
protocol, discovery_domains);
if (subreq == NULL) {
@@ -98,7 +106,11 @@ static void fo_discover_srv_done(struct tevent_req *subreq)
DEBUG(SSSDBG_TRACE_FUNC, ("Got answer. Processing...\n"));
/* sort and store the answer */
- ret = resolv_sort_srv_reply(&reply_list);
+ if (state->sort_srv_fn == NULL) {
+ ret = resolv_sort_srv_reply(&reply_list);
+ } else {
+ ret = state->sort_srv_fn(&reply_list, state->sort_srv_pvt);
+ }
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, ("Could not sort the answers from DNS "
"[%d]: %s\n", ret, strerror(ret)));
@@ -172,6 +184,8 @@ struct fo_discover_servers_state {
const char *protocol;
const char *primary_domain;
const char *backup_domain;
+ fo_sort_srv_list_t sort_srv_fn;
+ void *sort_srv_pvt;
char *dns_domain;
struct fo_server_info *primary_servers;
@@ -189,7 +203,9 @@ struct tevent_req *fo_discover_servers_send(TALLOC_CTX *mem_ctx,
const char *service,
const char *protocol,
const char *primary_domain,
- const char *backup_domain)
+ const char *backup_domain,
+ fo_sort_srv_list_t sort_srv_fn,
+ void *sort_srv_pvt)
{
struct fo_discover_servers_state *state = NULL;
struct tevent_req *req = NULL;
@@ -222,6 +238,8 @@ struct tevent_req *fo_discover_servers_send(TALLOC_CTX *mem_ctx,
state->ev = ev;
state->resolv_ctx = resolv_ctx;
+ state->sort_srv_fn = sort_srv_fn;
+ state->sort_srv_pvt = sort_srv_pvt;
state->service = talloc_strdup(state, service);
if (state->service == NULL) {
@@ -259,7 +277,9 @@ struct tevent_req *fo_discover_servers_send(TALLOC_CTX *mem_ctx,
domains[1] = state->backup_domain;
subreq = fo_discover_srv_send(state, ev, resolv_ctx,
- state->service, state->protocol, domains);
+ state->service, state->protocol,
+ domains, state->sort_srv_fn,
+ state->sort_srv_pvt);
if (subreq == NULL) {
ret = ENOMEM;
goto immediately;
@@ -326,7 +346,9 @@ static void fo_discover_servers_primary_done(struct tevent_req *subreq)
domains[0] = state->backup_domain;
subreq = fo_discover_srv_send(state, state->ev, state->resolv_ctx,
- state->service, state->protocol, domains);
+ state->service, state->protocol,
+ domains, state->sort_srv_fn,
+ state->sort_srv_pvt);
if (subreq == NULL) {
ret = ENOMEM;
goto done;
@@ -612,7 +634,8 @@ static errno_t fo_resolve_srv_dns_discover(struct tevent_req *req)
}
subreq = fo_discover_srv_send(state, state->ev, ctx->resolv_ctx,
- state->service, state->protocol, domains);
+ state->service, state->protocol, domains,
+ NULL, NULL);
if (subreq == NULL) {
ret = ENOMEM;
goto done;
diff --git a/src/providers/fail_over_srv.h b/src/providers/fail_over_srv.h
index 0c824f46..4d9f0c94 100644
--- a/src/providers/fail_over_srv.h
+++ b/src/providers/fail_over_srv.h
@@ -69,12 +69,25 @@ typedef errno_t
struct fo_server_info **_backup_servers,
size_t *_num_backup_servers);
+/*
+ * in/out list - list of SRV records
+ * in pvt - private data
+ *
+ * Returns:
+ * EOK - if successful
+ * other code on error
+ */
+typedef errno_t
+(*fo_sort_srv_list_t)(struct ares_srv_reply **list, void *pvt);
+
struct tevent_req *fo_discover_srv_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct resolv_ctx *resolv_ctx,
const char *service,
const char *protocol,
- const char **discovery_domains);
+ const char **discovery_domains,
+ fo_sort_srv_list_t sort_srv_fn,
+ void *sort_srv_pvt);
errno_t fo_discover_srv_recv(TALLOC_CTX *mem_ctx,
struct tevent_req *req,
@@ -88,7 +101,9 @@ struct tevent_req *fo_discover_servers_send(TALLOC_CTX *mem_ctx,
const char *service,
const char *protocol,
const char *primary_domain,
- const char *backup_domain);
+ const char *backup_domain,
+ fo_sort_srv_list_t sort_srv_fn,
+ void *sort_srv_pvt);
errno_t fo_discover_servers_recv(TALLOC_CTX *mem_ctx,
struct tevent_req *req,
diff --git a/src/providers/ipa/ipa_srv.c b/src/providers/ipa/ipa_srv.c
index 9b1c3994..ea0d2cd5 100644
--- a/src/providers/ipa/ipa_srv.c
+++ b/src/providers/ipa/ipa_srv.c
@@ -136,7 +136,8 @@ struct tevent_req *ipa_srv_plugin_send(TALLOC_CTX *mem_ctx,
"backup servers\n"));
subreq = fo_discover_servers_send(state, ev, ctx->resolv_ctx, service,
- protocol, primary_domain, backup_domain);
+ protocol, primary_domain, backup_domain,
+ NULL, NULL);
if (subreq == NULL) {
ret = ENOMEM;
goto immediately;