qemu-block
[Top][All Lists]
Advanced

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

Re: [Qemu-block] [PATCH v2] qemu-io: Reinitialize optind to 1 (not 0) be


From: Kevin Wolf
Subject: Re: [Qemu-block] [PATCH v2] qemu-io: Reinitialize optind to 1 (not 0) before parsing inner command.
Date: Tue, 8 Jan 2019 13:16:25 +0100
User-agent: Mutt/1.10.1 (2018-07-13)

Am 07.01.2019 um 19:40 hat Richard W.M. Jones geschrieben:
> On Mon, Jan 07, 2019 at 06:50:53PM +0100, Max Reitz wrote:
> [...]
> 
> I don't particularly care how we fix this, but it breaks the nbdkit
> tests on FreeBSD so I am keen to fix it one way or another.
> 
> > And if optreset not being available for glibc is the only issue, I'd say
> > adding it as a weak global variable would work without #ifdefs.
> 
> The weak global variable doesn't make the code "#ifdef free".  I tried
> a patch like this:
> 
> +int optreset __attribute__((weak));
> 
> ...
> 
>  static int command(...)
>  {
>    ...
>    optind = 0;
> +  optreset = 1;
>   ...
>  }
> 
> but that still doesn't work on FreeBSD.
> 
> You have to set optind=1 apparently.  So if we want to set optreset=1
> we still end up with #ifdef __FreeBSD__.  The final patch will
> end up looking something like:
> 
>  static int command(...)
>  {
>    ...
> +#ifdef __FreeBSD__
> +  optind = 1;
> +  optreset = 1;
> +#else
>    optind = 0;
> +#endif
>   ...
>  }

Unconditionally setting optind = 1 looks fine. I would, however, quote a
different part of the glibc man page (in addition or instead of the
paragraph you already quoted):

    The  variable  optind is the index of the next element to be
    processed in argv.  The system initializes this value to 1.  The
    caller can reset it to 1 to restart scanning of the same argv, or
    when scanning a new argument vector.

This makes it pretty clear that optind = 1 is fine for our case with
glibc. The FreeBSD man page still suggests that we need optreset = 1, so
I suppose we'd end up with something like:

...
optind = 1;
#ifdef __FreeBSD__
optreset = 1;
#endif
...

I think I slightly prefer the #ifdef to a weak variable, but that's
another option.

Kevin



reply via email to

[Prev in Thread] Current Thread [Next in Thread]