eal/windows: use bundled getopt with MinGW
authorDmitry Kozlyuk <dmitry.kozliuk@gmail.com>
Thu, 24 Sep 2020 23:17:07 +0000 (02:17 +0300)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 5 Oct 2020 07:12:24 +0000 (09:12 +0200)
Clang builds use getopt.c in librte_eal while MinGW provides
implementation as part of the toolchain. Statically linking librte_eal
to an application that depends on getopt results in undefined reference
errors with MinGW. There are no such errors with Clang, because with
Clang librte_eal actually defines getopt functions.

Use getopt.c in EAL with Clang and MinGW to get identical behavior.
Adjust code for MinGW. Incidentally, this removes a bug when free() is
called on uninitialized memory.

Fixes: 5e373e456e6 ("eal/windows: add getopt implementation")
Cc: stable@dpdk.org
Reported-by: Khoa To <khot@microsoft.com>
Reported-by: Tal Shnaiderman <talshn@nvidia.com>
Signed-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
Acked-by: Khoa To <khot@microsoft.com>
Acked-by: Pallavi Kadam <pallavi.kadam@intel.com>
lib/librte_eal/meson.build
lib/librte_eal/windows/getopt.c

index 8d49289..7d6222e 100644 (file)
@@ -25,6 +25,3 @@ endif
 if cc.has_function('getentropy', prefix : '#include <unistd.h>')
        cflags += '-DRTE_LIBEAL_USE_GETENTROPY'
 endif
-if cc.has_header('getopt.h')
-       cflags += ['-DHAVE_GETOPT_H', '-DHAVE_GETOPT', '-DHAVE_GETOPT_LONG']
-endif
index a08f7c1..a1f51c6 100644 (file)
@@ -242,7 +242,6 @@ getopt_internal(int nargc, char **nargv, const char *options,
        char *oli;                              /* option letter list index */
        int optchar, short_too;
        static int posixly_correct = -1;
-       char *buf;
        size_t len;
        int optreset = 0;
 
@@ -253,16 +252,16 @@ getopt_internal(int nargc, char **nargv, const char *options,
         * Disable GNU extensions if POSIXLY_CORRECT is set or options
         * string begins with a '+'.
         */
-       if (posixly_correct == -1)
-               posixly_correct = _dupenv_s(&buf, &len, "POSIXLY_CORRECT");
+       if (posixly_correct == -1) {
+               errno_t err = _wgetenv_s(&len, NULL, 0, L"POSIXLY_CORRECT");
+               posixly_correct = (err == 0) && (len > 0);
+       }
        if (!posixly_correct || *options == '+')
                flags &= ~FLAG_PERMUTE;
        else if (*options == '-')
                flags |= FLAG_ALLARGS;
        if (*options == '+' || *options == '-')
                options++;
-       if (!posixly_correct)
-               free(buf);
        /*
         * reset if requested
         */