Similar to VIR_EXLUSIVE_FLAGS, it will error out if flag requirement is
not met.
Signed-off-by: Pavel Hrdina <phrdina(a)redhat.com>
---
src/internal.h | 43 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/src/internal.h b/src/internal.h
index eb8d231..6363e58 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -371,6 +371,49 @@
goto LABEL; \
}
+/* Macros to help dealing with flag requirements. */
+
+/**
+ * VIR_REQUIRE_FLAG_RET:
+ *
+ * @FLAG1: First flag to be checked.
+ * @FLAG2: Second flag that is required by first flag.
+ * @RET: Return value.
+ *
+ * Check whether required flag is set. The checked flags are compared
+ * with flags variable.
+ *
+ * This helper does an early return and therefore it has to be called
+ * before anything that would require cleanup.
+ */
+# define VIR_REQUIRE_FLAG_RET(FLAG1, FLAG2, RET) \
+ if ((flags & FLAG1) && !(flags & FLAG2)) {
\
+ virReportInvalidArg(ctl, \
+ _("Flag '%s' is required by flag
'%s'"), \
+ #FLAG2, #FLAG1); \
+ return RET; \
+ }
+
+/**
+ * VIR_REQUIRE_FLAG_GOTO:
+ *
+ * @FLAG1: First flag to be checked.
+ * @FLAG2: Second flag that is required by first flag.
+ * @LABEL: Label to jump to.
+ *
+ * Check whether required flag is set. The checked flags are compared
+ * with flags variable.
+ *
+ * Returns nothing. Jumps to a label if required flag is not set.
+ */
+# define VIR_REQUIRE_FLAG_GOTO(FLAG1, FLAG2, LABEL) \
+ if ((flags & FLAG1) && !(flags & FLAG2)) {
\
+ virReportInvalidArg(ctl, \
+ _("Flag '%s' is required by flag
'%s'"), \
+ #FLAG2, #FLAG1); \
+ goto LABEL; \
+ }
+
# define virCheckNonNullArgReturn(argname, retval) \
do { \
if (argname == NULL) { \
--
2.0.5