int
virInterfaceObjListFindByMACString(virInterfaceObjListPtr interfaces,
const char *mac,
- virInterfaceObjPtr *matches,
+ char **const matches,
int maxmatches)
{
size_t i;
- unsigned int matchct = 0;
+ int matchct = 0;
for (i = 0; i < interfaces->count; i++) {
virInterfaceObjPtr obj = interfaces->objs[i];
virInterfaceObjLock(obj);
def = obj->def;
if (STRCASEEQ(def->mac, mac)) {
- matchct++;
- if (matchct <= maxmatches) {
- matches[matchct - 1] = obj;
- /* keep the lock if we're returning object to caller */
- /* it is the caller's responsibility to unlock *all* matches */
- continue;
+ if (matchct < maxmatches) {
+ if (VIR_STRDUP(matches[matchct], def->name) < 0) {
+ virInterfaceObjUnlock(obj);
+ goto error;
+ }
+ matchct++;
}
}
virInterfaceObjUnlock(obj);
-
}
return matchct;
+
+ error:
+ while (--matchct >= 0)
+ VIR_FREE(matches[matchct]);
+
+ return -1;
}
const char *mac)
{
testDriverPtr privconn = conn->privateData;
- virInterfaceObjPtr obj;
- virInterfaceDefPtr def;
int ifacect;
+ char *ifacenames[] = { NULL, NULL };
virInterfacePtr ret = NULL;
testDriverLock(privconn);
- ifacect = virInterfaceObjListFindByMACString(privconn->ifaces, mac, &obj, 1);
+ ifacect = virInterfaceObjListFindByMACString(privconn->ifaces, mac,
+ ifacenames, 2);
testDriverUnlock(privconn);
if (ifacect == 0) {
- virReportError(VIR_ERR_NO_INTERFACE, NULL);
+ virReportError(VIR_ERR_NO_INTERFACE,
+ _("no interface with matching mac '%s'"), mac);
goto cleanup;
}
goto cleanup;
}
- def = virInterfaceObjGetDef(obj);
- ret = virGetInterface(conn, def->name, def->mac);
+ ret = virGetInterface(conn, ifacenames[0], mac);
cleanup:
- if (obj)
- virInterfaceObjUnlock(obj);
+ VIR_FREE(ifacenames[0]);
+ VIR_FREE(ifacenames[1]);
return ret;
}