On Tue, Oct 29, 2013 at 01:34:33PM +0800, YangZhiyong wrote:
> 
> 
> > -----Original Message-----
> > From: YangZhiyong [mailto:[email protected]]
> > Sent: Tuesday, October 29, 2013 11:33 AM
> > To: 'Zbigniew Jędrzejewski-Szmek'
> > Cc: [email protected]; [email protected]; fnst-
> > [email protected]
> > Subject: 答复: [systemd-devel] [PATCH 1/2]add parameters checking for
> > 'udevadm settle'
> > 
> > 
> > 
> > > ----- Original Message -----
> > > From: Zbigniew Jędrzejewski-Szmek [mailto:[email protected]]
> > > Sent: October 27, 2013 3:29 PM
> > > To: Yang Zhiyong
> > > Cc: [email protected]; [email protected]
> > > 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 <[email protected]>
> > > > ---
> > > >  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".
> 
> > 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) {
                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
_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to