rpcd-mod-luci: honour dhcp leases without ip address for host hints
authorJo-Philipp Wich <jo@mein.io>
Wed, 12 Feb 2020 21:22:05 +0000 (22:22 +0100)
committerJo-Philipp Wich <jo@mein.io>
Thu, 13 Feb 2020 18:31:34 +0000 (19:31 +0100)
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 3702e13f544a0b5478d8e0bacd8b28fe55709a57)

libs/rpcd-mod-luci/src/luci.c

index 5dc436164d8ccff3b6a4e66f60cda48c3e4a5f63..951de5c46dc67eee9c1097f5ba7c86dccf7a68ad 100644 (file)
@@ -1283,14 +1283,14 @@ rpc_luci_get_host_hints_uci(struct reply_context *rctx)
                ptr.option = "ip";
                ptr.o = NULL;
 
-               if (uci_lookup_ptr(uci, &ptr, NULL, true) || ptr.o == NULL)
-                       continue;
-
-               if (ptr.o->type != UCI_TYPE_STRING)
-                       continue;
+               if (!uci_lookup_ptr(uci, &ptr, NULL, true) && ptr.o != NULL &&
+                       ptr.o->type != UCI_TYPE_STRING)
+                       n = ptr.o->v.string;
+               else
+                       n = NULL;
 
-               if (inet_pton(AF_INET, ptr.o->v.string, &in) != 1)
-                       continue;
+               if (!n || inet_pton(AF_INET, n, &in) != 1)
+                       in.s_addr = 0;
 
                ptr.option = "name";
                ptr.o = NULL;
@@ -1316,7 +1316,7 @@ rpc_luci_get_host_hints_uci(struct reply_context *rctx)
                                if (!hint)
                                        continue;
 
-                               if (hint->ip.s_addr == 0)
+                               if (hint->ip.s_addr == 0 && in.s_addr != 0)
                                        hint->ip = in;
 
                                if (n && !hint->hostname)
@@ -1330,7 +1330,7 @@ rpc_luci_get_host_hints_uci(struct reply_context *rctx)
                                if (!hint)
                                        continue;
 
-                               if (hint->ip.s_addr == 0)
+                               if (hint->ip.s_addr == 0 && in.s_addr != 0)
                                        hint->ip = in;
 
                                if (n && !hint->hostname)