"ip-address": "192.168.122.197",
"mac-address": "52:54:00:a4:6f:91",
"hostname": "fedora",
- "expiry-time": 1900000000
+ "expiry-time": 1900000002
},
{
"ip-address": "192.168.122.198",
"mac-address": "52:54:00:a4:6f:92",
"hostname": "fedora",
- "expiry-time": 1900000000
+ "expiry-time": 1900000001
},
{
"ip-address": "192.168.122.254",
char buf[BUF_SIZE] = { 0 };
char **addrList;
int rv, tmp_errno = 0, tmp_herrno = 0;
- size_t i = 0, j = 0;
+ size_t i = 0;
memset(&resolved, 0, sizeof(resolved));
}
addrList = resolved.h_addr_list;
+ i = 0;
while (*addrList) {
virSocketAddr sa;
char *ipAddr;
goto cleanup;
}
- for (j = 0; data->ipAddr[j]; j++) {
- if (STREQ(data->ipAddr[j], ipAddr))
- break;
- }
-
- if (!data->ipAddr[j]) {
+ if (STRNEQ_NULLABLE(data->ipAddr[i], ipAddr)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
- "Unexpected address %s", ipAddr);
+ "Unexpected address %s, expecting %s",
+ ipAddr, NULLSTR(data->ipAddr[i]));
VIR_FREE(ipAddr);
goto cleanup;
}
i++;
}
- for (j = 0; data->ipAddr[j]; j++)
- ;
-
- if (i != j) {
+ if (data->ipAddr[i]) {
virReportError(VIR_ERR_INTERNAL_ERROR,
- "Expected %zu addresses, got %zu", j, i);
+ "Expected %s address, got NULL",
+ data->ipAddr[i]);
goto cleanup;
}
typedef struct {
unsigned char addr[16];
int af;
+ long long expirytime;
} leaseAddress;
+static int
+leaseAddressSorter(const void *a,
+ const void *b)
+{
+ const leaseAddress *la = a;
+ const leaseAddress *lb = b;
+
+ return lb->expirytime - la->expirytime;
+}
+
+
+static void
+sortAddr(leaseAddress *tmpAddress,
+ size_t ntmpAddress)
+{
+ qsort(tmpAddress, ntmpAddress, sizeof(*tmpAddress), leaseAddressSorter);
+}
+
+
static int
appendAddr(const char *name ATTRIBUTE_UNUSED,
leaseAddress **tmpAddress,
const char *ipAddr;
virSocketAddr sa;
int family;
+ long long expirytime;
size_t i;
if (!(ipAddr = virJSONValueObjectGetString(lease, "ip-address"))) {
return 0;
}
+ if (virJSONValueObjectGetNumberLong(lease, "expiry-time", &expirytime) < 0) {
+ /* A lease cannot be present without expiry-time */
+ ERROR("expiry-time field missing for %s", name);
+ return -1;
+ }
+
for (i = 0; i < *ntmpAddress; i++) {
if (memcmp((*tmpAddress)[i].addr,
(family == AF_INET ?
return -1;
}
+ (*tmpAddress)[*ntmpAddress].expirytime = expirytime;
(*tmpAddress)[*ntmpAddress].af = family;
memcpy((*tmpAddress)[*ntmpAddress].addr,
(family == AF_INET ?
#endif /* defined(LIBVIRT_NSS_GUEST) */
+ sortAddr(tmpAddress, ntmpAddress);
+
VIR_STEAL_PTR(*address, tmpAddress);
*naddress = ntmpAddress;
ntmpAddress = 0;