From 03c850593b685400b3dc39f5f0981968edae6730 Mon Sep 17 00:00:00 2001
From: Simo Sorce <ssorce@redhat.com>
Date: Sun, 15 Nov 2009 18:07:36 -0500
Subject: Failover fixes and additions

---
 server/providers/fail_over.c | 28 ++++++++++++++++++++++------
 server/providers/fail_over.h |  2 ++
 server/resolv/async_resolv.c |  2 +-
 3 files changed, 25 insertions(+), 7 deletions(-)

(limited to 'server')

diff --git a/server/providers/fail_over.c b/server/providers/fail_over.c
index fa599e35..1b9e0171 100644
--- a/server/providers/fail_over.c
+++ b/server/providers/fail_over.c
@@ -129,8 +129,8 @@ get_server_status(struct fo_server *server)
     if (timeout != 0 && server->common->server_status == SERVER_NOT_WORKING) {
         gettimeofday(&tv, NULL);
         if (STATUS_DIFF(server->common, tv) > timeout) {
-            server->common->server_status = SERVER_NAME_RESOLVED;
-            server->last_status_change.tv_sec = tv.tv_sec;
+            server->common->server_status = SERVER_NAME_NOT_RESOLVED;
+            server->last_status_change.tv_sec = 0;
         }
     }
 
@@ -196,6 +196,9 @@ fo_new_service(struct fo_ctx *ctx, const char *name,
     ret = fo_get_service(ctx, name, &service);
     if (ret == EOK) {
         DEBUG(1, ("Service %s already exists\n", name));
+        if (_service) {
+                *_service = service;
+        }
         return EEXIST;
     } else if (ret != ENOENT) {
         return ret;
@@ -215,7 +218,9 @@ fo_new_service(struct fo_ctx *ctx, const char *name,
     DLIST_ADD(ctx->service_list, service);
 
     talloc_set_destructor(service, service_destructor);
-    *_service = service;
+    if (_service) {
+        *_service = service;
+    }
 
     return EOK;
 }
@@ -227,7 +232,7 @@ fo_get_service(struct fo_ctx *ctx, const char *name,
     struct fo_service *service;
 
     DLIST_FOR_EACH(service, ctx->service_list) {
-        if (!strcasecmp(name, service->name)) {
+        if (!strcmp(name, service->name)) {
             *_service = service;
             return EOK;
         }
@@ -476,6 +481,10 @@ fo_resolve_service_done(struct tevent_req *subreq)
     while ((request = common->request_list) != NULL) {
         DLIST_REMOVE(common->request_list, request);
         if (resolv_status) {
+            /* FIXME FIXME: resolv_status is an ARES error.
+             * but any caller will expect classic error codes.
+             * also the send() function may return ENOENT, so this mix
+             * IS explosive (ENOENT = 2 = ARES_EFORMER) */
             tevent_req_error(request->req, resolv_status);
         } else {
             tevent_req_done(request->req);
@@ -490,11 +499,13 @@ fo_resolve_service_recv(struct tevent_req *req, struct fo_server **server)
 
     state = tevent_req_data(req, struct resolve_service_state);
 
-    TEVENT_REQ_RETURN_ON_ERROR(req);
-
+    /* always return the server if asked for, otherwise the caller
+     * cannot mark it as faulty in case we return an error */
     if (server)
         *server = state->server;
 
+    TEVENT_REQ_RETURN_ON_ERROR(req);
+
     return EOK;
 }
 
@@ -532,6 +543,11 @@ fo_get_server_port(struct fo_server *server)
     return server->port;
 }
 
+const char *fo_get_server_name(struct fo_server *server)
+{
+    return server->common->name;
+}
+
 struct hostent *
 fo_get_server_hostent(struct fo_server *server)
 {
diff --git a/server/providers/fail_over.h b/server/providers/fail_over.h
index b6e2f2f7..5fa9ff0c 100644
--- a/server/providers/fail_over.h
+++ b/server/providers/fail_over.h
@@ -101,6 +101,8 @@ void *fo_get_server_user_data(struct fo_server *server);
 
 int fo_get_server_port(struct fo_server *server);
 
+const char *fo_get_server_name(struct fo_server *server);
+
 struct hostent *fo_get_server_hostent(struct fo_server *server);
 
 #endif /* !__FAIL_OVER_H__ */
diff --git a/server/resolv/async_resolv.c b/server/resolv/async_resolv.c
index c05461d6..6ac5e41f 100644
--- a/server/resolv/async_resolv.c
+++ b/server/resolv/async_resolv.c
@@ -78,7 +78,7 @@ return_code(int ares_code)
         return ENOMEM;
     case ARES_EFILE:
     default:
-        return -1;
+        return EIO;
     }
 }
 
-- 
cgit