All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Michael Tokarev <mjt@tls.msk.ru>
Cc: qemu-devel@nongnu.org, qemu-block@nongnu.org
Subject: Re: [PATCH 19/28] qemu-img: resize: do not always eat last argument
Date: Mon, 26 Feb 2024 14:52:49 +0000	[thread overview]
Message-ID: <Zdylwbu94EKzB73y@redhat.com> (raw)
In-Reply-To: <20240221211622.2335170-19-mjt@tls.msk.ru>

On Thu, Feb 22, 2024 at 12:16:00AM +0300, Michael Tokarev wrote:
> 'qemu-img resize --help' does not work, since it wants more
> arguments.  Also it -size is only recognized as a very last
> argument, but it is common for tools to handle other options
> after positional arguments too.
> 
> Tell getopt_long() to return non-options together with options,
> and process filename and size in the loop, and check if there's
> an argument right after filename which looks like -N (number),
> and treat it as size (decrement).  This way we can handle --help,
> and we can also have options after filename and size, and `--'
> will be handled fine too.
> 
> The only case which is not handled right is when there's an option
> between filename and size, and size is given as decrement, - in
> this case -size will be treated as option, not as size.
> 
> Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
> ---
>  qemu-img.c | 41 +++++++++++++++++++++++++++--------------
>  1 file changed, 27 insertions(+), 14 deletions(-)
> 
> diff --git a/qemu-img.c b/qemu-img.c
> index 2a4bff2872..c8b0b68d67 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -4296,7 +4296,7 @@ static int img_resize(const img_cmd_t *ccmd, int argc, char **argv)
>  {
>      Error *err = NULL;
>      int c, ret, relative;
> -    const char *filename, *fmt, *size;
> +    const char *filename = NULL, *fmt = NULL, *size = NULL;
>      int64_t n, total_size, current_size;
>      bool quiet = false;
>      BlockBackend *blk = NULL;
> @@ -4319,17 +4319,7 @@ static int img_resize(const img_cmd_t *ccmd, int argc, char **argv)
>      bool image_opts = false;
>      bool shrink = false;
>  
> -    /* Remove size from argv manually so that negative numbers are not treated
> -     * as options by getopt. */
> -    if (argc < 3) {
> -        error_exit(argv[0], "Not enough arguments");
> -        return 1;
> -    }
> -
> -    size = argv[--argc];
> -
>      /* Parse getopt arguments */
> -    fmt = NULL;
>      for(;;) {
>          static const struct option long_options[] = {
>              {"help", no_argument, 0, 'h'},
> @@ -4339,7 +4329,7 @@ static int img_resize(const img_cmd_t *ccmd, int argc, char **argv)
>              {"shrink", no_argument, 0, OPTION_SHRINK},
>              {0, 0, 0, 0}
>          };
> -        c = getopt_long(argc, argv, ":f:hq",
> +        c = getopt_long(argc, argv, "-:f:hq",

In other patches you removed the initial ':' from gopt_long arg strings.

>                          long_options, NULL);
>          if (c == -1) {
>              break;
> @@ -4377,12 +4367,35 @@ static int img_resize(const img_cmd_t *ccmd, int argc, char **argv)
>          case OPTION_SHRINK:
>              shrink = true;
>              break;
> +        case 1: /* a non-optional argument */
> +            if (!filename) {
> +                filename = optarg;
> +                /* see if we have -size (number) next to filename */
> +                if (optind < argc) {
> +                    size = argv[optind];
> +                    if (size[0] == '-' && size[1] >= '0' && size[1] <= '9') {
> +                        ++optind;
> +                    } else {
> +                        size = NULL;
> +                    }
> +                }
> +            } else if (!size) {
> +                size = optarg;
> +            } else {
> +                error_exit(argv[0], "Extra argument(s) in command line");
> +            }
> +            break;

Can you say what scenario exercises this code 'case 1' ?  I couldn't
get it to run in any scenarios i tried, and ineed removing this,
and removing the 'getopt_long' change, I could still run  'qemu-img resize --help'
OK, and also run 'qemu-img resize foo -43' too.

>          }
>      }
> -    if (optind != argc - 1) {
> +    if (!filename && optind < argc) {
> +        filename = argv[optind++];
> +    }
> +    if (!size && optind < argc) {
> +        size = argv[optind++];
> +    }
> +    if (!filename || !size || optind < argc) {
>          error_exit(argv[0], "Expecting image file name and size");
>      }
> -    filename = argv[optind++];
>  
>      /* Choose grow, shrink, or absolute resize mode */
>      switch (size[0]) {
> -- 
> 2.39.2
> 
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



  reply	other threads:[~2024-02-26 14:54 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-21 21:15 [PATCH v2 00/28] qemu-img: refersh options and --help handling, cleanups Michael Tokarev
2024-02-21 21:15 ` [PATCH 01/28] qemu-img: stop printing error twice in a few places Michael Tokarev
2024-02-26 14:14   ` Daniel P. Berrangé
2024-02-26 18:58     ` Michael Tokarev
2024-02-26 16:37   ` Michael Tokarev
2024-02-21 21:15 ` [PATCH 02/28] qemu-img: measure: convert img_size to signed, simplify handling Michael Tokarev
2024-02-26 14:19   ` Daniel P. Berrangé
2024-02-21 21:15 ` [PATCH 03/28] qemu-img: create: " Michael Tokarev
2024-02-26 14:19   ` Daniel P. Berrangé
2024-02-21 21:15 ` [PATCH 04/28] qemu-img: global option processing and error printing Michael Tokarev
2024-02-26 14:23   ` Daniel P. Berrangé
2024-02-26 15:40   ` Daniel P. Berrangé
2024-02-21 21:13     ` [PATCH v2.1 " Michael Tokarev
2024-02-26 15:43     ` [PATCH " Michael Tokarev
2024-02-26 16:25       ` Michael Tokarev
2024-02-21 21:15 ` [PATCH 05/28] qemu-img: pass current cmd info into command handlers Michael Tokarev
2024-02-26 14:24   ` Daniel P. Berrangé
2024-02-21 21:15 ` [PATCH 06/28] qemu-img: create: refresh options/--help Michael Tokarev
2024-02-26 14:34   ` Daniel P. Berrangé
2024-02-26 14:37     ` Michael Tokarev
2024-02-21 21:15 ` [PATCH 07/28] qemu-img: factor out parse_output_format() and use it in the code Michael Tokarev
2024-02-21 21:15 ` [PATCH 08/28] qemu-img: check: refresh options/--help Michael Tokarev
2024-02-21 21:15 ` [PATCH 09/28] qemu-img: simplify --repair error message Michael Tokarev
2024-02-21 21:15 ` [PATCH 10/28] qemu-img: commit: refresh options/--help Michael Tokarev
2024-02-21 21:15 ` [PATCH 11/28] qemu-img: compare: " Michael Tokarev
2024-02-21 21:15 ` [PATCH 12/28] qemu-img: convert: " Michael Tokarev
2024-02-21 21:15 ` [PATCH 13/28] qemu-img: info: " Michael Tokarev
2024-02-21 21:15 ` [PATCH 14/28] qemu-img: map: " Michael Tokarev
2024-02-21 21:15 ` [PATCH 15/28] qemu-img: snapshot: allow specifying -f fmt Michael Tokarev
2024-02-21 21:15 ` [PATCH 16/28] qemu-img: snapshot: make -l (list) the default, simplify option handling Michael Tokarev
2024-02-26 14:36   ` Daniel P. Berrangé
2024-02-21 21:15 ` [PATCH 17/28] qemu-img: snapshot: refresh options/--help Michael Tokarev
2024-02-21 21:15 ` [PATCH 18/28] qemu-img: rebase: " Michael Tokarev
2024-02-21 21:16 ` [PATCH 19/28] qemu-img: resize: do not always eat last argument Michael Tokarev
2024-02-26 14:52   ` Daniel P. Berrangé [this message]
2024-02-26 14:59     ` Michael Tokarev
2024-02-21 21:16 ` [PATCH 20/28] qemu-img: resize: refresh options/--help Michael Tokarev
2024-02-21 21:16 ` [PATCH 21/28] qemu-img: amend: " Michael Tokarev
2024-02-21 21:16 ` [PATCH 22/28] qemu-img: bench: " Michael Tokarev
2024-02-21 21:16 ` [PATCH 23/28] qemu-img: bitmap: " Michael Tokarev
2024-02-21 21:16 ` [PATCH 24/28] qemu-img: dd: " Michael Tokarev
2024-02-21 21:16 ` [PATCH 25/28] qemu-img: measure: " Michael Tokarev
2024-02-21 21:16 ` [PATCH 26/28] qemu-img: implement short --help, remove global help() function Michael Tokarev
2024-02-26 14:53   ` Daniel P. Berrangé
2024-02-21 21:16 ` [PATCH 27/28] qemu-img: inline list of supported commands, remove qemu-img-cmds.h include Michael Tokarev
2024-02-26 14:54   ` Daniel P. Berrangé
2024-02-21 21:16 ` [PATCH 28/28] qemu-img: extend cvtnum() and use it in more places Michael Tokarev
2024-02-26 14:57   ` Daniel P. Berrangé
2024-02-26 19:16   ` Michael Tokarev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Zdylwbu94EKzB73y@redhat.com \
    --to=berrange@redhat.com \
    --cc=mjt@tls.msk.ru \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.