Blame SOURCES/0015-DYNDNS-sss_iface_addr_list_get-return-ENOENT.patch

6cf099
From c7c762dc50c48cfa43551a3936dd46405e9d33ce Mon Sep 17 00:00:00 2001
6cf099
From: Pavel Reichl <preichl@redhat.com>
6cf099
Date: Wed, 8 Jul 2015 09:01:24 -0400
6cf099
Subject: [PATCH 15/19] DYNDNS: sss_iface_addr_list_get return ENOENT
6cf099
6cf099
If none of eligible interfaces matches ifname then ENOENT is returned.
6cf099
6cf099
Resolves:
6cf099
https://fedorahosted.org/sssd/ticket/2549
6cf099
---
6cf099
 src/providers/dp_dyndns.c        | 13 +++++++++++--
6cf099
 src/providers/ldap/sdap_dyndns.c |  6 +++++-
6cf099
 src/tests/cmocka/test_dyndns.c   | 20 ++++++++++++++++++++
6cf099
 3 files changed, 36 insertions(+), 3 deletions(-)
6cf099
6cf099
diff --git a/src/providers/dp_dyndns.c b/src/providers/dp_dyndns.c
6cf099
index 1cac3d0fae2454cea823ed640a4325f27580353f..2ac43a108ff6197d9e2662198a6da976ca348e76 100644
6cf099
--- a/src/providers/dp_dyndns.c
6cf099
+++ b/src/providers/dp_dyndns.c
6cf099
@@ -222,8 +222,17 @@ sss_iface_addr_list_get(TALLOC_CTX *mem_ctx, const char *ifname,
6cf099
         }
6cf099
     }
6cf099
 
6cf099
-    ret = EOK;
6cf099
-    *_addrlist = addrlist;
6cf099
+    if (addrlist != NULL) {
6cf099
+        /* OK, some result was found */
6cf099
+        ret = EOK;
6cf099
+        *_addrlist = addrlist;
6cf099
+    } else {
6cf099
+        /* No result was found */
6cf099
+        DEBUG(SSSDBG_TRACE_FUNC,
6cf099
+              "No IPs usable for DNS was found for interface: %s.\n", ifname);
6cf099
+        ret = ENOENT;
6cf099
+    }
6cf099
+
6cf099
 done:
6cf099
     freeifaddrs(ifaces);
6cf099
     return ret;
6cf099
diff --git a/src/providers/ldap/sdap_dyndns.c b/src/providers/ldap/sdap_dyndns.c
6cf099
index 0d9c9205792062378aa25aad6ac706058001433a..e99a4f6687035928f6775c38b9df6b2a06d38f38 100644
6cf099
--- a/src/providers/ldap/sdap_dyndns.c
6cf099
+++ b/src/providers/ldap/sdap_dyndns.c
6cf099
@@ -502,8 +502,12 @@ sdap_dyndns_get_addrs_send(TALLOC_CTX *mem_ctx,
6cf099
     if (iface) {
6cf099
         ret = sss_iface_addr_list_get(state, iface, &state->addresses);
6cf099
         if (ret != EOK) {
6cf099
-            DEBUG(SSSDBG_OP_FAILURE,
6cf099
+            DEBUG(ret == ENOENT ? SSSDBG_MINOR_FAILURE : SSSDBG_OP_FAILURE,
6cf099
                   "Cannot get list of addresses from interface %s\n", iface);
6cf099
+            /* non critical failure */
6cf099
+            if (ret == ENOENT) {
6cf099
+                ret = EOK;
6cf099
+            }
6cf099
         }
6cf099
         /* We're done. Just fake an async request completion */
6cf099
         goto done;
6cf099
diff --git a/src/tests/cmocka/test_dyndns.c b/src/tests/cmocka/test_dyndns.c
6cf099
index 689e333d4e68c4a2582894d06b8b7b20c76b9be8..3214e90c063ea9a4cf6f6bc6507bf4e37b7d23a4 100644
6cf099
--- a/src/tests/cmocka/test_dyndns.c
6cf099
+++ b/src/tests/cmocka/test_dyndns.c
6cf099
@@ -247,6 +247,23 @@ void dyndns_test_get_multi_ifaddr(void **state)
6cf099
     assert_true(check_leaks_pop(dyndns_test_ctx) == true);
6cf099
 }
6cf099
 
6cf099
+void dyndns_test_get_ifaddr_enoent(void **state)
6cf099
+{
6cf099
+    errno_t ret;
6cf099
+    struct sss_iface_addr *addrlist = NULL;
6cf099
+
6cf099
+    check_leaks_push(dyndns_test_ctx);
6cf099
+    will_return_getifaddrs("eth0", "192.168.0.1");
6cf099
+    will_return_getifaddrs("eth1", "192.168.0.2");
6cf099
+    will_return_getifaddrs(NULL, NULL); /* sentinel */
6cf099
+    ret = sss_iface_addr_list_get(dyndns_test_ctx, "non_existing_interface",
6cf099
+                                  &addrlist);
6cf099
+    assert_int_equal(ret, ENOENT);
6cf099
+    talloc_free(addrlist);
6cf099
+
6cf099
+    assert_true(check_leaks_pop(dyndns_test_ctx) == true);
6cf099
+}
6cf099
+
6cf099
 void dyndns_test_ok(void **state)
6cf099
 {
6cf099
     struct tevent_req *req;
6cf099
@@ -460,6 +477,9 @@ int main(int argc, const char *argv[])
6cf099
         cmocka_unit_test_setup_teardown(dyndns_test_get_multi_ifaddr,
6cf099
                                         dyndns_test_simple_setup,
6cf099
                                         dyndns_test_teardown),
6cf099
+        cmocka_unit_test_setup_teardown(dyndns_test_get_ifaddr_enoent,
6cf099
+                                        dyndns_test_simple_setup,
6cf099
+                                        dyndns_test_teardown),
6cf099
 
6cf099
         /* Dynamic DNS update unit tests*/
6cf099
         cmocka_unit_test_setup_teardown(dyndns_test_ok,
6cf099
-- 
6cf099
2.4.3
6cf099