All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tiwei Bie <btw@mail.ustc.edu.cn>
To: Bruce Richardson <bruce.richardson@intel.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>, Don Provan <dprovan@bivio.net>
Subject: Re: [PATCH] eal/bsd: reinitialize optind and optreset to 1
Date: Wed, 14 Oct 2015 19:28:13 +0800	[thread overview]
Message-ID: <20151014112813.GA1514@dell> (raw)
In-Reply-To: <20151014101933.GB68200@dell>

On Wed, Oct 14, 2015 at 06:19:33PM +0800, Tiwei Bie wrote:
> On Wed, Oct 14, 2015 at 10:31:28AM +0100, Bruce Richardson wrote:
> > On Wed, Oct 14, 2015 at 10:28:44AM +0800, Tiwei Bie wrote:
> > > On Tue, Oct 13, 2015 at 05:14:38PM +0000, Don Provan wrote:
> > > > Actually, this is a good opportunity to fix a bug that's been in this code forever: it shouldn't be resetting optind to some arbitrary value: it should be saving optind (and optarg and optopt) at the beginning, initializing optind to 1 before calling getopt_long(), then restoring all the values after. (And, from what you're saying, optreset should be handled the same as optind.)
> > > > 
> > > 
> > > It is designed to have DPDK's parameters specified in the front of the
> > > cmd line and terminated by '--'. Or at least, you should put DPDK's
> > > parameters together and terminate them by '--'. And 1 or 0 are not some
> > > arbitrary values. They are used to put the index back to the beginning
> > > of the new argv[] array.
> > > 
> > > > This avoids broken behavior if rte_eal_init() is called by code that's in the middle of using getopt() to parse its own unrelated argc/argv parameters. 
> > > > 
> > > 
> > > We shouldn't mix up DPDK's parameters and application's parameters.
> > > And we should group them using '--'.
> > > 
> > > Best,
> > > Tiwei Bie
> > 
> > While true, that does not prevent us from implementing Don's suggestion, as it
> > should fix the bug you are looking at with your original patch, and also allow
> > additional use-cases for applications at no extra cost.
> > 
> 
> As I understand it, what Don wants is something like this:
> 
> int main(int argc, char **argv)
> {
> 	int ret;
> 	int ch;
> 
> 	while ((ch = getopt(argc, argv, "whateveroptions:d")) != -1) {
> 		switch (ch) {
> 		case 'd':
> 			/* rte_eal_init() will be called */
> 			ret = dpdk_init(argc, argv);
> 			argc -= ret;
> 			argv += ret;
> 			break;
> 		case 'w':
> 			......
> 		}
> 	}
> 
> 	argc -= optind;
> 	argv += optind;
> 
> 	......
> }
> 
> static int
> dpdk_init(int argc, char **argv)
> {
> 	int ret;
> 
> 	ret = rte_eal_init(argc, argv);
> 	if (ret < 0)
> 		FATAL_ERROR("Could not initialise EAL (%d)", ret);
> 
> 	......
> 
> 	return (ret);
> }
> 
> And the current code should work correctly if DPDK's parameters are
> put together and terminated by '--':
> 
> $ ./demo -whatever -d -c f -n 2 -- -option -s hello
> 

eal_log_level_parse() needs to be reworked to make the code work correctly.

> The only limitation is that the return value of rte_eal_init() must
> be returned to the code which is using getopt() to parse argc/argv.
> 
> And I'm very willing to rework my patch to get rid of this limitation.
> 

I'm considering updating optind to make it point to the option after
'--' before eal_parse_args() returns, and eal_parse_args() will return
0 to avoid breaking the current applications which use the return value
of rte_eal_init() to update argc/argv.

Any comments? Thanks! :-)

Best regards,
Tiwei Bie

> Best regards,
> Tiwei Bie
> 
> > /Bruce
> > 
> > > 
> > > > -don provan
> > > > dprovan@bivio.net
> > > > 
> > > > -----Original Message-----
> > > > From: Tiwei Bie [mailto:btw@mail.ustc.edu.cn] 
> > > > Sent: Tuesday, October 13, 2015 1:54 AM
> > > > To: dev@dpdk.org
> > > > Subject: [dpdk-dev] [PATCH] eal/bsd: reinitialize optind and optreset to 1
> > > > 
> > > > The variable optind must be reinitialized to 1 in order to skip over argv[0] on FreeBSD. Because getopt() on FreeBSD will return -1 when it meets an argument which doesn't start with '-'.
> > > > 
> > > > The variable optreset is provided on FreeBSD to indicate the additional set of calls to getopt(). So, also reinitialize it to 1.
> > > > 
> > > > Signed-off-by: Tiwei Bie <btw@mail.ustc.edu.cn>
> > > > ---
> > > >  lib/librte_eal/bsdapp/eal/eal.c | 6 ++++--
> > > >  1 file changed, 4 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/lib/librte_eal/bsdapp/eal/eal.c b/lib/librte_eal/bsdapp/eal/eal.c index 1b6f705..35feaee 100644
> > > > --- a/lib/librte_eal/bsdapp/eal/eal.c
> > > > +++ b/lib/librte_eal/bsdapp/eal/eal.c
> > > > @@ -334,7 +334,8 @@ eal_log_level_parse(int argc, char **argv)
> > > >  			break;
> > > >  	}
> > > >  
> > > > -	optind = 0; /* reset getopt lib */
> > > > +	optind = 1; /* reset getopt lib */
> > > > +	optreset = 1;
> > > >  }
> > > >  
> > > >  /* Parse the argument given in the command line of the application */ @@ -403,7 +404,8 @@ eal_parse_args(int argc, char **argv)
> > > >  	if (optind >= 0)
> > > >  		argv[optind-1] = prgname;
> > > >  	ret = optind-1;
> > > > -	optind = 0; /* reset getopt lib */
> > > > +	optind = 1; /* reset getopt lib */
> > > > +	optreset = 1;
> > > >  	return ret;
> > > >  }
> > > >  
> > > > --
> > > > 2.6.0
> > > > 
> > > > 
> > > > 
> > > 

  reply	other threads:[~2015-10-14 11:28 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-13  8:54 [PATCH] Found a bug related to getopt() in eal/bsd module Tiwei Bie
2015-10-13  8:54 ` [PATCH] eal/bsd: reinitialize optind and optreset to 1 Tiwei Bie
2015-10-13 14:58   ` Bruce Richardson
2015-10-13 17:14   ` Don Provan
2015-10-14  2:28     ` Tiwei Bie
2015-10-14  9:31       ` Bruce Richardson
2015-10-14 10:19         ` Tiwei Bie
2015-10-14 11:28           ` Tiwei Bie [this message]
2015-10-14 17:54             ` Don Provan
2015-10-15  1:40               ` Tiwei Bie

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=20151014112813.GA1514@dell \
    --to=btw@mail.ustc.edu.cn \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=dprovan@bivio.net \
    /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.