]> git.ipfire.org Git - thirdparty/krb5.git/commit
Fix option parsing on Windows
authorGreg Hudson <ghudson@mit.edu>
Wed, 16 May 2018 04:52:08 +0000 (21:52 -0700)
committerGreg Hudson <ghudson@mit.edu>
Mon, 29 Oct 2018 16:42:36 +0000 (12:42 -0400)
commit8b8cad8b9ff92e2a2d344fc7c4d77277c9c09829
treec0ba69ba602b66540bf85e61c3124253930ce6a0
parent387d5d333e82b3b0858c48d5f7c541ef122e36b6
Fix option parsing on Windows

Commit 8f9ade8ec50cde1176411085294f85ecfb2820a4 (ticket 8391) moved
the built-in getopt() and getopt_long() implementations from a static
library in util/windows to util/support, where (on Windows) it is
built into k5sprt32.dll or k5sprt64.dll.  The getopt() interface uses
global variables opterr, optind, optopt, and optarg, each renamed via
macro to have a k5_ prefix when we use the built-in implementation.
Data objects exported from DLLs need special handling in Windows; they
must be marked as DATA in the DLL .def file, and they must be declared
with "__declspec(dllimport)" in calling code.  Without this handling,
optind begins with a garbage value and getopt_long() returns -1
immediately, so client programs always behave as if they have no
arguments.

Stop unnecessarily declaring optind and optarg in client programs.
Declare the getopt() global variables with __declspec(dllimport) on
Windows, except when compiling getopt.c itself.  When creating
libkrb5support.exports on Windows (this file is later used by
lib/Makefile.in to create k5sprt32.def), add a DATA tag to the data
objects.

(cherry picked from commit 63246cf3513a0e8bdfc734db985af14c8c5170c5)

ticket: 8684
version_fixed: 1.15.4
src/clients/kdestroy/kdestroy.c
src/clients/klist/klist.c
src/clients/kswitch/kswitch.c
src/clients/kvno/kvno.c
src/include/k5-platform.h
src/util/support/Makefile.in
src/util/support/getopt.c