void virInterfaceRemove(virInterfaceObjListPtr interfaces, const virInterfaceObjPtr iface) { unsigned int i; virInterfaceObjUnlock(iface); for (i = 0 ; i < interfaces->count ; i++) { virInterfaceObjLock(interfaces->objs[i]); if (interfaces->objs[i] == iface) { virInterfaceObjUnlock(interfaces->objs[i]); virInterfaceObjFree(interfaces->objs[i]); if (i < (interfaces->count - 1)) memmove(interfaces->objs + i, interfaces->objs + i + 1, sizeof(*(interfaces->objs)) * (interfaces->count - (i + 1))); if (VIR_REALLOC_N(interfaces->objs, interfaces->count - 1) < 0) { ; /* Failure to reduce memory allocation isn't fatal */ } interfaces->count--; break; } virInterfaceObjUnlock(interfaces->objs[i]); } }
void virInterfaceRemove(virInterfaceObjListPtr interfaces, virInterfaceObjPtr iface) { size_t i; virInterfaceObjUnlock(iface); for (i = 0; i < interfaces->count; i++) { virInterfaceObjLock(interfaces->objs[i]); if (interfaces->objs[i] == iface) { virInterfaceObjUnlock(interfaces->objs[i]); virInterfaceObjFree(interfaces->objs[i]); VIR_DELETE_ELEMENT(interfaces->objs, i, interfaces->count); break; } virInterfaceObjUnlock(interfaces->objs[i]); } }
virInterfaceObjPtr virInterfaceFindByName(virInterfaceObjListPtr interfaces, const char *name) { size_t i; for (i = 0; i < interfaces->count; i++) { virInterfaceObjLock(interfaces->objs[i]); if (STREQ(interfaces->objs[i]->def->name, name)) return interfaces->objs[i]; virInterfaceObjUnlock(interfaces->objs[i]); } return NULL; }
int virInterfaceObjListClone(virInterfaceObjListPtr src, virInterfaceObjListPtr dest) { int ret = -1; size_t i; unsigned int cnt; if (!src || !dest) goto cleanup; virInterfaceObjListFree(dest); /* start with an empty list */ cnt = src->count; for (i = 0; i < cnt; i++) { virInterfaceDefPtr def = src->objs[i]->def; virInterfaceDefPtr backup; virInterfaceObjPtr iface; char *xml = virInterfaceDefFormat(def); if (!xml) goto cleanup; if ((backup = virInterfaceDefParseString(xml)) == NULL) { VIR_FREE(xml); goto cleanup; } VIR_FREE(xml); if ((iface = virInterfaceAssignDef(dest, backup)) == NULL) goto cleanup; virInterfaceObjUnlock(iface); /* was locked by virInterfaceAssignDef */ } ret = cnt; cleanup: if ((ret < 0) && dest) virInterfaceObjListFree(dest); return ret; }
int virInterfaceFindByMACString(const virInterfaceObjListPtr interfaces, const char *mac, virInterfaceObjPtr *matches, int maxmatches) { unsigned int i, matchct = 0; for (i = 0 ; i < interfaces->count ; i++) { virInterfaceObjLock(interfaces->objs[i]); if (STRCASEEQ(interfaces->objs[i]->def->mac, mac)) { matchct++; if (matchct <= maxmatches) { matches[matchct - 1] = interfaces->objs[i]; /* keep the lock if we're returning object to caller */ /* it is the caller's responsibility to unlock *all* matches */ continue; } } virInterfaceObjUnlock(interfaces->objs[i]); } return matchct; }