Introduce virLeaseReadCustomLeaseFile which will populate
the new leases array with all the leases, except for expired
ones and the ones matching 'ip_to_delete'.

This removes five variables from main().
---
 src/network/leaseshelper.c | 194 +++++++++++++++++++++++++--------------------
 1 file changed, 108 insertions(+), 86 deletions(-)

diff --git a/src/network/leaseshelper.c b/src/network/leaseshelper.c
index 3d2dace..8bf1c01 100644
--- a/src/network/leaseshelper.c
+++ b/src/network/leaseshelper.c
@@ -105,35 +105,135 @@ VIR_ENUM_DECL(virLeaseAction);
 VIR_ENUM_IMPL(virLeaseAction, VIR_LEASE_ACTION_LAST,
               "add", "old", "del", "init");
 
+static int
+virLeaseReadCustomLeaseFile(virJSONValuePtr leases_array_new,
+                            const char *custom_lease_file,
+                            const char *ip_to_delete,
+                            char **server_duid)
+{
+    char *lease_entries = NULL;
+    virJSONValuePtr leases_array = NULL;
+    long long currtime = 0;
+    long long expirytime;
+    int custom_lease_file_len = 0;
+    virJSONValuePtr lease_tmp = NULL;
+    const char *ip_tmp = NULL;
+    const char *server_duid_tmp = NULL;
+    size_t i;
+    int ret = -1;
+
+    currtime = (long long) time(NULL);
+
+    /* Read entire contents */
+    if ((custom_lease_file_len = virFileReadAll(custom_lease_file,
+                                                
VIR_NETWORK_DHCP_LEASE_FILE_SIZE_MAX,
+                                                &lease_entries)) < 0) {
+        goto cleanup;
+    }
+
+    /* Check for previous leases */
+    if (custom_lease_file_len) {
+        if (!(leases_array = virJSONValueFromString(lease_entries))) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("invalid json in file: %s, rewriting it"),
+                           custom_lease_file);
+        } else {
+            if (!virJSONValueIsArray(leases_array)) {
+                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                               _("couldn't fetch array of leases"));
+                goto cleanup;
+            }
+
+            i = 0;
+            while (i < virJSONValueArraySize(leases_array)) {
+
+                if (!(lease_tmp = virJSONValueArrayGet(leases_array, i))) {
+                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                   _("failed to parse json"));
+                    goto cleanup;
+                }
+
+                if (!(ip_tmp = virJSONValueObjectGetString(lease_tmp, 
"ip-address")) ||
+                    (virJSONValueObjectGetNumberLong(lease_tmp, "expiry-time", 
&expirytime) < 0)) {
+                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                   _("failed to parse json"));
+                    goto cleanup;
+                }
+                /* Check whether lease has expired or not */
+                if (expirytime < currtime) {
+                    i++;
+                    continue;
+                }
+
+                /* Check whether lease has to be included or not */
+                if (ip_to_delete && STREQ(ip_tmp, ip_to_delete)) {
+                    i++;
+                    continue;
+                }
+
+                if (strchr(ip_tmp, ':')) {
+                    /* This is an ipv6 lease */
+                    if ((server_duid_tmp
+                         = virJSONValueObjectGetString(lease_tmp, 
"server-duid"))) {
+                        if (!*server_duid && VIR_STRDUP(*server_duid, 
server_duid_tmp) < 0) {
+                            /* Control reaches here when the 'action' is not 
for an
+                             * ipv6 lease or, for some weird reason the env var
+                             * DNSMASQ_SERVER_DUID wasn't set*/
+                            goto cleanup;
+                        }
+                    } else {
+                        /* Inject server-duid into those ipv6 leases which
+                         * didn't have it previously, for example, those
+                         * created by leaseshelper from libvirt 1.2.6 */
+                        if (virJSONValueObjectAppendString(lease_tmp, 
"server-duid", *server_duid) < 0)
+                            goto cleanup;
+                    }
+                }
+
+                /* Move old lease to new array */
+                if (virJSONValueArrayAppend(leases_array_new, lease_tmp) < 0) {
+                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                   _("failed to create json"));
+                    goto cleanup;
+                }
+
+                ignore_value(virJSONValueArraySteal(leases_array, i));
+            }
+        }
+    }
+
+    ret = 0;
+
+ cleanup:
+    virJSONValueFree(leases_array);
+    VIR_FREE(lease_entries);
+    return ret;
+}
+
 int
 main(int argc, char **argv)
 {
     char *exptime = NULL;
     char *pid_file = NULL;
-    char *lease_entries = NULL;
     char *custom_lease_file = NULL;
     const char *ip = NULL;
     const char *mac = NULL;
     const char *ip_tmp = NULL;
     const char *leases_str = NULL;
-    const char *server_duid_tmp = NULL;
     const char *iaid = virGetEnvAllowSUID("DNSMASQ_IAID");
     const char *clientid = virGetEnvAllowSUID("DNSMASQ_CLIENT_ID");
     const char *interface = virGetEnvAllowSUID("DNSMASQ_INTERFACE");
     const char *exptime_tmp = virGetEnvAllowSUID("DNSMASQ_LEASE_EXPIRES");
     const char *hostname = virGetEnvAllowSUID("DNSMASQ_SUPPLIED_HOSTNAME");
     char *server_duid = NULL;
-    long long currtime = 0;
     long long expirytime = 0;
     size_t i = 0;
     int action = -1;
     int pid_file_fd = -1;
     int rv = EXIT_FAILURE;
-    int custom_lease_file_len = 0;
     bool delete = false;
     virJSONValuePtr lease_new = NULL;
     virJSONValuePtr lease_tmp = NULL;
-    virJSONValuePtr leases_array = NULL;
     virJSONValuePtr leases_array_new = NULL;
 
     virSetErrorFunc(NULL, NULL);
@@ -230,13 +330,6 @@ main(int argc, char **argv)
     if (virFileTouch(custom_lease_file, 0644) < 0)
         goto cleanup;
 
-    /* Read entire contents */
-    if ((custom_lease_file_len = virFileReadAll(custom_lease_file,
-                                                
VIR_NETWORK_DHCP_LEASE_FILE_SIZE_MAX,
-                                                &lease_entries)) < 0) {
-        goto cleanup;
-    }
-
     switch ((enum virLeaseActionFlags) action) {
     case VIR_LEASE_ACTION_ADD:
     case VIR_LEASE_ACTION_OLD:
@@ -308,78 +401,9 @@ main(int argc, char **argv)
         goto cleanup;
     }
 
-    currtime = (long long) time(NULL);
-
-    /* Check for previous leases */
-    if (custom_lease_file_len) {
-        if (!(leases_array = virJSONValueFromString(lease_entries))) {
-            virReportError(VIR_ERR_INTERNAL_ERROR,
-                           _("invalid json in file: %s, rewriting it"),
-                           custom_lease_file);
-        } else {
-            if (!virJSONValueIsArray(leases_array)) {
-                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                               _("couldn't fetch array of leases"));
-                goto cleanup;
-            }
-
-            i = 0;
-            while (i < virJSONValueArraySize(leases_array)) {
-
-                if (!(lease_tmp = virJSONValueArrayGet(leases_array, i))) {
-                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                                   _("failed to parse json"));
-                    goto cleanup;
-                }
-
-                if (!(ip_tmp = virJSONValueObjectGetString(lease_tmp, 
"ip-address")) ||
-                    (virJSONValueObjectGetNumberLong(lease_tmp, "expiry-time", 
&expirytime) < 0)) {
-                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                                   _("failed to parse json"));
-                    goto cleanup;
-                }
-                /* Check whether lease has expired or not */
-                if (expirytime < currtime) {
-                    i++;
-                    continue;
-                }
-
-                /* Check whether lease has to be included or not */
-                if (delete && STREQ(ip_tmp, ip)) {
-                    i++;
-                    continue;
-                }
-
-                if (strchr(ip_tmp, ':')) {
-                    /* This is an ipv6 lease */
-                    if ((server_duid_tmp
-                         = virJSONValueObjectGetString(lease_tmp, 
"server-duid"))) {
-                        if (!server_duid && VIR_STRDUP(server_duid, 
server_duid_tmp) < 0) {
-                            /* Control reaches here when the 'action' is not 
for an
-                             * ipv6 lease or, for some weird reason the env var
-                             * DNSMASQ_SERVER_DUID wasn't set*/
-                            goto cleanup;
-                        }
-                    } else {
-                        /* Inject server-duid into those ipv6 leases which
-                         * didn't have it previously, for example, those
-                         * created by leaseshelper from libvirt 1.2.6 */
-                        if (virJSONValueObjectAppendString(lease_tmp, 
"server-duid", server_duid) < 0)
-                            goto cleanup;
-                    }
-                }
-
-                /* Move old lease to new array */
-                if (virJSONValueArrayAppend(leases_array_new, lease_tmp) < 0) {
-                    virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                                   _("failed to create json"));
-                    goto cleanup;
-                }
-
-                ignore_value(virJSONValueArraySteal(leases_array, i));
-            }
-        }
-    }
+    if (virLeaseReadCustomLeaseFile(leases_array_new, custom_lease_file,
+                                    delete ? ip : NULL, &server_duid) < 0)
+        goto cleanup;
 
     switch ((enum virLeaseActionFlags) action) {
     case VIR_LEASE_ACTION_INIT:
@@ -476,10 +500,8 @@ main(int argc, char **argv)
     VIR_FREE(pid_file);
     VIR_FREE(exptime);
     VIR_FREE(server_duid);
-    VIR_FREE(lease_entries);
     VIR_FREE(custom_lease_file);
     virJSONValueFree(lease_new);
-    virJSONValueFree(leases_array);
     virJSONValueFree(leases_array_new);
 
     return rv;
-- 
2.4.6

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to