tech-toolchain archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

MacOS and tools and getopt



I've found a problem where getopt() on the MacOS tools version of
mdsetimage doesn't work, and I'm not sure what the fix should be.

Using the attached program below:

        mini:/tmp 74% cc -O2 -o foo foo.c
        mini:/tmp 75% ./foo -v 2 3 
        argc = 4, optind = 1
          got opt v
        argc = 2, optind = 2
   (yay! correct)
        mini:/tmp 76% cc -O2 -o foo foo.c 
/Users/simonb/netbsd/build/i386/obj/tools/binutils/build/libiberty/getopt.o
        mini:/tmp 77% ./foo -v 2 3
        argc = 4, optind = 1
          got opt v
        argc = 3, optind = 1
   (boo hiss evil)

What appears to be happening is that as soon as we include either of:

        /usr/include/getopt.h
        /usr/include/unistd.h

we pull in this line:

        int      getopt(int, char * const [], const char *) 
__DARWIN_ALIAS(getopt);

which gives us a symbol renamed getopt().  Then the MacOS libc getopt()
and the libiberty getopt() seem to get all confused and optind comes out
a mess.

One "fix" is to not use libiberty's getopt on Macos.  I'm not yet sure
how to do that.

Another somewhat hacky (but easy!) fix is to just not include the -v
in the mdsetimage commandline.  If getopt does no work, nothing needs
adjusting and then the mdsetimage just works.

Any suggestions?

Cheers,
Simon.
--

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main(int argc, char **argv)
{
        int ch;

        printf("argc = %d, optind = %d\n", argc, optind);

        while ((ch = getopt(argc, argv, "v")) != -1) {
                printf("  got opt %c\n", ch);
        }

        argc -= optind;
        argv += optind;

        printf("argc = %d, optind = %d\n", argc, optind);

        exit(0);
}



Home | Main Index | Thread Index | Old Index