385
virNWFilterPoolObjRemove(virNWFilterPoolObjListPtr pools,
386
virNWFilterPoolObjPtr pool)
386
virNWFilterObjRemove(virNWFilterObjListPtr nwfilters,
387
virNWFilterObjPtr nwfilter)
390
virNWFilterPoolObjUnlock(pool);
392
for (i = 0 ; i < pools->count ; i++) {
393
virNWFilterPoolObjLock(pools->objs[i]);
394
if (pools->objs[i] == pool) {
395
virNWFilterPoolObjUnlock(pools->objs[i]);
396
virNWFilterPoolObjFree(pools->objs[i]);
398
if (i < (pools->count - 1))
399
memmove(pools->objs + i, pools->objs + i + 1,
400
sizeof(*(pools->objs)) * (pools->count - (i + 1)));
402
if (VIR_REALLOC_N(pools->objs, pools->count - 1) < 0) {
391
virNWFilterObjUnlock(nwfilter);
393
for (i = 0 ; i < nwfilters->count ; i++) {
394
virNWFilterObjLock(nwfilters->objs[i]);
395
if (nwfilters->objs[i] == nwfilter) {
396
virNWFilterObjUnlock(nwfilters->objs[i]);
397
virNWFilterObjFree(nwfilters->objs[i]);
399
if (i < (nwfilters->count - 1))
400
memmove(nwfilters->objs + i, nwfilters->objs + i + 1,
401
sizeof(*(nwfilters->objs)) * (nwfilters->count - (i + 1)));
403
if (VIR_REALLOC_N(nwfilters->objs, nwfilters->count - 1) < 0) {
403
404
; /* Failure to reduce memory allocation isn't fatal */
409
virNWFilterPoolObjUnlock(pools->objs[i]);
410
virNWFilterObjUnlock(nwfilters->objs[i]);
2092
virNWFilterPoolObjPtr
2093
virNWFilterPoolObjFindByUUID(virNWFilterPoolObjListPtr pools,
2094
const unsigned char *uuid)
2094
virNWFilterObjFindByUUID(virNWFilterObjListPtr nwfilters,
2095
const unsigned char *uuid)
2096
2097
unsigned int i;
2098
for (i = 0 ; i < pools->count ; i++) {
2099
virNWFilterPoolObjLock(pools->objs[i]);
2100
if (!memcmp(pools->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN))
2101
return pools->objs[i];
2102
virNWFilterPoolObjUnlock(pools->objs[i]);
2099
for (i = 0 ; i < nwfilters->count ; i++) {
2100
virNWFilterObjLock(nwfilters->objs[i]);
2101
if (!memcmp(nwfilters->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN))
2102
return nwfilters->objs[i];
2103
virNWFilterObjUnlock(nwfilters->objs[i]);
2109
virNWFilterPoolObjPtr
2110
virNWFilterPoolObjFindByName(virNWFilterPoolObjListPtr pools,
2111
virNWFilterObjFindByName(virNWFilterObjListPtr nwfilters, const char *name)
2113
2113
unsigned int i;
2115
for (i = 0 ; i < pools->count ; i++) {
2116
virNWFilterPoolObjLock(pools->objs[i]);
2117
if (STREQ(pools->objs[i]->def->name, name))
2118
return pools->objs[i];
2119
virNWFilterPoolObjUnlock(pools->objs[i]);
2115
for (i = 0 ; i < nwfilters->count ; i++) {
2116
virNWFilterObjLock(nwfilters->objs[i]);
2117
if (STREQ(nwfilters->objs[i]->def->name, name))
2118
return nwfilters->objs[i];
2119
virNWFilterObjUnlock(nwfilters->objs[i]);
2341
2340
virNWFilterTestUnassignDef(virConnectPtr conn,
2342
virNWFilterPoolObjPtr pool)
2341
virNWFilterObjPtr nwfilter)
2346
2345
virNWFilterLockFilterUpdates();
2348
pool->wantRemoved = 1;
2349
// trigger the update on VMs referencing the filter
2347
nwfilter->wantRemoved = 1;
2348
/* trigger the update on VMs referencing the filter */
2350
2349
if (virNWFilterTriggerVMFilterRebuild(conn))
2353
pool->wantRemoved = 0;
2352
nwfilter->wantRemoved = 0;
2354
2353
virNWFilterUnlockFilterUpdates();
2359
virNWFilterPoolObjPtr
2360
virNWFilterPoolObjAssignDef(virConnectPtr conn,
2361
virNWFilterPoolObjListPtr pools,
2362
virNWFilterDefPtr def)
2359
virNWFilterObjAssignDef(virConnectPtr conn,
2360
virNWFilterObjListPtr nwfilters,
2361
virNWFilterDefPtr def)
2364
virNWFilterPoolObjPtr pool;
2366
pool = virNWFilterPoolObjFindByUUID(pools, def->uuid);
2369
if (!STREQ(def->name, pool->def->name)) {
2370
virNWFilterReportError(VIR_ERR_INVALID_NWFILTER,
2371
_("filter with same UUID but different name "
2372
"('%s') already exists"),
2374
virNWFilterPoolObjUnlock(pool);
2363
virNWFilterObjPtr nwfilter;
2365
nwfilter = virNWFilterObjFindByUUID(nwfilters, def->uuid);
2368
if (!STREQ(def->name, nwfilter->def->name)) {
2369
virNWFilterReportError(VIR_ERR_OPERATION_FAILED,
2370
_("filter with same UUID but different name "
2371
"('%s') already exists"),
2372
nwfilter->def->name);
2373
virNWFilterObjUnlock(nwfilter);
2377
virNWFilterPoolObjUnlock(pool);
2376
virNWFilterObjUnlock(nwfilter);
2380
if (virNWFilterDefLoopDetect(conn, pools, def)) {
2381
virNWFilterReportError(VIR_ERR_INVALID_NWFILTER,
2379
if (virNWFilterDefLoopDetect(conn, nwfilters, def)) {
2380
virNWFilterReportError(VIR_ERR_OPERATION_FAILED,
2382
2381
"%s", _("filter would introduce a loop"));
2386
if ((pool = virNWFilterPoolObjFindByName(pools, def->name))) {
2385
if ((nwfilter = virNWFilterObjFindByName(nwfilters, def->name))) {
2387
2386
virNWFilterLockFilterUpdates();
2389
// trigger the update on VMs referencing the filter
2387
nwfilter->newDef = def;
2388
/* trigger the update on VMs referencing the filter */
2390
2389
if (virNWFilterTriggerVMFilterRebuild(conn)) {
2391
pool->newDef = NULL;
2390
nwfilter->newDef = NULL;
2392
2391
virNWFilterUnlockFilterUpdates();
2393
virNWFilterPoolObjUnlock(pool);
2392
virNWFilterObjUnlock(nwfilter);
2397
virNWFilterDefFree(pool->def);
2399
pool->newDef = NULL;
2396
virNWFilterDefFree(nwfilter->def);
2397
nwfilter->def = def;
2398
nwfilter->newDef = NULL;
2400
2399
virNWFilterUnlockFilterUpdates();
2404
if (VIR_ALLOC(pool) < 0) {
2403
if (VIR_ALLOC(nwfilter) < 0) {
2405
2404
virReportOOMError();
2409
if (virMutexInitRecursive(&pool->lock) < 0) {
2408
if (virMutexInitRecursive(&nwfilter->lock) < 0) {
2410
2409
virNWFilterReportError(VIR_ERR_INTERNAL_ERROR,
2411
2410
"%s", _("cannot initialize mutex"));
2415
virNWFilterPoolObjLock(pool);
2414
virNWFilterObjLock(nwfilter);
2415
nwfilter->active = 0;
2416
nwfilter->def = def;
2419
if (VIR_REALLOC_N(pools->objs, pools->count+1) < 0) {
2421
virNWFilterPoolObjUnlock(pool);
2422
virNWFilterPoolObjFree(pool);
2418
if (VIR_REALLOC_N(nwfilters->objs, nwfilters->count + 1) < 0) {
2419
nwfilter->def = NULL;
2420
virNWFilterObjUnlock(nwfilter);
2421
virNWFilterObjFree(nwfilter);
2423
2422
virReportOOMError();
2426
pools->objs[pools->count++] = pool;
2425
nwfilters->objs[nwfilters->count++] = nwfilter;
2432
static virNWFilterPoolObjPtr
2433
virNWFilterPoolObjLoad(virConnectPtr conn,
2434
virNWFilterPoolObjListPtr pools,
2431
static virNWFilterObjPtr
2432
virNWFilterObjLoad(virConnectPtr conn,
2433
virNWFilterObjListPtr nwfilters,
2438
2437
virNWFilterDefPtr def;
2439
virNWFilterPoolObjPtr pool;
2438
virNWFilterObjPtr nwfilter;
2441
2440
if (!(def = virNWFilterDefParseFile(conn, path))) {
2445
2444
if (!virFileMatchesNameSuffix(file, def->name, ".xml")) {
2446
virNWFilterReportError(VIR_ERR_INVALID_NWFILTER,
2447
_("network filter pool config filename '%s' does not match pool name '%s'"),
2445
virNWFilterReportError(VIR_ERR_XML_ERROR,
2446
_("network filter config filename '%s' does not match name '%s'"),
2448
2447
path, def->name);
2449
2448
virNWFilterDefFree(def);
2453
if (!(pool = virNWFilterPoolObjAssignDef(conn, pools, def))) {
2452
if (!(nwfilter = virNWFilterObjAssignDef(conn, nwfilters, def))) {
2454
2453
virNWFilterDefFree(def);
2458
VIR_FREE(pool->configFile); // for driver reload
2459
pool->configFile = strdup(path);
2460
if (pool->configFile == NULL) {
2457
VIR_FREE(nwfilter->configFile); /* for driver reload */
2458
nwfilter->configFile = strdup(path);
2459
if (nwfilter->configFile == NULL) {
2461
2460
virReportOOMError();
2462
2461
virNWFilterDefFree(def);
2471
virNWFilterPoolLoadAllConfigs(virConnectPtr conn,
2472
virNWFilterPoolObjListPtr pools,
2473
const char *configDir)
2470
virNWFilterLoadAllConfigs(virConnectPtr conn,
2471
virNWFilterObjListPtr nwfilters,
2472
const char *configDir)
2476
2475
struct dirent *entry;