From: Pavel Hrdina Date: Fri, 20 Mar 2015 14:38:59 +0000 (+0100) Subject: internal: introduce macro helpers to reject exclusive flags X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=e86a94ee4cd62f195349d38c8bee6acaa8cc8183;p=people%2Fliuw%2Flibxenctrl-split%2Flibvirt.git internal: introduce macro helpers to reject exclusive flags Inspired by commit 7e437ee7 that introduced similar macros for virsh commands so we don't have to repeat the same code all over. Signed-off-by: Pavel Hrdina --- diff --git a/src/internal.h b/src/internal.h index 4d473afdf..b47ea60ac 100644 --- a/src/internal.h +++ b/src/internal.h @@ -327,6 +327,56 @@ } \ } while (0) +/* Macros to help dealing with mutually exclusive flags. */ + +/** + * VIR_EXCLUSIVE_FLAGS_RET: + * + * @FLAG1: First flag to be checked. + * @FLAG2: Second flag to be checked. + * @RET: Return value. + * + * Reject mutually exclusive API flags. 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_EXCLUSIVE_FLAGS_RET(FLAG1, FLAG2, RET) \ + do { \ + if ((flags & FLAG1) && (flags & FLAG2)) { \ + virReportInvalidArg(ctl, \ + _("Flags '%s' and '%s' are mutually " \ + "exclusive"), \ + #FLAG1, #FLAG2); \ + return RET; \ + } \ + } while (0) + +/** + * VIR_EXCLUSIVE_FLAGS_GOTO: + * + * @FLAG1: First flag to be checked. + * @FLAG2: Second flag to be checked. + * @LABEL: Label to jump to. + * + * Reject mutually exclusive API flags. The checked flags are compared + * with flags variable. + * + * Returns nothing. Jumps to a label if unsupported flags were + * passed to it. + */ +# define VIR_EXCLUSIVE_FLAGS_GOTO(FLAG1, FLAG2, LABEL) \ + do { \ + if ((flags & FLAG1) && (flags & FLAG2)) { \ + virReportInvalidArg(ctl, \ + _("Flags '%s' and '%s' are mutually " \ + "exclusive"), \ + #FLAG1, #FLAG2); \ + goto LABEL; \ + } \ + } while (0) + # define virCheckNonNullArgReturn(argname, retval) \ do { \ if (argname == NULL) { \