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]); } }
virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces, virInterfaceDefPtr def) { virInterfaceObjPtr iface; if ((iface = virInterfaceFindByName(interfaces, def->name))) { virInterfaceDefFree(iface->def); iface->def = def; return iface; } if (VIR_ALLOC(iface) < 0) return NULL; if (virMutexInit(&iface->lock) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize mutex")); VIR_FREE(iface); return NULL; } virInterfaceObjLock(iface); iface->def = def; if (VIR_REALLOC_N(interfaces->objs, interfaces->count + 1) < 0) { VIR_FREE(iface); return NULL; } interfaces->objs[interfaces->count] = iface; interfaces->count++; return iface; }
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; }
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]); } }
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; }