Re: [PATCH 09/12] virsh: Enable multiple --event flags to 'event' command

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, May 04, 2018 at 17:25:30 +0800, Lin Ma wrote:
> Signed-off-by: Lin Ma <lma@xxxxxxxx>
> ---
>  tools/virsh-domain.c | 76 +++++++++++++++++++++++++++-------------------------
>  1 file changed, 39 insertions(+), 37 deletions(-)
> 
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index 89aefbf86a..b35c9adaaa 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c
> @@ -13347,10 +13347,6 @@ static const vshCmdInfo info_event[] = {
>  static const vshCmdOptDef opts_event[] = {
>      VIRSH_COMMON_OPT_DOMAIN_OT_STRING(N_("filter by domain name, id or uuid"),
>                                        0),
> -    {.name = "event",
> -     .type = VSH_OT_STRING,
> -     .help = N_("which event type to wait for")
> -    },
>      {.name = "all",
>       .type = VSH_OT_BOOL,
>       .help = N_("wait for all events instead of just one type")
> @@ -13371,6 +13367,10 @@ static const vshCmdOptDef opts_event[] = {
>       .type = VSH_OT_BOOL,
>       .help = N_("show timestamp for each printed event")
>      },
> +    {.name = "event",
> +     .type = VSH_OT_ARGV,
> +     .help = N_("which event type to wait for")
> +    },
>      {.name = NULL}
>  };
>  
> @@ -13382,12 +13382,14 @@ cmdEvent(vshControl *ctl, const vshCmd *cmd)
>      int timeout = 0;
>      virshDomEventData *data = NULL;
>      size_t i;
> -    const char *eventName = NULL;
> +    int *eventIdxList = NULL;
> +    size_t nevents = 0;
>      int event = -1;
>      bool all = vshCommandOptBool(cmd, "all");
>      bool loop = vshCommandOptBool(cmd, "loop");
>      bool timestamp = vshCommandOptBool(cmd, "timestamp");
>      int count = 0;
> +    const vshCmdOpt *opt = NULL;
>      virshControlPtr priv = ctl->privData;
>  
>      if (vshCommandOptBool(cmd, "list")) {
> @@ -13396,15 +13398,25 @@ cmdEvent(vshControl *ctl, const vshCmd *cmd)
>          return true;
>      }
>  
> -    if (vshCommandOptStringReq(ctl, cmd, "event", &eventName) < 0)
> -        return false;
> -    if (eventName) {
> -        for (event = 0; event < VIR_DOMAIN_EVENT_ID_LAST; event++)
> -            if (STREQ(eventName, vshEventCallbacks[event].name))
> -                break;
> -        if (event == VIR_DOMAIN_EVENT_ID_LAST) {
> -            vshError(ctl, _("unknown event type %s"), eventName);
> -            return false;
> +    if (vshCommandOptBool(cmd, "event")) {
> +        if (VIR_ALLOC_N(eventIdxList, 1) < 0)
> +            goto cleanup;

This is not necessary, VIR_APPEND_ELEMENT does that

> +        nevents = 1;
> +        while ((opt = vshCommandOptArgv(ctl, cmd, opt))) {
> +            if (opt->data) {
> +                for (event = 0; event < VIR_DOMAIN_EVENT_ID_LAST; event++)
> +                    if (STREQ(opt->data, vshEventCallbacks[event].name))
> +                        break;
> +                if (event == VIR_DOMAIN_EVENT_ID_LAST) {
> +                    vshError(ctl, _("unknown event type %s"), opt->data);
> +                    return false;

This leaks the eventIdxList array. Also it would be preferrable just to
use one array for the case when events are enumerated and when all are
used ... 

> +                }
> +                if (VIR_INSERT_ELEMENT(eventIdxList,

Use VIR_APPEND_ELEMENT instead.

> +                                       nevents - 1,
> +                                       nevents,
> +                                       event) < 0)
> +                    goto cleanup;
> +            }
>          }
>      } else if (!all) {
>          vshError(ctl, "%s",
> @@ -13412,26 +13424,15 @@ cmdEvent(vshControl *ctl, const vshCmd *cmd)
>          return false;
>      }
>  
> -    if (all) {
> -        if (VIR_ALLOC_N(data, VIR_DOMAIN_EVENT_ID_LAST) < 0)
> -            goto cleanup;
> -        for (i = 0; i < VIR_DOMAIN_EVENT_ID_LAST; i++) {
> -            data[i].ctl = ctl;
> -            data[i].loop = loop;
> -            data[i].count = &count;
> -            data[i].timestamp = timestamp;
> -            data[i].cb = &vshEventCallbacks[i];
> -            data[i].id = -1;
> -        }
> -    } else {
> -        if (VIR_ALLOC_N(data, 1) < 0)
> -            goto cleanup;
> -        data[0].ctl = ctl;
> -        data[0].loop = vshCommandOptBool(cmd, "loop");
> -        data[0].count = &count;
> -        data[0].timestamp = timestamp;
> -        data[0].cb = &vshEventCallbacks[event];
> -        data[0].id = -1;
> +    if (VIR_ALLOC_N(data, all ? VIR_DOMAIN_EVENT_ID_LAST : nevents - 1) < 0)
> +        goto cleanup;
> +    for (i = 0; i < (all ? VIR_DOMAIN_EVENT_ID_LAST : nevents - 1); i++) {
> +        data[i].ctl = ctl;
> +        data[i].loop = loop;
> +        data[i].count = &count;
> +        data[i].timestamp = timestamp;
> +        data[i].cb = &vshEventCallbacks[all ? i : eventIdxList[i]];

No ternaries, please use the same array, just fill it differently.

> +        data[i].id = -1;

You can refactor the above to use VIR_APPEND_ELEMENT too so that the
same array can be used.

>      }
>      if (vshCommandOptTimeoutToMs(ctl, cmd, &timeout) < 0)
>          goto cleanup;

Attachment: signature.asc
Description: PGP signature

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux