Package: glibc
Severity: normal

On sid with libc 2.3.5-13 the getopt man page states: 

  Two colons mean an option takes an optional arg; if there is text in
  the current argv-element, it is returned in optarg, otherwise optarg
  is set to zero. This is a GNU extension. 

However, this does not seem to be the case. 

tst1.c
-------------------------------------
int
main (int argc, char **argv)
{
        int a = 0;
        int opt;

        opterr = 0;

        while ((opt = getopt (argc, argv, "a::")) != -1)
                switch (opt)
                {
                        case 'a':
                                a = 1;
                                printf("a arg is: %s\n", optarg);
                                break;
                        default:
                                printf("bad arg\n");
                                exit(1);
                }

        return 0;
}


When run: 

  [EMAIL PROTECTED]:/tmp$ a.out -a
  a arg is: (null)

  [EMAIL PROTECTED]:/tmp$ a.out -a hello
  a arg is: (null)

According to the man page, I would expect to see the second example to
output hello. 

I have been able to get it to work like one would expect, by using
argv[optind] instead of optarg, i.e.: 

  printf("a arg is: %s\n", argv[optind]);

When run with the change:

  [EMAIL PROTECTED]:/tmp$ a.out -a
  a arg is: (null) 

  [EMAIL PROTECTED]:/tmp$ a.out -a hello
  a arg is: hello

This behavior is  specifically different that what's documented in the
man page, and in /usr/include/getopt.h. Both say the argv-element
should be in optarg not in argv. I have also compiling using
-std=gnu9x to ensure that I'm getting all of the GNU extensions, with
the same results.

Thanks, 

Troy

Attachment: pgpy5pMwmBYE7.pgp
Description: PGP signature

Reply via email to