On Jan 13 00:49, Dan Tsafrir wrote: > Hi, > > When given certain long options, Cygwin's getopt_long() function > erroneously fails on "ambiguous option". The short program below > illustrates the problem: getopt_long() wrongfully reports the "--xy" > option as ambiguous. > > Strangely, if flipping the order of the 2nd and 3rd entries in the > options-array (by compiling the program with -DNO_BUG) the bug goes > away, clearly demonstrating inconsistent Cygwin/getopt_long behavior. > [...] > #include <stdio.h> > #include <getopt.h> > > const struct option lopts[] = { > #ifdef NO_BUG > {"xy1" , required_argument, NULL, 'a' }, > {"xy" , required_argument, NULL, 'b' }, > {"xy2" , required_argument, NULL, 'c' }, > {NULL , 0 , NULL, 0 }, > #else /* swapping order of 2nd and 3rd entries generates the bug */ > {"xy1" , required_argument, NULL, 'a' }, > {"xy2" , required_argument, NULL, 'c' }, > {"xy" , required_argument, NULL, 'b' }, > {NULL , 0 , NULL, 0 }, > #endif > }; > > int main() > { > const char* argv[] = {"./a", "--xy=1", NULL}; > int argc = 2; > int index, c; > > // if NO_BUG defined, will print: "got opt=b" [OK] > // otherwise: "a: ambiguous option -- xy" [BUG] > if( (c = getopt_long(argc, (char**)argv, "A:B:C", lopts, &index)) != EOF ) > printf("got opt=%c\n", c); > > return 0; > }
This appears to be a bug in the upstream version of getopt we're using in Cygwin, which is the latest version from OpenBSD. I'm looking into creating a patch for Cygwin 1.7. Thanks for the report, Corinna -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Project Co-Leader cygwin AT cygwin DOT com Red Hat -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/