[v22,2/9] posix: let the getopt caller set the translation context
Checks
| Context |
Check |
Description |
| redhat-pt-bot/TryBot-apply_patch |
success
|
Patch applied to master at the time it was sent
|
| redhat-pt-bot/TryBot-still_applies |
warning
|
Patch no longer applies to master
|
Commit Message
Option names are typically one word, so they could be translated
differently in different parts of the program. The use of a context
lets the translator pick the most appropriate translation when used in
the command-line.
Another possibility would be to prepend two dashes to the option name
before translation, such that it would be obvious this is the
command-line option name. However, it would be difficult to mark this
string for translation (to be processed by xgettext).
This patch creates a new global variable / reentrant state field,
optctxt, a pointer, so that the caller can override it. If it is not
set, or set to NULL, then no translated option name will be
recognized. To avoid exporting global variables, a couple of
functions have been added to set it.
pgettext_expr is not available yet, so we use a custom function to
combine the context and the long option name, and discard the context
if no translation was performed.
---
NEWS | 5 ++
manual/getopt.texi | 41 +++++++---
posix/Versions | 4 +
posix/bits/getopt_ext.h | 3 +
posix/getopt.c | 47 ++++++++----
posix/getopt1.c | 74 ++++++++++++++++++-
posix/getopt_int.h | 8 +-
posix/tstgetoptl.c | 38 ++++++++--
posix/tstgetoptl.po | 3 +
sysdeps/mach/hurd/i386/libc.abilist | 2 +
sysdeps/mach/hurd/x86_64/libc.abilist | 2 +
sysdeps/unix/sysv/linux/aarch64/libc.abilist | 2 +
sysdeps/unix/sysv/linux/alpha/libc.abilist | 2 +
sysdeps/unix/sysv/linux/arc/libc.abilist | 2 +
sysdeps/unix/sysv/linux/arm/be/libc.abilist | 2 +
sysdeps/unix/sysv/linux/arm/le/libc.abilist | 2 +
sysdeps/unix/sysv/linux/csky/libc.abilist | 2 +
sysdeps/unix/sysv/linux/hppa/libc.abilist | 2 +
sysdeps/unix/sysv/linux/i386/libc.abilist | 2 +
.../sysv/linux/loongarch/ilp32/libc.abilist | 2 +
.../sysv/linux/loongarch/lp64/libc.abilist | 2 +
.../sysv/linux/m68k/coldfire/libc.abilist | 2 +
.../unix/sysv/linux/m68k/m680x0/libc.abilist | 2 +
.../sysv/linux/microblaze/be/libc.abilist | 2 +
.../sysv/linux/microblaze/le/libc.abilist | 2 +
.../sysv/linux/mips/mips32/fpu/libc.abilist | 2 +
.../sysv/linux/mips/mips32/nofpu/libc.abilist | 2 +
.../sysv/linux/mips/mips64/n32/libc.abilist | 2 +
.../sysv/linux/mips/mips64/n64/libc.abilist | 2 +
sysdeps/unix/sysv/linux/or1k/libc.abilist | 2 +
.../linux/powerpc/powerpc32/fpu/libc.abilist | 2 +
.../powerpc/powerpc32/nofpu/libc.abilist | 2 +
.../linux/powerpc/powerpc64/be/libc.abilist | 2 +
.../linux/powerpc/powerpc64/le/libc.abilist | 2 +
.../unix/sysv/linux/riscv/rv32/libc.abilist | 2 +
.../unix/sysv/linux/riscv/rv64/libc.abilist | 2 +
sysdeps/unix/sysv/linux/s390/libc.abilist | 2 +
sysdeps/unix/sysv/linux/sh/be/libc.abilist | 2 +
sysdeps/unix/sysv/linux/sh/le/libc.abilist | 2 +
.../sysv/linux/sparc/sparc32/libc.abilist | 2 +
.../sysv/linux/sparc/sparc64/libc.abilist | 2 +
.../unix/sysv/linux/x86_64/64/libc.abilist | 2 +
.../unix/sysv/linux/x86_64/x32/libc.abilist | 2 +
43 files changed, 253 insertions(+), 38 deletions(-)
Comments
On 23/04/26 13:04, Vivien Kraus wrote:
> Option names are typically one word, so they could be translated
> differently in different parts of the program. The use of a context
> lets the translator pick the most appropriate translation when used in
> the command-line.
>
> Another possibility would be to prepend two dashes to the option name
> before translation, such that it would be obvious this is the
> command-line option name. However, it would be difficult to mark this
> string for translation (to be processed by xgettext).
>
> This patch creates a new global variable / reentrant state field,
> optctxt, a pointer, so that the caller can override it. If it is not
> set, or set to NULL, then no translated option name will be
> recognized. To avoid exporting global variables, a couple of
> functions have been added to set it.
>
> pgettext_expr is not available yet, so we use a custom function to
> combine the context and the long option name, and discard the context
> if no translation was performed.
> ---
> NEWS | 5 ++
> manual/getopt.texi | 41 +++++++---
> posix/Versions | 4 +
> posix/bits/getopt_ext.h | 3 +
> posix/getopt.c | 47 ++++++++----
> posix/getopt1.c | 74 ++++++++++++++++++-
> posix/getopt_int.h | 8 +-
> posix/tstgetoptl.c | 38 ++++++++--
> posix/tstgetoptl.po | 3 +
> sysdeps/mach/hurd/i386/libc.abilist | 2 +
> sysdeps/mach/hurd/x86_64/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/aarch64/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/alpha/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/arc/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/arm/be/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/arm/le/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/csky/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/hppa/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/i386/libc.abilist | 2 +
> .../sysv/linux/loongarch/ilp32/libc.abilist | 2 +
> .../sysv/linux/loongarch/lp64/libc.abilist | 2 +
> .../sysv/linux/m68k/coldfire/libc.abilist | 2 +
> .../unix/sysv/linux/m68k/m680x0/libc.abilist | 2 +
> .../sysv/linux/microblaze/be/libc.abilist | 2 +
> .../sysv/linux/microblaze/le/libc.abilist | 2 +
> .../sysv/linux/mips/mips32/fpu/libc.abilist | 2 +
> .../sysv/linux/mips/mips32/nofpu/libc.abilist | 2 +
> .../sysv/linux/mips/mips64/n32/libc.abilist | 2 +
> .../sysv/linux/mips/mips64/n64/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/or1k/libc.abilist | 2 +
> .../linux/powerpc/powerpc32/fpu/libc.abilist | 2 +
> .../powerpc/powerpc32/nofpu/libc.abilist | 2 +
> .../linux/powerpc/powerpc64/be/libc.abilist | 2 +
> .../linux/powerpc/powerpc64/le/libc.abilist | 2 +
> .../unix/sysv/linux/riscv/rv32/libc.abilist | 2 +
> .../unix/sysv/linux/riscv/rv64/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/s390/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/sh/be/libc.abilist | 2 +
> sysdeps/unix/sysv/linux/sh/le/libc.abilist | 2 +
> .../sysv/linux/sparc/sparc32/libc.abilist | 2 +
> .../sysv/linux/sparc/sparc64/libc.abilist | 2 +
> .../unix/sysv/linux/x86_64/64/libc.abilist | 2 +
> .../unix/sysv/linux/x86_64/x32/libc.abilist | 2 +
> 43 files changed, 253 insertions(+), 38 deletions(-)
>
> diff --git a/NEWS b/NEWS
> index 4e53a079e9..48f7589f49 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -19,6 +19,11 @@ Major new features:
> * New locale added: hrx_BR (Hunsrik language spoken in Brazil).
>
> * The getopt_long function now accepts translated long option names.
> + This functionality is enabled or disabled by calling
> + getopt_long_enable_translations / getopt_long_disable_translations.
Isn't this new functionality only implemented in the next patch?
> +
> +* Argp parsers enable translated long option names with "command-line
> + option" as the message context.
>
> Deprecated and removed features, and other changes affecting compatibility:
>
> diff --git a/manual/getopt.texi b/manual/getopt.texi
> index 5ae22a1595..fe45ae55a3 100644
> --- a/manual/getopt.texi
> +++ b/manual/getopt.texi
> @@ -202,15 +202,6 @@ declared in @file{getopt.h}, not @file{unistd.h}. You should make every
> program accept long options if it uses any options, for this takes
> little extra work and helps beginners remember how to use the program.
>
> -Both long option names and their translations provided by the program
> -for the user's current locale are recognized. This helps users of
> -your program who do not speak English understand the meaning of the
> -options, and it does not break the function of the program in scripts
> -if the untranslated option names are used. If international
> -communication involves the invocation of your program, the program
> -users should be encouraged to use untranslated option names or publish
> -the locale used for this invocation.
> -
> @deftp {Data Type} {struct option}
> @standards{GNU, getopt.h}
> This structure describes a single long option name for the sake of
> @@ -224,7 +215,8 @@ The @code{struct option} structure has these fields:
> @item const char *name
> This field is the name of the option. It is a string. In order for
> @command{getopt_long} to accept either the long option name or its
> -translated form, you should mark this string for translation.
> +translated form, you should mark this string for translation with a
> +translation context, and call @code{getopt_long_enable_translations}.
>
> @item int has_arg
> This field says whether the option takes an argument. It is an integer,
> @@ -246,6 +238,35 @@ was seen.
> @end table
> @end deftp
>
> +@deftypefun int getopt_long_enable_translations (const char *@var{msgctxt})
> +@deftypefunx void getopt_long_disable_translations (void)
> +@standards{GNU, getopt.h}
> +@c FIXME: I copied that from getopt_long, but I don't understand
> +@c it. getopt_long_*able_translations use malloc/free and modifies
> +@c global state.
> +@safety{@prelim{}@mtunsafe{@mtasurace{:getopt} @mtsenv{}}@asunsafe{@ascuheap{} @ascuintl{} @asulock{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}}
> +If long option translations are enabled, then both long option names
> +and their translations provided by the program for the user's current
> +locale are recognized. This helps users of your program who do not
> +speak English understand the meaning of the options, without breaking
> +the function of the program in scripts if the untranslated option
> +names are used. If international communication involves the
> +invocation of your program, the program users should be encouraged to
> +use untranslated option names or publish the locale used for this
> +invocation.
> +
> +Since option names may be short words instead of long sentences, they
> +may have different translations in different contexts within the same
> +program. @xref{Contexts, , Using contexts for solving ambiguities,
> +gettext, the GNU Gettext manual}, for more information. @var{msgctxt}
> +should be a non-NULL string to disambiguate option name translations.
> +Passing NULL, or calling @code{getopt_long_disable_translations()},
> +will disable option name translation.
> +
> +@code{getopt_long_enable_translations} returns 0 on success, or -1 and
> +sets errno.
> +@end deftypefun
> +
> @deftypefun int getopt_long (int @var{argc}, char *const *@var{argv}, const char *@var{shortopts}, const struct option *@var{longopts}, int *@var{indexptr})
> @standards{GNU, getopt.h}
> @safety{@prelim{}@mtunsafe{@mtasurace{:getopt} @mtsenv{}}@asunsafe{@ascuheap{} @ascuintl{} @asulock{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}}
> diff --git a/posix/Versions b/posix/Versions
> index 0624d24bcc..10ca3b7ea3 100644
> --- a/posix/Versions
> +++ b/posix/Versions
> @@ -159,6 +159,10 @@ libc {
> GLIBC_2.35 {
> posix_spawn_file_actions_addtcsetpgrp_np;
> }
> + GLIBC_2.44 {
> + getopt_long_enable_translations;
> + getopt_long_disable_translations;
> + }
This needs to be update to 2.45, along with the abilist and the NEWS file.
> GLIBC_PRIVATE {
> __libc_fork; __libc_pread; __libc_pwrite;
> __nanosleep_nocancel; __pause_nocancel;
> diff --git a/posix/bits/getopt_ext.h b/posix/bits/getopt_ext.h
> index 94ca758fcd..8f065bbe9f 100644
> --- a/posix/bits/getopt_ext.h
> +++ b/posix/bits/getopt_ext.h
> @@ -71,6 +71,9 @@ extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
> const char *__shortopts,
> const struct option *__longopts, int *__longind)
> __THROW __nonnull ((2, 3));
> +extern int getopt_long_enable_translations (const char *__msgctxt)
> + __attribute_warn_unused_result__;
> +extern void getopt_long_disable_translations (void);
>
> __END_DECLS
>
> diff --git a/posix/getopt.c b/posix/getopt.c
> index cdc02d4da9..6717449b5c 100644
> --- a/posix/getopt.c
> +++ b/posix/getopt.c
> @@ -182,22 +182,30 @@ exchange (char **argv, struct _getopt_data *d)
> d->__last_nonopt = d->optind;
> }
>
> -/* Return true iff a translation for opt_name has been found and it
> - matches the substring from argument, length argument_length.
> +/* Return true iff translation_context is not NULL, a translation for
> + opt_name has been found and it matches the substring from argument,
> + length argument_length.
> */
> static bool
> -match_translated_option_name (char *(*translate) (const char *msgid),
> +match_translated_option_name (char *(*translate) (const char *, const char *,
> + char **),
> const char *argument, size_t argument_length,
> + const char *translation_context,
> const char *opt_name)
> {
> const char *translated = opt_name;
> + char *translation_buffer = NULL;
> + bool matches = false;
> if (translate != NULL)
> - translated = translate (opt_name);
> + translated = translate (translation_context, opt_name, &translation_buffer);
>
> if (strncmp (translated, argument, argument_length) != 0)
> - return false;
> - /* We know that argument is a prefix of translated. */
> - return translated[argument_length] == '\0';
> + matches = false;
> + else
> + /* We know that argument is a prefix of translated. */
> + matches = translated[argument_length] == '\0';
> + free (translation_buffer);
> + return matches;
> }
>
> /* Process the argument starting with d->__nextchar as a long option.
> @@ -213,7 +221,8 @@ process_long_option (int argc, char **argv, const char *optstring,
> const struct option *longopts, int *longind,
> int long_only, struct _getopt_data *d,
> int print_errors, const char *prefix,
> - char *(*translate) (const char *msgid))
> + char *(*translate) (const char *, const char *,
> + char **))
> {
> char *nameend;
> size_t namelen;
> @@ -222,6 +231,7 @@ process_long_option (int argc, char **argv, const char *optstring,
> int n_options;
> int option_index;
> const char *translated_option_name;
> + char *translation_buffer = NULL;
>
> for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
> /* Do nothing. */ ;
> @@ -244,7 +254,9 @@ process_long_option (int argc, char **argv, const char *optstring,
> /* Didn't find an exact match, try with translated option
> names. */
> for (p = longopts, option_index = 0; p->name; p++, option_index++)
> - if (match_translated_option_name (translate, d->__nextchar, namelen, p->name))
> + if (match_translated_option_name (translate,
> + d->__nextchar, namelen,
> + d->optctxt, p->name))
> {
> /* Exact match found with translation. */
> pfound = p;
> @@ -377,7 +389,8 @@ process_long_option (int argc, char **argv, const char *optstring,
> {
> if (print_errors)
> {
> - translated_option_name = translate (pfound->name);
> + translated_option_name = translate (d->optctxt, pfound->name,
> + &translation_buffer);
> if (strcmp (translated_option_name, pfound->name) != 0)
> /* Print both names of the option. */
> fprintf (stderr,
> @@ -389,6 +402,7 @@ process_long_option (int argc, char **argv, const char *optstring,
> fprintf (stderr,
> _("%s: option '%s%s' doesn't allow an argument\n"),
> argv[0], prefix, pfound->name);
> + free (translation_buffer);
> }
> d->optopt = pfound->val;
> return '?';
> @@ -404,7 +418,8 @@ process_long_option (int argc, char **argv, const char *optstring,
> {
> /* Same dichotomy as when the option does not allow an
> argument. */
> - translated_option_name = translate (pfound->name);
> + translated_option_name = translate (d->optctxt, pfound->name,
> + &translation_buffer);
> if (strcmp (translated_option_name, pfound->name) != 0)
> fprintf (stderr,
> _("%s: option '%s%s' / '%s%s' requires an argument\n"),
> @@ -413,6 +428,7 @@ process_long_option (int argc, char **argv, const char *optstring,
> fprintf (stderr,
> _("%s: option '%s%s' requires an argument\n"),
> argv[0], prefix, pfound->name);
> + free (translation_buffer);
> }
>
> d->optopt = pfound->val;
> @@ -526,7 +542,7 @@ int
> _getopt_internal_r (int argc, char **argv, const char *optstring,
> const struct option *longopts, int *longind,
> int long_only, struct _getopt_data *d, int posixly_correct,
> - char *(*translate) (const char *msgid))
> + char *(*translate) (const char *, const char *, char **))
> {
> int print_errors = d->opterr;
>
> @@ -761,12 +777,15 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
> int
> _getopt_internal (int argc, char **argv, const char *optstring,
> const struct option *longopts, int *longind, int long_only,
> - int posixly_correct, char *(*translate) (const char *))
> + int posixly_correct,
> + char *(*translate) (const char *, const char *, char **),
> + const char *ctxt)
> {
> int result;
>
> getopt_data.optind = optind;
> getopt_data.opterr = opterr;
> + getopt_data.optctxt = ctxt;
>
> result = _getopt_internal_r (argc, argv, optstring, longopts,
> longind, long_only, &getopt_data,
> @@ -789,7 +808,7 @@ _getopt_internal (int argc, char **argv, const char *optstring,
> { \
> return _getopt_internal (argc, (char **)argv, optstring, \
> NULL, NULL, 0, POSIXLY_CORRECT, \
> - NULL); \
> + NULL, NULL); \
> }
>
> #ifdef _LIBC
> diff --git a/posix/getopt1.c b/posix/getopt1.c
> index 6342e2d417..87fe067655 100644
> --- a/posix/getopt1.c
> +++ b/posix/getopt1.c
> @@ -26,13 +26,53 @@
>
> #include "getopt.h"
> #include "getopt_int.h"
> +#include <stdlib.h>
> +#include <string.h>
> +#include <stdio.h>
> +#include <assert.h>
> +
> +/* Callers store an optional context to enable option name
> + translation. The argument is allocated. */
> +
> +char *optctxt = NULL;
This should be static.
> +
> +/* FIXME: use pgettext_expr. */
Can't we avoid adding FIXME here?
> +static char *
> +do_translate (const char *context, const char *msgid, char **allocated)
> +{
> + char *full_msgid;
> + const char *translated = msgid;
> + int output_length = 0;
> +
> + *allocated = NULL;
> + if (context != NULL)
> + {
> + output_length = __asprintf (&full_msgid, "%s\004%s", context, msgid);
> + *allocated = full_msgid;
This assigns *allocated *before* checking the __asprintf return.
> + if (output_length >= 0)
> + {
> + translated = __dcgettext (NULL, full_msgid, LC_MESSAGES);
> + if (strcmp (translated, full_msgid) == 0)
> + {
> + /* No translation for this context and message, so drop
> + the context + ^D prefix. */
> + translated = msgid;
> + }
> + }
> + /* Otherwise, if memory allocation failed, then we won’t accept
> + translations. translated remains an alias to msgid. */
> + }
> + else
> + translated = msgid;
> + return (char *) translated;
> +}
>
> int
> getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
> const struct option *long_options, int *opt_index)
> {
> return _getopt_internal (argc, (char **) argv, options, long_options,
> - opt_index, 0, 0, gettext);
> + opt_index, 0, 0, do_translate, optctxt);
> }
>
> int
> @@ -41,7 +81,7 @@ _getopt_long_r (int argc, char **argv, const char *options,
> struct _getopt_data *d)
> {
> return _getopt_internal_r (argc, argv, options, long_options, opt_index,
> - 0, d, 0, gettext);
> + 0, d, 0, do_translate);
> }
>
> /* Like getopt_long, but '-' as well as '--' can indicate a long option.
> @@ -55,7 +95,7 @@ getopt_long_only (int argc, char *__getopt_argv_const *argv,
> const struct option *long_options, int *opt_index)
> {
> return _getopt_internal (argc, (char **) argv, options, long_options,
> - opt_index, 1, 0, gettext);
> + opt_index, 1, 0, do_translate, optctxt);
> }
>
> int
> @@ -64,7 +104,33 @@ _getopt_long_only_r (int argc, char **argv, const char *options,
> struct _getopt_data *d)
> {
> return _getopt_internal_r (argc, argv, options, long_options, opt_index,
> - 1, d, 0, gettext);
> + 1, d, 0, do_translate);
> +}
> +
> +static void
> +disable_translations (void)
> +{
> + free (optctxt);
> + optctxt = NULL;
> +}
> +
> +int
> +getopt_long_enable_translations (const char *msgctxt)
> +{
> + disable_translations ();
> + if (msgctxt != NULL)
> + {
> + optctxt = __strdup (msgctxt);
> + if (optctxt == NULL)
> + return -1;
> + }
> + return 0;
> +}
> +
> +void
> +getopt_long_disable_translations (void)
> +{
> + disable_translations ();
> }
>
>
> diff --git a/posix/getopt_int.h b/posix/getopt_int.h
> index 579233b08c..fcfec242c1 100644
> --- a/posix/getopt_int.h
> +++ b/posix/getopt_int.h
> @@ -29,7 +29,9 @@ extern int _getopt_internal (int ___argc, char **___argv,
> const char *__shortopts,
> const struct option *__longopts, int *__longind,
> int __long_only, int __posixly_correct,
> - char *(*translate) (const char *msgid));
> + char *(*translate) (const char *, const char *,
> + char **),
> + const char *__optctxt);
>
>
> /* Reentrant versions which can handle parsing multiple argument
> @@ -71,6 +73,7 @@ struct _getopt_data
> int opterr;
> int optopt;
> char *optarg;
> + const char *optctxt;
>
> /* Internal members. */
>
> @@ -107,7 +110,8 @@ extern int _getopt_internal_r (int ___argc, char **___argv,
> const struct option *__longopts, int *__longind,
> int __long_only, struct _getopt_data *__data,
> int __posixly_correct,
> - char *(*translate) (const char *msgid));
> + char *(*translate) (const char *, const char *,
> + char **));
>
> extern int _getopt_long_r (int ___argc, char **___argv,
> const char *__shortopts,
> diff --git a/posix/tstgetoptl.c b/posix/tstgetoptl.c
> index afefcf46f5..1e970ad407 100644
> --- a/posix/tstgetoptl.c
> +++ b/posix/tstgetoptl.c
> @@ -39,6 +39,8 @@
> known translation of flavor) without the program recognizing a
> --flavor option. */
>
> +#define TRANSLATION_CONTEXT "command-line option"
> +
> static void
> prepare_localedir (void)
> {
> @@ -47,8 +49,8 @@ prepare_localedir (void)
> TEST_VERIFY_EXIT (bindtextdomain ("tstgetoptl", OBJPFX "domaindir") != NULL);
> TEST_VERIFY_EXIT (textdomain ("tstgetoptl") != NULL);
> /* Check that the catalog is OK: */
> - TEST_COMPARE_STRING (gettext ("color"), "colour");
> - TEST_COMPARE_STRING (gettext ("flavor"), "flavour");
> + TEST_COMPARE_STRING (gettext (TRANSLATION_CONTEXT "\004" "color"), "colour");
> + TEST_COMPARE_STRING (gettext (TRANSLATION_CONTEXT "\004" "flavor"), "flavour");
> }
>
> static char **
> @@ -65,8 +67,9 @@ prepare_argv (int *argc)
> }
>
> static void
> -do_my_test (void)
> +do_my_test (bool with_optctxt)
> {
> + static const char *translation_context = TRANSLATION_CONTEXT;
> int argc;
> char **argv = prepare_argv (&argc);
> static const struct option options[] =
> @@ -87,8 +90,14 @@ do_my_test (void)
> int c;
> bool found_flavor = false;
>
> + if (with_optctxt)
> + TEST_VERIFY_EXIT (getopt_long_enable_translations (translation_context) == 0);
> + else
> + getopt_long_disable_translations ();
> optind = 0;
> fputs ("Reminder that --flavor is not an option of the program.\n", stderr);
> + if (!with_optctxt)
> + fputs ("No optctxt set, so --colour should not be recognized.\n", stderr);
> while ((c = getopt_long (argc, argv, "", options, NULL)) >= 0)
> switch (c)
> {
> @@ -96,8 +105,13 @@ do_my_test (void)
> ++Cflag;
> break;
> case '?':
> - TEST_VERIFY (!found_flavor);
> - found_flavor = true;
> + if (with_optctxt)
> + {
> + TEST_VERIFY (!found_flavor);
> + found_flavor = true;
> + }
> + /* Otherwise, this is OK; --colour should not exist if we did not set
> + optctxt. */
> break;
> default:
> /* This should not happen. */
> @@ -115,11 +129,18 @@ do_my_test (void)
> break;
> }
>
> - TEST_VERIFY (found_flavor);
> + if (with_optctxt)
> + TEST_VERIFY (found_flavor);
>
> printf ("Cflags = %d\n", Cflag);
>
> - TEST_COMPARE (Cflag, 3);
> + if (with_optctxt)
> + TEST_COMPARE (Cflag, 3);
> + else
> + TEST_COMPARE (Cflag, 2);
> +
> + if (with_optctxt)
> + getopt_long_disable_translations ();
>
> for (index = optind; index < argc; index++)
> printf ("Non-option argument %s\n", argv[index]);
> @@ -131,7 +152,8 @@ int
> do_test (void)
> {
> prepare_localedir ();
> - do_my_test ();
> + do_my_test (false);
> + do_my_test (true);
> return 0;
> }
>
> diff --git a/posix/tstgetoptl.po b/posix/tstgetoptl.po
> index 7091884faf..7dc15e71f3 100644
> --- a/posix/tstgetoptl.po
> +++ b/posix/tstgetoptl.po
> @@ -16,14 +16,17 @@ msgstr ""
> "Plural-Forms: nplurals=2; plural=(n != 1);\n"
>
> #: xxx.c:yy
> +msgctxt "command-line option"
> msgid "color"
> msgstr "colour"
>
> #: xxx.c:yy
> +msgctxt "command-line option"
> msgid "flavor"
> msgstr "flavour"
>
> # This is to make sure the translator cannot redirect options.
> #: xxx.c:yy
> +msgctxt "command-line option"
> msgid "optional"
> msgstr "required"
> diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist
> index 0166703bdb..b3e5510297 100644
> --- a/sysdeps/mach/hurd/i386/libc.abilist
> +++ b/sysdeps/mach/hurd/i386/libc.abilist
> @@ -2818,6 +2818,8 @@ GLIBC_2.44 gai_cancel F
> GLIBC_2.44 gai_error F
> GLIBC_2.44 gai_suspend F
> GLIBC_2.44 getaddrinfo_a F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.44 lio_listio F
> GLIBC_2.44 lio_listio64 F
> GLIBC_2.44 mq_close F
> diff --git a/sysdeps/mach/hurd/x86_64/libc.abilist b/sysdeps/mach/hurd/x86_64/libc.abilist
> index 0262a079aa..dcfac4bd51 100644
> --- a/sysdeps/mach/hurd/x86_64/libc.abilist
> +++ b/sysdeps/mach/hurd/x86_64/libc.abilist
> @@ -2494,6 +2494,8 @@ GLIBC_2.44 gai_cancel F
> GLIBC_2.44 gai_error F
> GLIBC_2.44 gai_suspend F
> GLIBC_2.44 getaddrinfo_a F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.44 lio_listio F
> GLIBC_2.44 lio_listio64 F
> GLIBC_2.44 mq_close F
> diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> index 3156688add..7dd7c7aa88 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist
> @@ -2775,3 +2775,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> index 8af5b0b581..bfbee2c31f 100644
> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist
> @@ -3122,6 +3122,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist
> index 35fcef2cc4..00224995bb 100644
> --- a/sysdeps/unix/sysv/linux/arc/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist
> @@ -2536,3 +2536,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> index a6c6b951bf..8856423c37 100644
> --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist
> @@ -2828,6 +2828,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> index e76015fe66..6718047590 100644
> --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist
> @@ -2825,6 +2825,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist
> index 1fb7cdcad5..c48b5fbbd5 100644
> --- a/sysdeps/unix/sysv/linux/csky/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist
> @@ -2812,3 +2812,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> index 0710ccecf9..9afdd0a2ea 100644
> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist
> @@ -2849,6 +2849,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist
> index 3afe3a88eb..adf364236d 100644
> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist
> @@ -3032,6 +3032,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/loongarch/ilp32/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/ilp32/libc.abilist
> index 7c6d7055c3..a90b2a83ca 100644
> --- a/sysdeps/unix/sysv/linux/loongarch/ilp32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/loongarch/ilp32/libc.abilist
> @@ -995,6 +995,8 @@ GLIBC_2.44 getnetgrent F
> GLIBC_2.44 getnetgrent_r F
> GLIBC_2.44 getopt F
> GLIBC_2.44 getopt_long F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.44 getopt_long_only F
> GLIBC_2.44 getpagesize F
> GLIBC_2.44 getpass F
> diff --git a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> index c2b3a66d3a..2a547f5d7d 100644
> --- a/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/loongarch/lp64/libc.abilist
> @@ -2296,3 +2296,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> index d6855131e8..a967c60f07 100644
> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist
> @@ -2808,6 +2808,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> index 4e3fe9c42f..486d5975ec 100644
> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist
> @@ -2975,6 +2975,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> index 29f0c5f954..68ae7ff5ce 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist
> @@ -2861,3 +2861,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> index 2ef62838f7..eb0d3ddf68 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist
> @@ -2858,3 +2858,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> index 031e8961ac..0a9bad7ad0 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist
> @@ -2938,6 +2938,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> index 8dc99d81b4..072c9df2c1 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist
> @@ -2936,6 +2936,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> index 054c5b6391..9f738374d3 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist
> @@ -2944,6 +2944,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> index 13f0148bc0..8b8b718d86 100644
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist
> @@ -2846,6 +2846,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> index e7ffe07dd8..c63bc5d110 100644
> --- a/sysdeps/unix/sysv/linux/or1k/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist
> @@ -2286,3 +2286,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> index dea4b20f05..2c5141623d 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist
> @@ -3165,6 +3165,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> index b45e127463..8d2194f22d 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist
> @@ -3210,6 +3210,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> index 942cf6a027..b5f1a9cc83 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist
> @@ -2919,6 +2919,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> index 65d78e5076..0b9c5761da 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist
> @@ -2995,3 +2995,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> index dcab30d72e..75f37a6c9d 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist
> @@ -2539,3 +2539,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> index 796ef35e26..d2e98816c7 100644
> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist
> @@ -2739,3 +2739,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> diff --git a/sysdeps/unix/sysv/linux/s390/libc.abilist b/sysdeps/unix/sysv/linux/s390/libc.abilist
> index 8f2350ee0b..e19857bb81 100644
> --- a/sysdeps/unix/sysv/linux/s390/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/s390/libc.abilist
> @@ -2956,6 +2956,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> index 7aa98c5aed..55bc8458c0 100644
> --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist
> @@ -2855,6 +2855,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> index 6bd4f8f63a..5bf43c1855 100644
> --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist
> @@ -2852,6 +2852,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> index b52cab2a35..417e67f73b 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist
> @@ -3186,6 +3186,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> index ff99cd4f21..57c9590334 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist
> @@ -2822,6 +2822,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> index 306cd627fd..6749f30c83 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist
> @@ -2771,6 +2771,8 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
> GLIBC_2.5 __readlinkat_chk F
> GLIBC_2.5 inet6_opt_append F
> GLIBC_2.5 inet6_opt_find F
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> index 8b9c448742..d8899a2048 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist
> @@ -2790,3 +2790,5 @@ GLIBC_2.43 memset_explicit F
> GLIBC_2.43 mseal F
> GLIBC_2.43 openat2 F
> GLIBC_2.43 umaxabs F
> +GLIBC_2.44 getopt_long_disable_translations F
> +GLIBC_2.44 getopt_long_enable_translations F
@@ -19,6 +19,11 @@ Major new features:
* New locale added: hrx_BR (Hunsrik language spoken in Brazil).
* The getopt_long function now accepts translated long option names.
+ This functionality is enabled or disabled by calling
+ getopt_long_enable_translations / getopt_long_disable_translations.
+
+* Argp parsers enable translated long option names with "command-line
+ option" as the message context.
Deprecated and removed features, and other changes affecting compatibility:
@@ -202,15 +202,6 @@ declared in @file{getopt.h}, not @file{unistd.h}. You should make every
program accept long options if it uses any options, for this takes
little extra work and helps beginners remember how to use the program.
-Both long option names and their translations provided by the program
-for the user's current locale are recognized. This helps users of
-your program who do not speak English understand the meaning of the
-options, and it does not break the function of the program in scripts
-if the untranslated option names are used. If international
-communication involves the invocation of your program, the program
-users should be encouraged to use untranslated option names or publish
-the locale used for this invocation.
-
@deftp {Data Type} {struct option}
@standards{GNU, getopt.h}
This structure describes a single long option name for the sake of
@@ -224,7 +215,8 @@ The @code{struct option} structure has these fields:
@item const char *name
This field is the name of the option. It is a string. In order for
@command{getopt_long} to accept either the long option name or its
-translated form, you should mark this string for translation.
+translated form, you should mark this string for translation with a
+translation context, and call @code{getopt_long_enable_translations}.
@item int has_arg
This field says whether the option takes an argument. It is an integer,
@@ -246,6 +238,35 @@ was seen.
@end table
@end deftp
+@deftypefun int getopt_long_enable_translations (const char *@var{msgctxt})
+@deftypefunx void getopt_long_disable_translations (void)
+@standards{GNU, getopt.h}
+@c FIXME: I copied that from getopt_long, but I don't understand
+@c it. getopt_long_*able_translations use malloc/free and modifies
+@c global state.
+@safety{@prelim{}@mtunsafe{@mtasurace{:getopt} @mtsenv{}}@asunsafe{@ascuheap{} @ascuintl{} @asulock{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}}
+If long option translations are enabled, then both long option names
+and their translations provided by the program for the user's current
+locale are recognized. This helps users of your program who do not
+speak English understand the meaning of the options, without breaking
+the function of the program in scripts if the untranslated option
+names are used. If international communication involves the
+invocation of your program, the program users should be encouraged to
+use untranslated option names or publish the locale used for this
+invocation.
+
+Since option names may be short words instead of long sentences, they
+may have different translations in different contexts within the same
+program. @xref{Contexts, , Using contexts for solving ambiguities,
+gettext, the GNU Gettext manual}, for more information. @var{msgctxt}
+should be a non-NULL string to disambiguate option name translations.
+Passing NULL, or calling @code{getopt_long_disable_translations()},
+will disable option name translation.
+
+@code{getopt_long_enable_translations} returns 0 on success, or -1 and
+sets errno.
+@end deftypefun
+
@deftypefun int getopt_long (int @var{argc}, char *const *@var{argv}, const char *@var{shortopts}, const struct option *@var{longopts}, int *@var{indexptr})
@standards{GNU, getopt.h}
@safety{@prelim{}@mtunsafe{@mtasurace{:getopt} @mtsenv{}}@asunsafe{@ascuheap{} @ascuintl{} @asulock{} @asucorrupt{}}@acunsafe{@acsmem{} @aculock{} @acucorrupt{}}}
@@ -159,6 +159,10 @@ libc {
GLIBC_2.35 {
posix_spawn_file_actions_addtcsetpgrp_np;
}
+ GLIBC_2.44 {
+ getopt_long_enable_translations;
+ getopt_long_disable_translations;
+ }
GLIBC_PRIVATE {
__libc_fork; __libc_pread; __libc_pwrite;
__nanosleep_nocancel; __pause_nocancel;
@@ -71,6 +71,9 @@ extern int getopt_long_only (int ___argc, char *__getopt_argv_const *___argv,
const char *__shortopts,
const struct option *__longopts, int *__longind)
__THROW __nonnull ((2, 3));
+extern int getopt_long_enable_translations (const char *__msgctxt)
+ __attribute_warn_unused_result__;
+extern void getopt_long_disable_translations (void);
__END_DECLS
@@ -182,22 +182,30 @@ exchange (char **argv, struct _getopt_data *d)
d->__last_nonopt = d->optind;
}
-/* Return true iff a translation for opt_name has been found and it
- matches the substring from argument, length argument_length.
+/* Return true iff translation_context is not NULL, a translation for
+ opt_name has been found and it matches the substring from argument,
+ length argument_length.
*/
static bool
-match_translated_option_name (char *(*translate) (const char *msgid),
+match_translated_option_name (char *(*translate) (const char *, const char *,
+ char **),
const char *argument, size_t argument_length,
+ const char *translation_context,
const char *opt_name)
{
const char *translated = opt_name;
+ char *translation_buffer = NULL;
+ bool matches = false;
if (translate != NULL)
- translated = translate (opt_name);
+ translated = translate (translation_context, opt_name, &translation_buffer);
if (strncmp (translated, argument, argument_length) != 0)
- return false;
- /* We know that argument is a prefix of translated. */
- return translated[argument_length] == '\0';
+ matches = false;
+ else
+ /* We know that argument is a prefix of translated. */
+ matches = translated[argument_length] == '\0';
+ free (translation_buffer);
+ return matches;
}
/* Process the argument starting with d->__nextchar as a long option.
@@ -213,7 +221,8 @@ process_long_option (int argc, char **argv, const char *optstring,
const struct option *longopts, int *longind,
int long_only, struct _getopt_data *d,
int print_errors, const char *prefix,
- char *(*translate) (const char *msgid))
+ char *(*translate) (const char *, const char *,
+ char **))
{
char *nameend;
size_t namelen;
@@ -222,6 +231,7 @@ process_long_option (int argc, char **argv, const char *optstring,
int n_options;
int option_index;
const char *translated_option_name;
+ char *translation_buffer = NULL;
for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
/* Do nothing. */ ;
@@ -244,7 +254,9 @@ process_long_option (int argc, char **argv, const char *optstring,
/* Didn't find an exact match, try with translated option
names. */
for (p = longopts, option_index = 0; p->name; p++, option_index++)
- if (match_translated_option_name (translate, d->__nextchar, namelen, p->name))
+ if (match_translated_option_name (translate,
+ d->__nextchar, namelen,
+ d->optctxt, p->name))
{
/* Exact match found with translation. */
pfound = p;
@@ -377,7 +389,8 @@ process_long_option (int argc, char **argv, const char *optstring,
{
if (print_errors)
{
- translated_option_name = translate (pfound->name);
+ translated_option_name = translate (d->optctxt, pfound->name,
+ &translation_buffer);
if (strcmp (translated_option_name, pfound->name) != 0)
/* Print both names of the option. */
fprintf (stderr,
@@ -389,6 +402,7 @@ process_long_option (int argc, char **argv, const char *optstring,
fprintf (stderr,
_("%s: option '%s%s' doesn't allow an argument\n"),
argv[0], prefix, pfound->name);
+ free (translation_buffer);
}
d->optopt = pfound->val;
return '?';
@@ -404,7 +418,8 @@ process_long_option (int argc, char **argv, const char *optstring,
{
/* Same dichotomy as when the option does not allow an
argument. */
- translated_option_name = translate (pfound->name);
+ translated_option_name = translate (d->optctxt, pfound->name,
+ &translation_buffer);
if (strcmp (translated_option_name, pfound->name) != 0)
fprintf (stderr,
_("%s: option '%s%s' / '%s%s' requires an argument\n"),
@@ -413,6 +428,7 @@ process_long_option (int argc, char **argv, const char *optstring,
fprintf (stderr,
_("%s: option '%s%s' requires an argument\n"),
argv[0], prefix, pfound->name);
+ free (translation_buffer);
}
d->optopt = pfound->val;
@@ -526,7 +542,7 @@ int
_getopt_internal_r (int argc, char **argv, const char *optstring,
const struct option *longopts, int *longind,
int long_only, struct _getopt_data *d, int posixly_correct,
- char *(*translate) (const char *msgid))
+ char *(*translate) (const char *, const char *, char **))
{
int print_errors = d->opterr;
@@ -761,12 +777,15 @@ _getopt_internal_r (int argc, char **argv, const char *optstring,
int
_getopt_internal (int argc, char **argv, const char *optstring,
const struct option *longopts, int *longind, int long_only,
- int posixly_correct, char *(*translate) (const char *))
+ int posixly_correct,
+ char *(*translate) (const char *, const char *, char **),
+ const char *ctxt)
{
int result;
getopt_data.optind = optind;
getopt_data.opterr = opterr;
+ getopt_data.optctxt = ctxt;
result = _getopt_internal_r (argc, argv, optstring, longopts,
longind, long_only, &getopt_data,
@@ -789,7 +808,7 @@ _getopt_internal (int argc, char **argv, const char *optstring,
{ \
return _getopt_internal (argc, (char **)argv, optstring, \
NULL, NULL, 0, POSIXLY_CORRECT, \
- NULL); \
+ NULL, NULL); \
}
#ifdef _LIBC
@@ -26,13 +26,53 @@
#include "getopt.h"
#include "getopt_int.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+
+/* Callers store an optional context to enable option name
+ translation. The argument is allocated. */
+
+char *optctxt = NULL;
+
+/* FIXME: use pgettext_expr. */
+static char *
+do_translate (const char *context, const char *msgid, char **allocated)
+{
+ char *full_msgid;
+ const char *translated = msgid;
+ int output_length = 0;
+
+ *allocated = NULL;
+ if (context != NULL)
+ {
+ output_length = __asprintf (&full_msgid, "%s\004%s", context, msgid);
+ *allocated = full_msgid;
+ if (output_length >= 0)
+ {
+ translated = __dcgettext (NULL, full_msgid, LC_MESSAGES);
+ if (strcmp (translated, full_msgid) == 0)
+ {
+ /* No translation for this context and message, so drop
+ the context + ^D prefix. */
+ translated = msgid;
+ }
+ }
+ /* Otherwise, if memory allocation failed, then we won’t accept
+ translations. translated remains an alias to msgid. */
+ }
+ else
+ translated = msgid;
+ return (char *) translated;
+}
int
getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
const struct option *long_options, int *opt_index)
{
return _getopt_internal (argc, (char **) argv, options, long_options,
- opt_index, 0, 0, gettext);
+ opt_index, 0, 0, do_translate, optctxt);
}
int
@@ -41,7 +81,7 @@ _getopt_long_r (int argc, char **argv, const char *options,
struct _getopt_data *d)
{
return _getopt_internal_r (argc, argv, options, long_options, opt_index,
- 0, d, 0, gettext);
+ 0, d, 0, do_translate);
}
/* Like getopt_long, but '-' as well as '--' can indicate a long option.
@@ -55,7 +95,7 @@ getopt_long_only (int argc, char *__getopt_argv_const *argv,
const struct option *long_options, int *opt_index)
{
return _getopt_internal (argc, (char **) argv, options, long_options,
- opt_index, 1, 0, gettext);
+ opt_index, 1, 0, do_translate, optctxt);
}
int
@@ -64,7 +104,33 @@ _getopt_long_only_r (int argc, char **argv, const char *options,
struct _getopt_data *d)
{
return _getopt_internal_r (argc, argv, options, long_options, opt_index,
- 1, d, 0, gettext);
+ 1, d, 0, do_translate);
+}
+
+static void
+disable_translations (void)
+{
+ free (optctxt);
+ optctxt = NULL;
+}
+
+int
+getopt_long_enable_translations (const char *msgctxt)
+{
+ disable_translations ();
+ if (msgctxt != NULL)
+ {
+ optctxt = __strdup (msgctxt);
+ if (optctxt == NULL)
+ return -1;
+ }
+ return 0;
+}
+
+void
+getopt_long_disable_translations (void)
+{
+ disable_translations ();
}
@@ -29,7 +29,9 @@ extern int _getopt_internal (int ___argc, char **___argv,
const char *__shortopts,
const struct option *__longopts, int *__longind,
int __long_only, int __posixly_correct,
- char *(*translate) (const char *msgid));
+ char *(*translate) (const char *, const char *,
+ char **),
+ const char *__optctxt);
/* Reentrant versions which can handle parsing multiple argument
@@ -71,6 +73,7 @@ struct _getopt_data
int opterr;
int optopt;
char *optarg;
+ const char *optctxt;
/* Internal members. */
@@ -107,7 +110,8 @@ extern int _getopt_internal_r (int ___argc, char **___argv,
const struct option *__longopts, int *__longind,
int __long_only, struct _getopt_data *__data,
int __posixly_correct,
- char *(*translate) (const char *msgid));
+ char *(*translate) (const char *, const char *,
+ char **));
extern int _getopt_long_r (int ___argc, char **___argv,
const char *__shortopts,
@@ -39,6 +39,8 @@
known translation of flavor) without the program recognizing a
--flavor option. */
+#define TRANSLATION_CONTEXT "command-line option"
+
static void
prepare_localedir (void)
{
@@ -47,8 +49,8 @@ prepare_localedir (void)
TEST_VERIFY_EXIT (bindtextdomain ("tstgetoptl", OBJPFX "domaindir") != NULL);
TEST_VERIFY_EXIT (textdomain ("tstgetoptl") != NULL);
/* Check that the catalog is OK: */
- TEST_COMPARE_STRING (gettext ("color"), "colour");
- TEST_COMPARE_STRING (gettext ("flavor"), "flavour");
+ TEST_COMPARE_STRING (gettext (TRANSLATION_CONTEXT "\004" "color"), "colour");
+ TEST_COMPARE_STRING (gettext (TRANSLATION_CONTEXT "\004" "flavor"), "flavour");
}
static char **
@@ -65,8 +67,9 @@ prepare_argv (int *argc)
}
static void
-do_my_test (void)
+do_my_test (bool with_optctxt)
{
+ static const char *translation_context = TRANSLATION_CONTEXT;
int argc;
char **argv = prepare_argv (&argc);
static const struct option options[] =
@@ -87,8 +90,14 @@ do_my_test (void)
int c;
bool found_flavor = false;
+ if (with_optctxt)
+ TEST_VERIFY_EXIT (getopt_long_enable_translations (translation_context) == 0);
+ else
+ getopt_long_disable_translations ();
optind = 0;
fputs ("Reminder that --flavor is not an option of the program.\n", stderr);
+ if (!with_optctxt)
+ fputs ("No optctxt set, so --colour should not be recognized.\n", stderr);
while ((c = getopt_long (argc, argv, "", options, NULL)) >= 0)
switch (c)
{
@@ -96,8 +105,13 @@ do_my_test (void)
++Cflag;
break;
case '?':
- TEST_VERIFY (!found_flavor);
- found_flavor = true;
+ if (with_optctxt)
+ {
+ TEST_VERIFY (!found_flavor);
+ found_flavor = true;
+ }
+ /* Otherwise, this is OK; --colour should not exist if we did not set
+ optctxt. */
break;
default:
/* This should not happen. */
@@ -115,11 +129,18 @@ do_my_test (void)
break;
}
- TEST_VERIFY (found_flavor);
+ if (with_optctxt)
+ TEST_VERIFY (found_flavor);
printf ("Cflags = %d\n", Cflag);
- TEST_COMPARE (Cflag, 3);
+ if (with_optctxt)
+ TEST_COMPARE (Cflag, 3);
+ else
+ TEST_COMPARE (Cflag, 2);
+
+ if (with_optctxt)
+ getopt_long_disable_translations ();
for (index = optind; index < argc; index++)
printf ("Non-option argument %s\n", argv[index]);
@@ -131,7 +152,8 @@ int
do_test (void)
{
prepare_localedir ();
- do_my_test ();
+ do_my_test (false);
+ do_my_test (true);
return 0;
}
@@ -16,14 +16,17 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: xxx.c:yy
+msgctxt "command-line option"
msgid "color"
msgstr "colour"
#: xxx.c:yy
+msgctxt "command-line option"
msgid "flavor"
msgstr "flavour"
# This is to make sure the translator cannot redirect options.
#: xxx.c:yy
+msgctxt "command-line option"
msgid "optional"
msgstr "required"
@@ -2818,6 +2818,8 @@ GLIBC_2.44 gai_cancel F
GLIBC_2.44 gai_error F
GLIBC_2.44 gai_suspend F
GLIBC_2.44 getaddrinfo_a F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.44 lio_listio F
GLIBC_2.44 lio_listio64 F
GLIBC_2.44 mq_close F
@@ -2494,6 +2494,8 @@ GLIBC_2.44 gai_cancel F
GLIBC_2.44 gai_error F
GLIBC_2.44 gai_suspend F
GLIBC_2.44 getaddrinfo_a F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.44 lio_listio F
GLIBC_2.44 lio_listio64 F
GLIBC_2.44 mq_close F
@@ -2775,3 +2775,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
@@ -3122,6 +3122,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2536,3 +2536,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
@@ -2828,6 +2828,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2825,6 +2825,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2812,3 +2812,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
@@ -2849,6 +2849,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -3032,6 +3032,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -995,6 +995,8 @@ GLIBC_2.44 getnetgrent F
GLIBC_2.44 getnetgrent_r F
GLIBC_2.44 getopt F
GLIBC_2.44 getopt_long F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.44 getopt_long_only F
GLIBC_2.44 getpagesize F
GLIBC_2.44 getpass F
@@ -2296,3 +2296,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
@@ -2808,6 +2808,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2975,6 +2975,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2861,3 +2861,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
@@ -2858,3 +2858,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
@@ -2938,6 +2938,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2936,6 +2936,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2944,6 +2944,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2846,6 +2846,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2286,3 +2286,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
@@ -3165,6 +3165,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -3210,6 +3210,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2919,6 +2919,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2995,3 +2995,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
@@ -2539,3 +2539,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
@@ -2739,3 +2739,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
@@ -2956,6 +2956,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2855,6 +2855,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2852,6 +2852,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -3186,6 +3186,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2822,6 +2822,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2771,6 +2771,8 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F
GLIBC_2.5 __readlinkat_chk F
GLIBC_2.5 inet6_opt_append F
GLIBC_2.5 inet6_opt_find F
@@ -2790,3 +2790,5 @@ GLIBC_2.43 memset_explicit F
GLIBC_2.43 mseal F
GLIBC_2.43 openat2 F
GLIBC_2.43 umaxabs F
+GLIBC_2.44 getopt_long_disable_translations F
+GLIBC_2.44 getopt_long_enable_translations F