[systemd-devel] [PATCH 1/2]add parameters checking for 'udevadm settle'

YangZhiyong yangzy.fnst at cn.fujitsu.com
Sun Nov 3 03:23:22 PST 2013



> -----Original Message-----
> From: Zbigniew Jędrzejewski-Szmek [mailto:zbyszek at in.waw.pl]
> Sent: Tuesday, October 29, 2013 9:38 PM
> To: YangZhiyong
> Cc: systemd-devel at lists.freedesktop.org; kay at vrfy.org
> Subject: Re: [systemd-devel] [PATCH 1/2]add parameters checking for
> 'udevadm settle'
> 
> On Tue, Oct 29, 2013 at 01:34:33PM +0800, YangZhiyong wrote:
> >
> >
> > > -----Original Message-----
> > > From: YangZhiyong [mailto:yangzy.fnst at cn.fujitsu.com]
> > > Sent: Tuesday, October 29, 2013 11:33 AM
> > > To: 'Zbigniew Jędrzejewski-Szmek'
> > > Cc: systemd-devel at lists.freedesktop.org; kay at vrfy.org; fnst-
> > > driver at cn.fujitsu.com
> > > Subject: 答复: [systemd-devel] [PATCH 1/2]add parameters checking for
> > > 'udevadm settle'
> > >
> > >
> > >
> > > > ----- Original Message -----
> > > > From: Zbigniew Jędrzejewski-Szmek [mailto:zbyszek at in.waw.pl]
> > > > Sent: October 27, 2013 3:29 PM
> > > > To: Yang Zhiyong
> > > > Cc: systemd-devel at lists.freedesktop.org; kay at vrfy.org
> > > > Subject: Re: [systemd-devel] [PATCH 1/2]add parameters checking
> > > > for 'udevadm settle'
> > > >
> > > > On Wed, Oct 23, 2013 at 03:09:36PM +0800, Yang Zhiyong wrote:
> > > > > This patch adds parameters checking for 'udevadm settle'
> > > > > Signed-off-by: Yang Zhiyong <yangzy.fnst at cn.fujitsu.com>
> > > > > ---
> > > > >  src/udev/udevadm-settle.c |   15 ++++++++++++---
> > > > >  1 files changed, 12 insertions(+), 3 deletions(-)  mode change
> > > > > 100644 => 100755 src/udev/udevadm-settle.c
> > > > >
> > > > > diff --git a/src/udev/udevadm-settle.c
> > > > > b/src/udev/udevadm-settle.c old mode 100644 new mode 100755
> > > > > index c4fc4ee..cacc7e3
> > > > > --- a/src/udev/udevadm-settle.c
> > > > > +++ b/src/udev/udevadm-settle.c
> > > > > @@ -62,8 +62,13 @@ static int adm_settle(struct udev *udev, int
> > > > > argc, char
> > > > *argv[])
> > > > >                  int seconds;
> > > > >
> > > > >                  option = getopt_long(argc, argv, "s:e:t:E:qh",
> > > > > options,
> > > > NULL);
> > > > > -                if (option == -1)
> > > > > +                if (option == -1) {
> > > > > +                        if (optind < argc) {
> > > > > +                                fprintf(stderr, "unknown option\n");
> > > > > +                                exit(EXIT_FAILURE);
> > > > > +                        }
> > > > >                          break;
> > > > > +                }
> > > > I don't think that getopt_long will return -1 for an unknown option.
> > > > According to the manpage, -1 mean that all command-line options
> > > > have
> > > been parsed.
> > >
> > > I'm very sure that getopt_long() will return -1 when we use an
> > > unknown option such as " udevadm settle bjjkhgjk" by using "
> > > printf("option=%d\n",option);" in the code.
> > >
> > If we use " udevadm  settle  --bjjkhgjk"(add "--")the  that getopt_long() will
> return "?" as the manpage said, and print error info.
> > But if lacking"--", getopt_long() will treat " bjjkhgjk "as parameter  instead
> of option .
> > Because of this , getopt_long() returns -1 and does not print any error info.
> > By the way,some other source code also uses  the same  method to
> process the more rigorous parameter checking.
> 
> Yes! So your code is fine, but please don't say "unknown option", but rather
> "Extraneous argument: %s" or something like that.
> 
> > > > >                  switch (option) {
> > > > >                  case 's':
> > > > > @@ -74,10 +79,14 @@ static int adm_settle(struct udev *udev, int
> > > > > argc,
> > > > char *argv[])
> > > > >                          break;
> > > > >                  case 't':
> > > > >                          seconds = atoi(optarg);
> > > > > -                        if (seconds >= 0)
> > > > > +                        if (seconds > 0)
> > > > >                                  timeout = seconds;
> > > > > -                        else
> > > > > +                        else if (seconds == 0 && !strcmp(optarg,"0"))
> > > > > +                                timeout = seconds;
> > > > > +                        else {
> > > > >                                  fprintf(stderr, "invalid
> > > > > timeout value\n");
> > > > > +                                exit(EXIT_FAILURE);
> > > > > +                        }
> > > > >                          break;
> > > > >                  case 'q':
> > > > >                          quiet = 1;
> > > > This looks legitimate, but please use safe_atou().
> > >
> > > You mean using safe_atoi() ?
> No, atou, because the timeout must be non-negative.
> 
> > Because the type of "seconds" is "int".
> >

If we use atou,GCC will print "WARNING  ./src/shared/util.h:136:5: note: expected ‘unsigned int *’ but argument is of type ‘int *’ "
because the function prototype of safe_atoi  is " int safe_atou(const char *s, unsigned *ret_u); ".

> > > Shall I write like this:
> > case 't':
> >	if (safe_atoi(optarg,&seconds) < 0){
> >		fprintf(stderr, "invalid timeout value\n");
> > 		exit(EXIT_FAILURE);
> >	}
> >	break;
> The error message can be improved:
> 
>         int r;
> 
> 	r = safe_atou(optarg, &seconds);
> 	if (r < 0) {
I think I should modify 2 lines of code above  like this:
                r = safe_atoi(optarg,&seconds);
                if (r < 0 || seconds < 0) {
And I have test it successfully.

Yang Zhiyong
> 		fprintf(stderr, "Invalid timeout value '%s': %s\n",
> 		        optarg, strerror(-r));
>  		exit(EXIT_FAILURE);
> 	}
> 	break;
> 
> (Notice the extra whitespace at various points. And please ident with spaces)
> 
> Zbyszek




More information about the systemd-devel mailing list