virDomainCapsCPUModelsPtr virDomainCapsCPUModelsFilter(virDomainCapsCPUModelsPtr old, const char **models, const char **blacklist) { virDomainCapsCPUModelsPtr cpuModels; size_t i; if (!(cpuModels = virDomainCapsCPUModelsNew(0))) return NULL; for (i = 0; i < old->nmodels; i++) { if (models && !virStringListHasString(models, old->models[i].name)) continue; if (blacklist && virStringListHasString(blacklist, old->models[i].name)) continue; if (virDomainCapsCPUModelsAdd(cpuModels, old->models[i].name, -1, old->models[i].usable, old->models[i].blockers) < 0) goto error; } return cpuModels; error: virObjectUnref(cpuModels); return NULL; }
static int testRemove(const void *args) { const struct testSplitData *data = args; char **list = NULL; size_t ntokens; size_t i; int ret = -1; if (!(list = virStringSplitCount(data->string, data->delim, data->max_tokens, &ntokens))) { VIR_DEBUG("Got no tokens at all"); return -1; } for (i = 0; data->tokens[i]; i++) { virStringListRemove(&list, data->tokens[i]); if (virStringListHasString((const char **) list, data->tokens[i])) { virFilePrintf(stderr, "Not removed %s", data->tokens[i]); goto cleanup; } } if (list && list[0]) { virFilePrintf(stderr, "Not removed all tokens: %s", list[0]); goto cleanup; } ret = 0; cleanup: virStringListFree(list); return ret; }
static void lxcSetCapDrop(virDomainDefPtr def, virConfPtr properties) { VIR_AUTOFREE(char *) value = NULL; char **toDrop = NULL; const char *capString; size_t i; if (virConfGetValueString(properties, "lxc.cap.drop", &value) > 0) toDrop = virStringSplit(value, " ", 0); for (i = 0; i < VIR_DOMAIN_CAPS_FEATURE_LAST; i++) { capString = virDomainCapsFeatureTypeToString(i); if (toDrop != NULL && virStringListHasString((const char **)toDrop, capString)) def->caps_features[i] = VIR_TRISTATE_SWITCH_OFF; } def->features[VIR_DOMAIN_FEATURE_CAPABILITIES] = VIR_DOMAIN_CAPABILITIES_POLICY_ALLOW; virStringListFree(toDrop); }
static int lxcAddFstabLine(virDomainDefPtr def, lxcFstabPtr fstab) { const char *src = NULL; char *dst = NULL; char **options = virStringSplit(fstab->options, ",", 0); bool readonly; int type = VIR_DOMAIN_FS_TYPE_MOUNT; unsigned long long usage = 0; int ret = -1; if (!options) return -1; if (fstab->dst[0] != '/') { if (virAsprintf(&dst, "/%s", fstab->dst) < 0) goto cleanup; } else { if (VIR_STRDUP(dst, fstab->dst) < 0) goto cleanup; } /* Check that we don't add basic mounts */ if (lxcIsBasicMountLocation(dst)) { ret = 0; goto cleanup; } if (STREQ(fstab->type, "tmpfs")) { char *sizeStr = NULL; size_t i; type = VIR_DOMAIN_FS_TYPE_RAM; for (i = 0; options[i]; i++) { if ((sizeStr = STRSKIP(options[i], "size="))) { if (lxcConvertSize(sizeStr, &usage) < 0) goto cleanup; break; } } if (!sizeStr) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("missing tmpfs size, set the size option")); goto cleanup; } } else { src = fstab->src; } /* Is it a block device that needs special favor? */ if (STRPREFIX(fstab->src, "/dev/")) type = VIR_DOMAIN_FS_TYPE_BLOCK; /* Do we have ro in options? */ readonly = virStringListHasString((const char **)options, "ro"); if (lxcAddFSDef(def, type, src, dst, readonly, usage) < 0) goto cleanup; ret = 1; cleanup: VIR_FREE(dst); virStringListFree(options); return ret; }