#define VIR_FROM_THIS VIR_FROM_DOMAIN
+VIR_ENUM_IMPL(virDomainTaint, VIR_DOMAIN_TAINT_LAST,
+ "custom-argv",
+ "custom-monitor",
+ "high-privileges",
+ "shell-scripts",
+ "disk-probing");
+
VIR_ENUM_IMPL(virDomainVirt, VIR_DOMAIN_VIRT_LAST,
"qemu",
"kqemu",
return obj;
}
+
+bool virDomainObjTaint(virDomainObjPtr obj,
+ enum virDomainTaintFlags taint)
+{
+ int flag = (1 << taint);
+
+ if (obj->taint & flag)
+ return false;
+
+ obj->taint |= flag;
+ return true;
+}
+
+
static void
virDomainGraphicsAuthDefClear(virDomainGraphicsAuthDefPtr def)
{
xmlNodePtr config;
xmlNodePtr oldnode;
virDomainObjPtr obj;
+ xmlNodePtr *nodes = NULL;
+ int i, n;
if (!(obj = virDomainObjNew(caps)))
return NULL;
}
obj->pid = (pid_t)val;
+ if ((n = virXPathNodeSet("./taint", ctxt, &nodes)) < 0) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("failed to parse taint flags"));
+ goto error;
+ }
+ for (i = 0 ; i < n ; i++) {
+ char *str = virXMLPropString(nodes[i], "flag");
+ if (str) {
+ int flag = virDomainTaintTypeFromString(str);
+ VIR_FREE(str);
+ if (flag < 0) {
+ virDomainReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unknown taint flag %s"), str);
+ goto error;
+ }
+ virDomainObjTaint(obj, flag);
+ }
+ }
+ VIR_FREE(nodes);
+
if (caps->privateDataXMLParse &&
((caps->privateDataXMLParse)(ctxt, obj->privateData)) < 0)
goto error;
error:
/* obj was never shared, so unref should return 0 */
ignore_value(virDomainObjUnref(obj));
+ VIR_FREE(nodes);
return NULL;
}
{
char *config_xml = NULL;
virBuffer buf = VIR_BUFFER_INITIALIZER;
+ int i;
virBufferAsprintf(&buf, "<domstatus state='%s' pid='%d'>\n",
virDomainStateTypeToString(obj->state),
obj->pid);
+ for (i = 0 ; i < VIR_DOMAIN_TAINT_LAST ; i++) {
+ if (obj->taint & (1 << i))
+ virBufferAsprintf(&buf, " <taint flag='%s'/>\n",
+ virDomainTaintTypeToString(i));
+ }
+
if (caps->privateDataXMLFormat &&
((caps->privateDataXMLFormat)(&buf, obj->privateData)) < 0)
goto error;
virDomainXMLNamespace ns;
};
+enum virDomainTaintFlags {
+ VIR_DOMAIN_TAINT_CUSTOM_ARGV, /* Custom ARGV passthrough from XML */
+ VIR_DOMAIN_TAINT_CUSTOM_MONITOR, /* Custom monitor commands issued */
+ VIR_DOMAIN_TAINT_HIGH_PRIVILEGES, /* Running with undesirably high privileges */
+ VIR_DOMAIN_TAINT_SHELL_SCRIPTS, /* Network configuration using opaque shell scripts */
+ VIR_DOMAIN_TAINT_DISK_PROBING, /* Relying on potentially unsafe disk format probing */
+
+ VIR_DOMAIN_TAINT_LAST
+};
+
/* Guest VM runtime state */
typedef struct _virDomainObj virDomainObj;
typedef virDomainObj *virDomainObjPtr;
void *privateData;
void (*privateDataFreeFunc)(void *);
+
+ int taint;
};
typedef struct _virDomainObjList virDomainObjList;
virDomainObjPtr virDomainFindByName(const virDomainObjListPtr doms,
const char *name);
+bool virDomainObjTaint(virDomainObjPtr obj,
+ enum virDomainTaintFlags taint);
void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def);
void virDomainInputDefFree(virDomainInputDefPtr def);
typedef const char* (*virLifecycleToStringFunc)(int type);
typedef int (*virLifecycleFromStringFunc)(const char *type);
+VIR_ENUM_DECL(virDomainTaint)
+
VIR_ENUM_DECL(virDomainVirt)
VIR_ENUM_DECL(virDomainBoot)
VIR_ENUM_DECL(virDomainFeature)
virDomainObjLock;
virDomainObjRef;
virDomainObjSetDefTransient;
+virDomainObjTaint;
virDomainObjUnlock;
virDomainObjUnref;
virDomainRemoveInactive;
virDomainSoundModelTypeToString;
virDomainStateTypeFromString;
virDomainStateTypeToString;
+virDomainTaintTypeFromString;
+virDomainTaintTypeToString;
virDomainTimerModeTypeFromString;
virDomainTimerModeTypeToString;
virDomainTimerNameTypeFromString;