[libvirt] [PATCH 1/6] internal: introduce macro helpers to reject exclusive flags

Pavel Hrdina phrdina at redhat.com
Tue Mar 24 17:00:49 UTC 2015


On Tue, Mar 24, 2015 at 04:40:17PM +0100, Peter Krempa wrote:
> On Fri, Mar 20, 2015 at 15:38:59 +0100, Pavel Hrdina wrote:
> > 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 <phrdina at redhat.com>
> > ---
> >  src/internal.h | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 80 insertions(+)
> > 
> > diff --git a/src/internal.h b/src/internal.h
> > index 4d473af..5885f03 100644
> > --- a/src/internal.h
> > +++ b/src/internal.h
> > @@ -327,6 +327,86 @@
> >          }                                                               \
> >      } while (0)
> >  
> > +/* Macros to help dealing with mutually exclusive flags. */
> > +
> > +/**
> > + * VIR_EXCLUSIVE_FLAGS_EXPR_RET:
> > + *
> > + * @NAME1: String containing the name of the flag.
> > + * @EXPR1: Expression to validate the flag.
> > + * @NAME2: String containing the name of the flag.
> > + * @EXPR2: Expression to validate the flag.
> > + *
> > + * Reject mutually exclusive API flags.  Use the provided expression
> > + * to check the flags.
> > + *
> > + * This helper does an early return and therefore it has to be called
> > + * before anything that would require cleanup.
> > + */
> > +# define VIR_EXCLUSIVE_FLAGS_EXPR_RET(NAME1, EXPR1, NAME2, EXPR2)           \
> > +    if ((EXPR1) && (EXPR2)) {                                               \
> > +        virReportInvalidArg(ctl,                                            \
> > +                            _("Flags '%s' and '%s' are mutually exclusive"),\
> > +                            NAME1, NAME2);                                  \
> > +        return -1;                                                          \
> > +    }
> > +
> 
> While in virsh the above variant makes sense, because in some cases the
> variables have different names than the corresponding flags, in case of
> this code having it doesn't make sense.

You're right. I've only used the other macros.

> 
> 
> > +/**
> > + * VIR_EXCLUSIVE_FLAGS_VAR_RET:
> > + *
> > + * @FLAG1: First flag to be checked
> > + * @FLAG2: Second flag to be checked
> 
> A third argument @RET should be added here so that this can be used in
> places that also return NULL or any other possible variable.
> 
> In virsh the assumption is that the flags are checked at first and thus
> returning false makes sense, as every virsh command does that.

I'll add the @RET argument.

> 
> > + *
> > + * 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)                              \
> > +    VIR_EXCLUSIVE_FLAGS_EXPR_RET(#FLAG1, flags & FLAG1, #FLAG2, flags & FLAG2)
> > +
> > +/**
> > + * VIR_EXCLUSIVE_FLAGS_EXPR_GOTO:
> > + *
> > + * @NAME1: String containing the name of the flag.
> > + * @EXPR1: Expression to validate the flag.
> > + * @NAME2: String containing the name of the flag.
> > + * @EXPR2: Expression to validate the flag.
> > + * @LABEL: label to jump to.
> > + *
> > + * Reject mutually exclusive API flags.  Use the provided expression
> > + * to check the flag.
> > + *
> > + * Returns nothing.  Jumps to a label if unsupported flags were
> > + * passed to it.
> > + */
> > +# define VIR_EXCLUSIVE_FLAGS_EXPR_GOTO(NAME1, EXPR1, NAME2, EXPR2, LABEL)   \
> > +    if ((EXPR1) && (EXPR2)) {                                               \
> > +        virReportInvalidArg(ctl,                                            \
> > +                            _("Flags '%s' and '%s' are mutually exclusive"),\
> > +                            NAME1, NAME2);                                  \
> > +        goto LABEL;                                                         \
> > +    }
> > +
> 
> Again, this function does not make sense in the library code.
> 
> > +/**
> > + * VIR_EXCLUSIVE_FLAGS_VAR_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)                      \
> > +    VIR_EXCLUSIVE_FLAGS_EXPR_GOTO(#FLAG1, flags & FLAG1,                    \
> > +                                  #FLAG2, flags & FLAG2, LABEL)
> > +
> > +
> >  # define virCheckNonNullArgReturn(argname, retval)  \
> >      do {                                            \
> >          if (argname == NULL) {                      \
> 
> While this is okay.
> 
> Peter

Thanks for review, I'll send v2.

Pavel




More information about the libvir-list mailing list