Re: [PATCH] Import setenv and unsetenv from gnulib

Sergio Durigan Junior
2017-07-03T19:35:34Z

On Monday, July 03 2017, Anton Kolesov wrote:

> This patch supersedes
> https://sourceware.org/ml/gdb-patches/2017-07/msg00009.html

This is indeed better and looks good to me. Please wait until a global
maintainer approves it.

Thanks for doing this.

> ---
>
> Patch [1] broke a build on MinGW hosts, because MinGW doesn't provide POSIX
> functions setenv () and unsetenv (). This can be fixed by using
> implementations from gnulib.
>
> [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=9a6c7d9c0
>
> gdb/ChangeLog
> yyyy-mm-dd Anton Kolesov <Anton.Kolesov@synopsys.com>
>
> * gnulib/update-gnulib.sh (IMPORTED_GNULIB_MODULES): Add setenv and
> unsetenv.
> * gnulib/aclocal.m4: Regenerate.
> * gnulib/config.in: Regenerate.
> * gnulib/configure: Regenerate.
> * gnulib/import/Makefile.am: Regenerate.
> * gnulib/import/Makefile.in: Regenerate.
> * gnulib/import/m4/gnulib-cache.m4: Regenerate.
> * gnulib/import/m4/gnulib-comp.m4: Regenerate.
> * gnulib/import/m4/environ.m4: New file.
> * gnulib/import/m4/setenv.m4: New file.
> * gnulib/import/setenv.c: New file.
> * gnulib/import/unsetenv.c: New file.
> ---
> gdb/gnulib/aclocal.m4 | 2 +
> gdb/gnulib/config.in | 35 ++++
> gdb/gnulib/configure | 391 ++++++++++++++++++++++++++++++++++-
> gdb/gnulib/import/Makefile.am | 20 +-
> gdb/gnulib/import/Makefile.in | 12 +-
> gdb/gnulib/import/m4/environ.m4 | 47 +++++
> gdb/gnulib/import/m4/gnulib-cache.m4 | 4 +-
> gdb/gnulib/import/m4/gnulib-comp.m4 | 20 ++
> gdb/gnulib/import/m4/setenv.m4 | 160 ++++++++++++++
> gdb/gnulib/import/setenv.c | 390 ++++++++++++++++++++++++++++++++++
> gdb/gnulib/import/unsetenv.c | 127 ++++++++++++
> gdb/gnulib/update-gnulib.sh | 2 +
> 12 files changed, 1201 insertions(+), 9 deletions(-)
> create mode 100644 gdb/gnulib/import/m4/environ.m4
> create mode 100644 gdb/gnulib/import/m4/setenv.m4
> create mode 100644 gdb/gnulib/import/setenv.c
> create mode 100644 gdb/gnulib/import/unsetenv.c
>
> diff --git a/gdb/gnulib/aclocal.m4 b/gdb/gnulib/aclocal.m4
> index cd0dd5d..a4ce6a6 100644
> --- a/gdb/gnulib/aclocal.m4
> +++ b/gdb/gnulib/aclocal.m4
> @@ -1023,6 +1023,7 @@ m4_include([import/m4/dirfd.m4])
> m4_include([import/m4/dirname.m4])
> m4_include([import/m4/double-slash-root.m4])
> m4_include([import/m4/eealloc.m4])
> +m4_include([import/m4/environ.m4])
> m4_include([import/m4/errno_h.m4])
> m4_include([import/m4/exponentd.m4])
> m4_include([import/m4/exponentl.m4])
> @@ -1071,6 +1072,7 @@ m4_include([import/m4/rawmemchr.m4])
> m4_include([import/m4/readlink.m4])
> m4_include([import/m4/rename.m4])
> m4_include([import/m4/rmdir.m4])
> +m4_include([import/m4/setenv.m4])
> m4_include([import/m4/signal_h.m4])
> m4_include([import/m4/ssize_t.m4])
> m4_include([import/m4/stat.m4])
> diff --git a/gdb/gnulib/config.in b/gdb/gnulib/config.in
> index 057b12d..6061520 100644
> --- a/gdb/gnulib/config.in
> +++ b/gdb/gnulib/config.in
> @@ -95,6 +95,9 @@
> /* Define to 1 when the gnulib module dirfd should be tested. */
> #undef GNULIB_TEST_DIRFD
>
> +/* Define to 1 when the gnulib module environ should be tested. */
> +#undef GNULIB_TEST_ENVIRON
> +
> /* Define to 1 when the gnulib module frexp should be tested. */
> #undef GNULIB_TEST_FREXP
>
> @@ -140,6 +143,9 @@
> /* Define to 1 when the gnulib module rmdir should be tested. */
> #undef GNULIB_TEST_RMDIR
>
> +/* Define to 1 when the gnulib module setenv should be tested. */
> +#undef GNULIB_TEST_SETENV
> +
> /* Define to 1 when the gnulib module stat should be tested. */
> #undef GNULIB_TEST_STAT
>
> @@ -152,6 +158,9 @@
> /* Define to 1 when the gnulib module strtok_r should be tested. */
> #undef GNULIB_TEST_STRTOK_R
>
> +/* Define to 1 when the gnulib module unsetenv should be tested. */
> +#undef GNULIB_TEST_UNSETENV
> +
> /* Define to 1 if you have 'alloca' after including <alloca.h>, a header that
> may be supplied by this distribution. */
> #undef HAVE_ALLOCA
> @@ -201,6 +210,10 @@
> */
> #undef HAVE_DECL_MEMMEM
>
> +/* Define to 1 if you have the declaration of `setenv', and to 0 if you don't.
> + */
> +#undef HAVE_DECL_SETENV
> +
> /* Define to 1 if you have the declaration of `strtok_r', and to 0 if you
> don't. */
> #undef HAVE_DECL_STRTOK_R
> @@ -209,12 +222,19 @@
> don't. */
> #undef HAVE_DECL_TOWLOWER
>
> +/* Define to 1 if you have the declaration of `unsetenv', and to 0 if you
> + don't. */
> +#undef HAVE_DECL_UNSETENV
> +
> /* Define to 1 if you have the <dirent.h> header file. */
> #undef HAVE_DIRENT_H
>
> /* Define to 1 if you have the `dirfd' function. */
> #undef HAVE_DIRFD
>
> +/* Define if you have the declaration of environ. */
> +#undef HAVE_ENVIRON_DECL
> +
> /* Define to 1 if you have the <features.h> header file. */
> #undef HAVE_FEATURES_H
>
> @@ -1126,6 +1146,12 @@
> /* Define to 1 if 'long double' and 'double' have the same representation. */
> #undef HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
>
> +/* Define to 1 if you have the <search.h> header file. */
> +#undef HAVE_SEARCH_H
> +
> +/* Define to 1 if you have the `setenv' function. */
> +#undef HAVE_SETENV
> +
> /* Define to 1 if 'sig_atomic_t' is a signed integer type. */
> #undef HAVE_SIGNED_SIG_ATOMIC_T
>
> @@ -1189,9 +1215,15 @@
> /* Define to 1 if you have the `towlower' function. */
> #undef HAVE_TOWLOWER
>
> +/* Define to 1 if you have the `tsearch' function. */
> +#undef HAVE_TSEARCH
> +
> /* Define to 1 if you have the <unistd.h> header file. */
> #undef HAVE_UNISTD_H
>
> +/* Define to 1 if you have the `unsetenv' function. */
> +#undef HAVE_UNSETENV
> +
> /* Define to 1 if the system has the type 'unsigned long long int'. */
> #undef HAVE_UNSIGNED_LONG_LONG_INT
>
> @@ -1407,6 +1439,9 @@
> #endif
>
>
> +/* Define to 1 if unsetenv returns void instead of int. */
> +#undef VOID_UNSETENV
> +
> /* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
> 'wchar_t'. */
> #undef WCHAR_T_SUFFIX
> diff --git a/gdb/gnulib/configure b/gdb/gnulib/configure
> index d214164..2a0dfc2 100644
> --- a/gdb/gnulib/configure
> +++ b/gdb/gnulib/configure
> @@ -3307,6 +3307,7 @@ as_fn_append ac_func_list " readlink"
> as_fn_append ac_func_list " realpath"
> as_fn_append ac_header_list " sys/param.h"
> as_fn_append ac_header_list " dirent.h"
> +as_fn_append ac_header_list " unistd.h"
> as_fn_append ac_func_list " btowc"
> as_fn_append ac_func_list " isblank"
> as_fn_append ac_func_list " iswctype"
> @@ -3324,7 +3325,6 @@ as_fn_append ac_header_list " limits.h"
> as_fn_append ac_header_list " wchar.h"
> as_fn_append ac_header_list " stdint.h"
> as_fn_append ac_header_list " inttypes.h"
> -as_fn_append ac_header_list " unistd.h"
> as_fn_append ac_func_list " symlink"
> as_fn_append ac_func_list " lstat"
> as_fn_append ac_header_list " math.h"
> @@ -3333,6 +3333,7 @@ as_fn_append ac_func_list " mbrtowc"
> as_fn_append ac_header_list " sys/mman.h"
> as_fn_append ac_func_list " mprotect"
> as_fn_append ac_func_list " link"
> +as_fn_append ac_func_list " setenv"
> as_fn_append ac_header_list " sys/stat.h"
> as_fn_append ac_header_list " features.h"
> as_fn_append ac_func_list " iswcntrl"
> @@ -5311,6 +5312,7 @@ fi
> # Code from module dirname-lgpl:
> # Code from module dosname:
> # Code from module double-slash-root:
> + # Code from module environ:
> # Code from module errno:
> # Code from module extensions:
> # Code from module extern-inline:
> @@ -5352,6 +5354,7 @@ fi
> # Code from module rename:
> # Code from module rmdir:
> # Code from module same-inode:
> + # Code from module setenv:
> # Code from module signal-h:
> # Code from module snippet/_Noreturn:
> # Code from module snippet/arg-nonnull:
> @@ -5376,6 +5379,7 @@ fi
> # Code from module sys_types:
> # Code from module time:
> # Code from module unistd:
> + # Code from module unsetenv:
> # Code from module update-copyright:
> # Code from module verify:
> # Code from module wchar:
> @@ -6826,6 +6830,59 @@ $as_echo "$gl_cv_pragma_columns" >&6; }
>
>
>
> +
> +
> +
> +
> +
> +
> +
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if environ is properly declared" >&5
> +$as_echo_n "checking if environ is properly declared... " >&6; }
> + if test "${gt_cv_var_environ_declaration+set}" = set; then :
> + $as_echo_n "(cached) " >&6
> +else
> +
> + cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h. */
> +#if HAVE_UNISTD_H
> + #include <unistd.h>
> + #endif
> + /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>. */
> + #include <stdlib.h>
> +
> + extern struct { int foo; } environ;
> +int
> +main ()
> +{
> +environ.foo = 1;
> + ;
> + return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_compile "$LINENO"; then :
> + gt_cv_var_environ_declaration=no
> +else
> + gt_cv_var_environ_declaration=yes
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +fi
> +
> + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_var_environ_declaration" >&5
> +$as_echo "$gt_cv_var_environ_declaration" >&6; }
> + if test $gt_cv_var_environ_declaration = yes; then
> +
> +$as_echo "#define HAVE_ENVIRON_DECL 1" >>confdefs.h
> +
> + fi
> +
> +
> + if test $gt_cv_var_environ_declaration != yes; then
> + HAVE_DECL_ENVIRON=0
> + fi
> +
> +
> +
> { $as_echo "$as_me:${as_lineno-$LINENO}: checking for complete errno.h" >&5
> $as_echo_n "checking for complete errno.h... " >&6; }
> if test "${gl_cv_header_errno_h_complete+set}" = set; then :
> @@ -9919,8 +9976,6 @@ $as_echo "#define HAVE_LANGINFO_CODESET 1" >>confdefs.h
>
>
>
> -
> -
> { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working fcntl.h" >&5
> $as_echo_n "checking for working fcntl.h... " >&6; }
> if test "${gl_cv_header_working_fcntl_h+set}" = set; then :
> @@ -11411,6 +11466,55 @@ $as_echo "$gl_cv_func_memmem_works_always" >&6; }
>
>
>
> +ac_fn_c_check_decl "$LINENO" "setenv" "ac_cv_have_decl_setenv" "$ac_includes_default"
> +if test "x$ac_cv_have_decl_setenv" = x""yes; then :
> + ac_have_decl=1
> +else
> + ac_have_decl=0
> +fi
> +
> +cat >>confdefs.h <<_ACEOF
> +#define HAVE_DECL_SETENV $ac_have_decl
> +_ACEOF
> +
> +
> +
> +
> +
> +
> + if test $ac_cv_have_decl_setenv = no; then
> + HAVE_DECL_SETENV=0
> + fi
> +
> +
> +
> +
> +
> + for ac_header in search.h
> +do :
> + ac_fn_c_check_header_mongrel "$LINENO" "search.h" "ac_cv_header_search_h" "$ac_includes_default"
> +if test "x$ac_cv_header_search_h" = x""yes; then :
> + cat >>confdefs.h <<_ACEOF
> +#define HAVE_SEARCH_H 1
> +_ACEOF
> +
> +fi
> +
> +done
> +
> + for ac_func in tsearch
> +do :
> + ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch"
> +if test "x$ac_cv_func_tsearch" = x""yes; then :
> + cat >>confdefs.h <<_ACEOF
> +#define HAVE_TSEARCH 1
> +_ACEOF
> +
> +fi
> +done
> +
> +
> +
>
> GNULIB_PTHREAD_SIGMASK=0;
> GNULIB_RAISE=0;
> @@ -12246,6 +12350,17 @@ $as_echo "$gl_cv_next_time_h" >&6; }
>
>
>
> +ac_fn_c_check_decl "$LINENO" "unsetenv" "ac_cv_have_decl_unsetenv" "$ac_includes_default"
> +if test "x$ac_cv_have_decl_unsetenv" = x""yes; then :
> + ac_have_decl=1
> +else
> + ac_have_decl=0
> +fi
> +
> +cat >>confdefs.h <<_ACEOF
> +#define HAVE_DECL_UNSETENV $ac_have_decl
> +_ACEOF
> +
>
> { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether <wchar.h> uses 'inline' correctly" >&5
> $as_echo_n "checking whether <wchar.h> uses 'inline' correctly... " >&6; }
> @@ -12917,6 +13032,22 @@ $as_echo "#define DOUBLE_SLASH_IS_DISTINCT_ROOT 1" >>confdefs.h
>
>
>
> +
> +
> +
> + GNULIB_ENVIRON=1
> +
> +
> +
> +
> +
> +$as_echo "#define GNULIB_TEST_ENVIRON 1" >>confdefs.h
> +
> +
> +
> +
> +
> +
> { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flexible array member" >&5
> $as_echo_n "checking for flexible array member... " >&6; }
> if test "${ac_cv_c_flexmember+set}" = set; then :
> @@ -17099,6 +17230,102 @@ $as_echo "#define GNULIB_TEST_RMDIR 1" >>confdefs.h
>
>
>
> + if test $ac_cv_func_setenv = no; then
> + HAVE_SETENV=0
> + else
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether setenv validates arguments" >&5
> +$as_echo_n "checking whether setenv validates arguments... " >&6; }
> +if test "${gl_cv_func_setenv_works+set}" = set; then :
> + $as_echo_n "(cached) " >&6
> +else
> + if test "$cross_compiling" = yes; then :
> + case "$host_os" in
> + # Guess yes on glibc systems.
> + *-gnu*) gl_cv_func_setenv_works="guessing yes" ;;
> + # If we don't know, assume the worst.
> + *) gl_cv_func_setenv_works="guessing no" ;;
> + esac
> +
> +else
> + cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h. */
> +
> + #include <stdlib.h>
> + #include <errno.h>
> + #include <string.h>
> +
> +int
> +main ()
> +{
> +
> + int result = 0;
> + {
> + if (setenv ("", "", 0) != -1)
> + result |= 1;
> + else if (errno != EINVAL)
> + result |= 2;
> + }
> + {
> + if (setenv ("a", "=", 1) != 0)
> + result |= 4;
> + else if (strcmp (getenv ("a"), "=") != 0)
> + result |= 8;
> + }
> + return result;
> +
> + ;
> + return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_run "$LINENO"; then :
> + gl_cv_func_setenv_works=yes
> +else
> + gl_cv_func_setenv_works=no
> +fi
> +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
> + conftest.$ac_objext conftest.beam conftest.$ac_ext
> +fi
> +
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_setenv_works" >&5
> +$as_echo "$gl_cv_func_setenv_works" >&6; }
> + case "$gl_cv_func_setenv_works" in
> + *yes) ;;
> + *)
> + REPLACE_SETENV=1
> + ;;
> + esac
> + fi
> +
> + if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then
> +
> +
> +
> +
> +
> +
> +
> +
> + gl_LIBOBJS="$gl_LIBOBJS setenv.$ac_objext"
> +
> + fi
> +
> +
> +
> +
> +
> + GNULIB_SETENV=1
> +
> +
> +
> +
> +
> +$as_echo "#define GNULIB_TEST_SETENV 1" >>confdefs.h
> +
> +
> +
> +
> +
>
>
>
> @@ -18642,6 +18869,164 @@ fi
>
>
>
> + if test $ac_cv_have_decl_unsetenv = no; then
> + HAVE_DECL_UNSETENV=0
> + fi
> + for ac_func in unsetenv
> +do :
> + ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv"
> +if test "x$ac_cv_func_unsetenv" = x""yes; then :
> + cat >>confdefs.h <<_ACEOF
> +#define HAVE_UNSETENV 1
> +_ACEOF
> +
> +fi
> +done
> +
> + if test $ac_cv_func_unsetenv = no; then
> + HAVE_UNSETENV=0
> + else
> + HAVE_UNSETENV=1
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for unsetenv() return type" >&5
> +$as_echo_n "checking for unsetenv() return type... " >&6; }
> +if test "${gt_cv_func_unsetenv_ret+set}" = set; then :
> + $as_echo_n "(cached) " >&6
> +else
> + cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h. */
> +
> +#undef _BSD
> +#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
> +#include <stdlib.h>
> +extern
> +#ifdef __cplusplus
> +"C"
> +#endif
> +int unsetenv (const char *name);
> +
> +int
> +main ()
> +{
> +
> + ;
> + return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_compile "$LINENO"; then :
> + gt_cv_func_unsetenv_ret='int'
> +else
> + gt_cv_func_unsetenv_ret='void'
> +fi
> +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_unsetenv_ret" >&5
> +$as_echo "$gt_cv_func_unsetenv_ret" >&6; }
> + if test $gt_cv_func_unsetenv_ret = 'void'; then
> +
> +$as_echo "#define VOID_UNSETENV 1" >>confdefs.h
> +
> + REPLACE_UNSETENV=1
> + fi
> +
> + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether unsetenv obeys POSIX" >&5
> +$as_echo_n "checking whether unsetenv obeys POSIX... " >&6; }
> +if test "${gl_cv_func_unsetenv_works+set}" = set; then :
> + $as_echo_n "(cached) " >&6
> +else
> + if test "$cross_compiling" = yes; then :
> + case "$host_os" in
> + # Guess yes on glibc systems.
> + *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
> + # If we don't know, assume the worst.
> + *) gl_cv_func_unsetenv_works="guessing no" ;;
> + esac
> +
> +else
> + cat confdefs.h - <<_ACEOF >conftest.$ac_ext
> +/* end confdefs.h. */
> +
> + #include <stdlib.h>
> + #include <errno.h>
> + extern char **environ;
> +
> +int
> +main ()
> +{
> +
> + char entry1[] = "a=1";
> + char entry2[] = "b=2";
> + char *env[] = { entry1, entry2, NULL };
> + if (putenv ((char *) "a=1")) return 1;
> + if (putenv (entry2)) return 2;
> + entry2[0] = 'a';
> + unsetenv ("a");
> + if (getenv ("a")) return 3;
> + if (!unsetenv ("") || errno != EINVAL) return 4;
> + entry2[0] = 'b';
> + environ = env;
> + if (!getenv ("a")) return 5;
> + entry2[0] = 'a';
> + unsetenv ("a");
> + if (getenv ("a")) return 6;
> +
> + ;
> + return 0;
> +}
> +_ACEOF
> +if ac_fn_c_try_run "$LINENO"; then :
> + gl_cv_func_unsetenv_works=yes
> +else
> + gl_cv_func_unsetenv_works=no
> +fi
> +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
> + conftest.$ac_objext conftest.beam conftest.$ac_ext
> +fi
> +
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_func_unsetenv_works" >&5
> +$as_echo "$gl_cv_func_unsetenv_works" >&6; }
> + case "$gl_cv_func_unsetenv_works" in
> + *yes) ;;
> + *)
> + REPLACE_UNSETENV=1
> + ;;
> + esac
> + fi
> +
> + if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then
> +
> +
> +
> +
> +
> +
> +
> +
> + gl_LIBOBJS="$gl_LIBOBJS unsetenv.$ac_objext"
> +
> +
> +
> +
> +
> + fi
> +
> +
> +
> +
> +
> + GNULIB_UNSETENV=1
> +
> +
> +
> +
> +
> +$as_echo "#define GNULIB_TEST_UNSETENV 1" >>confdefs.h
> +
> +
> +
> +
> +
> +
>
>
>
> diff --git a/gdb/gnulib/import/Makefile.am b/gdb/gnulib/import/Makefile.am
> index baa03a5..26f249d 100644
> --- a/gdb/gnulib/import/Makefile.am
> +++ b/gdb/gnulib/import/Makefile.am
> @@ -21,7 +21,7 @@
> # the same distribution terms as the rest of that program.
> #
> # Generated by gnulib-tool.
> -# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename signal-h strchrnul strstr strtok_r sys_stat unistd update-copyright wchar wctype-h
> +# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h
>
> AUTOMAKE_OPTIONS = 1.9.6 gnits
>
> @@ -928,6 +928,15 @@ EXTRA_DIST += same-inode.h
>
> ## end gnulib module same-inode
>
> +## begin gnulib module setenv
> +
> +
> +EXTRA_DIST += setenv.c
> +
> +EXTRA_libgnu_a_SOURCES += setenv.c
> +
> +## end gnulib module setenv
> +
> ## begin gnulib module signal-h
>
> BUILT_SOURCES += signal.h
> @@ -1862,6 +1871,15 @@ EXTRA_DIST += unistd.in.h
>
> ## end gnulib module unistd
>
> +## begin gnulib module unsetenv
> +
> +
> +EXTRA_DIST += unsetenv.c
> +
> +EXTRA_libgnu_a_SOURCES += unsetenv.c
> +
> +## end gnulib module unsetenv
> +
> ## begin gnulib module update-copyright
>
>
> diff --git a/gdb/gnulib/import/Makefile.in b/gdb/gnulib/import/Makefile.in
> index d45d7ea..ca7a73d 100644
> --- a/gdb/gnulib/import/Makefile.in
> +++ b/gdb/gnulib/import/Makefile.in
> @@ -36,7 +36,7 @@
> # the same distribution terms as the rest of that program.
> #
> # Generated by gnulib-tool.
> -# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename signal-h strchrnul strstr strtok_r sys_stat unistd update-copyright wchar wctype-h
> +# Reproduce by: gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h
>
>
>
> @@ -74,6 +74,7 @@ am__aclocal_m4_deps = $(top_srcdir)/import/m4/00gnulib.m4 \
> $(top_srcdir)/import/m4/dirname.m4 \
> $(top_srcdir)/import/m4/double-slash-root.m4 \
> $(top_srcdir)/import/m4/eealloc.m4 \
> + $(top_srcdir)/import/m4/environ.m4 \
> $(top_srcdir)/import/m4/errno_h.m4 \
> $(top_srcdir)/import/m4/exponentd.m4 \
> $(top_srcdir)/import/m4/exponentl.m4 \
> @@ -122,6 +123,7 @@ am__aclocal_m4_deps = $(top_srcdir)/import/m4/00gnulib.m4 \
> $(top_srcdir)/import/m4/readlink.m4 \
> $(top_srcdir)/import/m4/rename.m4 \
> $(top_srcdir)/import/m4/rmdir.m4 \
> + $(top_srcdir)/import/m4/setenv.m4 \
> $(top_srcdir)/import/m4/signal_h.m4 \
> $(top_srcdir)/import/m4/ssize_t.m4 \
> $(top_srcdir)/import/m4/stat.m4 \
> @@ -1289,7 +1291,7 @@ EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h \
> mbrtowc.c mbsinit.c mbsrtowcs-impl.h mbsrtowcs-state.c \
> mbsrtowcs.c memchr.c memchr.valgrind memmem.c str-two-way.h \
> pathmax.h rawmemchr.c rawmemchr.valgrind readlink.c rename.c \
> - rmdir.c same-inode.h signal.in.h \
> + rmdir.c same-inode.h setenv.c signal.in.h \
> $(top_srcdir)/import/extra/snippet/_Noreturn.h \
> $(top_srcdir)/import/extra/snippet/arg-nonnull.h \
> $(top_srcdir)/import/extra/snippet/c++defs.h \
> @@ -1297,7 +1299,7 @@ EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h \
> stdbool.in.h stddef.in.h stdint.in.h stdio.in.h stdlib.in.h \
> strchrnul.c strchrnul.valgrind streq.h string.in.h \
> str-two-way.h strstr.c strtok_r.c sys_stat.in.h sys_time.in.h \
> - sys_types.in.h time.in.h unistd.in.h \
> + sys_types.in.h time.in.h unistd.in.h unsetenv.c \
> $(top_srcdir)/import/extra/update-copyright verify.h \
> wchar.in.h wctype.in.h
>
> @@ -1343,7 +1345,7 @@ EXTRA_libgnu_a_SOURCES = alloca.c canonicalize-lgpl.c dirfd.c float.c \
> gettimeofday.c isnan.c isnand.c isnan.c isnanl.c lstat.c \
> malloc.c mbrtowc.c mbsinit.c mbsrtowcs-state.c mbsrtowcs.c \
> memchr.c memmem.c rawmemchr.c readlink.c rename.c rmdir.c \
> - stat.c strchrnul.c strstr.c strtok_r.c
> + setenv.c stat.c strchrnul.c strstr.c strtok_r.c unsetenv.c
>
> # Use this preprocessor expression to decide whether #include_next works.
> # Do not rely on a 'configure'-time test for this, since the expression
> @@ -1449,6 +1451,7 @@ distclean-compile:
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readlink.Po@am__quote@
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename.Po@am__quote@
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rmdir.Po@am__quote@
> +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setenv.Po@am__quote@
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stat.Po@am__quote@
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strchrnul.Po@am__quote@
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stripslash.Po@am__quote@
> @@ -1456,6 +1459,7 @@ distclean-compile:
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strstr.Po@am__quote@
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Po@am__quote@
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unistd.Po@am__quote@
> +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unsetenv.Po@am__quote@
> @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wctype-h.Po@am__quote@
>
> .c.o:
> diff --git a/gdb/gnulib/import/m4/environ.m4 b/gdb/gnulib/import/m4/environ.m4
> new file mode 100644
> index 0000000..9a0ea7e
> --- /dev/null
> +++ b/gdb/gnulib/import/m4/environ.m4
> @@ -0,0 +1,47 @@
> +# environ.m4 serial 6
> +dnl Copyright (C) 2001-2004, 2006-2016 Free Software Foundation, Inc.
> +dnl This file is free software; the Free Software Foundation
> +dnl gives unlimited permission to copy and/or distribute it,
> +dnl with or without modifications, as long as this notice is preserved.
> +
> +AC_DEFUN_ONCE([gl_ENVIRON],
> +[
> + AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
> + dnl Persuade glibc <unistd.h> to declare environ.
> + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
> +
> + AC_CHECK_HEADERS_ONCE([unistd.h])
> + gt_CHECK_VAR_DECL(
> + [#if HAVE_UNISTD_H
> + #include <unistd.h>
> + #endif
> + /* mingw, BeOS, Haiku declare environ in <stdlib.h>, not in <unistd.h>. */
> + #include <stdlib.h>
> + ],
> + [environ])
> + if test $gt_cv_var_environ_declaration != yes; then
> + HAVE_DECL_ENVIRON=0
> + fi
> +])
> +
> +# Check if a variable is properly declared.
> +# gt_CHECK_VAR_DECL(includes,variable)
> +AC_DEFUN([gt_CHECK_VAR_DECL],
> +[
> + define([gt_cv_var], [gt_cv_var_]$2[_declaration])
> + AC_MSG_CHECKING([if $2 is properly declared])
> + AC_CACHE_VAL([gt_cv_var], [
> + AC_COMPILE_IFELSE(
> + [AC_LANG_PROGRAM(
> + [[$1
> + extern struct { int foo; } $2;]],
> + [[$2.foo = 1;]])],
> + [gt_cv_var=no],
> + [gt_cv_var=yes])])
> + AC_MSG_RESULT([$gt_cv_var])
> + if test $gt_cv_var = yes; then
> + AC_DEFINE([HAVE_]m4_translit($2, [a-z], [A-Z])[_DECL], 1,
> + [Define if you have the declaration of $2.])
> + fi
> + undefine([gt_cv_var])
> +])
> diff --git a/gdb/gnulib/import/m4/gnulib-cache.m4 b/gdb/gnulib/import/m4/gnulib-cache.m4
> index f99e59b..c4ebb73 100644
> --- a/gdb/gnulib/import/m4/gnulib-cache.m4
> +++ b/gdb/gnulib/import/m4/gnulib-cache.m4
> @@ -27,7 +27,7 @@
>
>
> # Specification in the form of a command-line invocation:
> -# gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename signal-h strchrnul strstr strtok_r sys_stat unistd update-copyright wchar wctype-h
> +# gnulib-tool --import --lib=libgnu --source-base=import --m4-base=import/m4 --doc-base=doc --tests-base=tests --aux-dir=import/extra --no-conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca canonicalize-lgpl dirent dirfd errno fnmatch-gnu frexpl inttypes limits-h lstat memchr memmem pathmax rawmemchr readlink rename setenv signal-h strchrnul strstr strtok_r sys_stat unistd unsetenv update-copyright wchar wctype-h
>
> # Specification in the form of a few gnulib-tool.m4 macro invocations:
> gl_LOCAL_DIR([])
> @@ -48,12 +48,14 @@ gl_MODULES([
> rawmemchr
> readlink
> rename
> + setenv
> signal-h
> strchrnul
> strstr
> strtok_r
> sys_stat
> unistd
> + unsetenv
> update-copyright
> wchar
> wctype-h
> diff --git a/gdb/gnulib/import/m4/gnulib-comp.m4 b/gdb/gnulib/import/m4/gnulib-comp.m4
> index 42d04ed..5a36567 100644
> --- a/gdb/gnulib/import/m4/gnulib-comp.m4
> +++ b/gdb/gnulib/import/m4/gnulib-comp.m4
> @@ -53,6 +53,7 @@ AC_DEFUN([gl_EARLY],
> # Code from module dirname-lgpl:
> # Code from module dosname:
> # Code from module double-slash-root:
> + # Code from module environ:
> # Code from module errno:
> # Code from module extensions:
> # Code from module extern-inline:
> @@ -94,6 +95,7 @@ AC_DEFUN([gl_EARLY],
> # Code from module rename:
> # Code from module rmdir:
> # Code from module same-inode:
> + # Code from module setenv:
> # Code from module signal-h:
> # Code from module snippet/_Noreturn:
> # Code from module snippet/arg-nonnull:
> @@ -118,6 +120,7 @@ AC_DEFUN([gl_EARLY],
> # Code from module sys_types:
> # Code from module time:
> # Code from module unistd:
> + # Code from module unsetenv:
> # Code from module update-copyright:
> # Code from module verify:
> # Code from module wchar:
> @@ -160,6 +163,8 @@ AC_DEFUN([gl_INIT],
> gl_DIRENT_MODULE_INDICATOR([dirfd])
> gl_DIRNAME_LGPL
> gl_DOUBLE_SLASH_ROOT
> + gl_ENVIRON
> + gl_UNISTD_MODULE_INDICATOR([environ])
> gl_HEADER_ERRNO_H
> AC_REQUIRE([gl_EXTERN_INLINE])
> AC_C_FLEXIBLE_ARRAY_MEMBER
> @@ -285,6 +290,11 @@ AC_DEFUN([gl_INIT],
> AC_LIBOBJ([rmdir])
> fi
> gl_UNISTD_MODULE_INDICATOR([rmdir])
> + gl_FUNC_SETENV
> + if test $HAVE_SETENV = 0 || test $REPLACE_SETENV = 1; then
> + AC_LIBOBJ([setenv])
> + fi
> + gl_STDLIB_MODULE_INDICATOR([setenv])
> gl_SIGNAL_H
> gt_TYPE_SSIZE_T
> gl_FUNC_STAT
> @@ -328,6 +338,12 @@ AC_DEFUN([gl_INIT],
> AC_PROG_MKDIR_P
> gl_HEADER_TIME_H
> gl_UNISTD_H
> + gl_FUNC_UNSETENV
> + if test $HAVE_UNSETENV = 0 || test $REPLACE_UNSETENV = 1; then
> + AC_LIBOBJ([unsetenv])
> + gl_PREREQ_UNSETENV
> + fi
> + gl_STDLIB_MODULE_INDICATOR([unsetenv])
> gl_WCHAR_H
> gl_WCTYPE_H
> # End of code from modules
> @@ -533,6 +549,7 @@ AC_DEFUN([gl_FILE_LIST], [
> lib/rename.c
> lib/rmdir.c
> lib/same-inode.h
> + lib/setenv.c
> lib/signal.in.h
> lib/stat.c
> lib/stdbool.in.h
> @@ -556,6 +573,7 @@ AC_DEFUN([gl_FILE_LIST], [
> lib/time.in.h
> lib/unistd.c
> lib/unistd.in.h
> + lib/unsetenv.c
> lib/verify.h
> lib/wchar.in.h
> lib/wctype-h.c
> @@ -571,6 +589,7 @@ AC_DEFUN([gl_FILE_LIST], [
> m4/dirname.m4
> m4/double-slash-root.m4
> m4/eealloc.m4
> + m4/environ.m4
> m4/errno_h.m4
> m4/exponentd.m4
> m4/exponentl.m4
> @@ -618,6 +637,7 @@ AC_DEFUN([gl_FILE_LIST], [
> m4/readlink.m4
> m4/rename.m4
> m4/rmdir.m4
> + m4/setenv.m4
> m4/signal_h.m4
> m4/ssize_t.m4
> m4/stat.m4
> diff --git a/gdb/gnulib/import/m4/setenv.m4 b/gdb/gnulib/import/m4/setenv.m4
> new file mode 100644
> index 0000000..5d49aba
> --- /dev/null
> +++ b/gdb/gnulib/import/m4/setenv.m4
> @@ -0,0 +1,160 @@
> +# setenv.m4 serial 26
> +dnl Copyright (C) 2001-2004, 2006-2016 Free Software Foundation, Inc.
> +dnl This file is free software; the Free Software Foundation
> +dnl gives unlimited permission to copy and/or distribute it,
> +dnl with or without modifications, as long as this notice is preserved.
> +
> +AC_DEFUN([gl_FUNC_SETENV],
> +[
> + AC_REQUIRE([gl_FUNC_SETENV_SEPARATE])
> + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
> + if test $ac_cv_func_setenv = no; then
> + HAVE_SETENV=0
> + else
> + AC_CACHE_CHECK([whether setenv validates arguments],
> + [gl_cv_func_setenv_works],
> + [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
> + #include <stdlib.h>
> + #include <errno.h>
> + #include <string.h>
> + ]], [[
> + int result = 0;
> + {
> + if (setenv ("", "", 0) != -1)
> + result |= 1;
> + else if (errno != EINVAL)
> + result |= 2;
> + }
> + {
> + if (setenv ("a", "=", 1) != 0)
> + result |= 4;
> + else if (strcmp (getenv ("a"), "=") != 0)
> + result |= 8;
> + }
> + return result;
> + ]])],
> + [gl_cv_func_setenv_works=yes], [gl_cv_func_setenv_works=no],
> + [case "$host_os" in
> + # Guess yes on glibc systems.
> + *-gnu*) gl_cv_func_setenv_works="guessing yes" ;;
> + # If we don't know, assume the worst.
> + *) gl_cv_func_setenv_works="guessing no" ;;
> + esac
> + ])])
> + case "$gl_cv_func_setenv_works" in
> + *yes) ;;
> + *)
> + REPLACE_SETENV=1
> + ;;
> + esac
> + fi
> +])
> +
> +# Like gl_FUNC_SETENV, except prepare for separate compilation
> +# (no REPLACE_SETENV, no AC_LIBOBJ).
> +AC_DEFUN([gl_FUNC_SETENV_SEPARATE],
> +[
> + AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
> + AC_CHECK_DECLS_ONCE([setenv])
> + if test $ac_cv_have_decl_setenv = no; then
> + HAVE_DECL_SETENV=0
> + fi
> + AC_CHECK_FUNCS_ONCE([setenv])
> + gl_PREREQ_SETENV
> +])
> +
> +AC_DEFUN([gl_FUNC_UNSETENV],
> +[
> + AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
> + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
> + AC_CHECK_DECLS_ONCE([unsetenv])
> + if test $ac_cv_have_decl_unsetenv = no; then
> + HAVE_DECL_UNSETENV=0
> + fi
> + AC_CHECK_FUNCS([unsetenv])
> + if test $ac_cv_func_unsetenv = no; then
> + HAVE_UNSETENV=0
> + else
> + HAVE_UNSETENV=1
> + dnl Some BSDs return void, failing to do error checking.
> + AC_CACHE_CHECK([for unsetenv() return type], [gt_cv_func_unsetenv_ret],
> + [AC_COMPILE_IFELSE(
> + [AC_LANG_PROGRAM(
> + [[
> +#undef _BSD
> +#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
> +#include <stdlib.h>
> +extern
> +#ifdef __cplusplus
> +"C"
> +#endif
> +int unsetenv (const char *name);
> + ]],
> + [[]])],
> + [gt_cv_func_unsetenv_ret='int'],
> + [gt_cv_func_unsetenv_ret='void'])])
> + if test $gt_cv_func_unsetenv_ret = 'void'; then
> + AC_DEFINE([VOID_UNSETENV], [1], [Define to 1 if unsetenv returns void
> + instead of int.])
> + REPLACE_UNSETENV=1
> + fi
> +
> + dnl Solaris 10 unsetenv does not remove all copies of a name.
> + dnl Haiku alpha 2 unsetenv gets confused by assignment to environ.
> + dnl OpenBSD 4.7 unsetenv("") does not fail.
> + AC_CACHE_CHECK([whether unsetenv obeys POSIX],
> + [gl_cv_func_unsetenv_works],
> + [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
> + #include <stdlib.h>
> + #include <errno.h>
> + extern char **environ;
> + ]], [[
> + char entry1[] = "a=1";
> + char entry2[] = "b=2";
> + char *env[] = { entry1, entry2, NULL };
> + if (putenv ((char *) "a=1")) return 1;
> + if (putenv (entry2)) return 2;
> + entry2[0] = 'a';
> + unsetenv ("a");
> + if (getenv ("a")) return 3;
> + if (!unsetenv ("") || errno != EINVAL) return 4;
> + entry2[0] = 'b';
> + environ = env;
> + if (!getenv ("a")) return 5;
> + entry2[0] = 'a';
> + unsetenv ("a");
> + if (getenv ("a")) return 6;
> + ]])],
> + [gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no],
> + [case "$host_os" in
> + # Guess yes on glibc systems.
> + *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
> + # If we don't know, assume the worst.
> + *) gl_cv_func_unsetenv_works="guessing no" ;;
> + esac
> + ])])
> + case "$gl_cv_func_unsetenv_works" in
> + *yes) ;;
> + *)
> + REPLACE_UNSETENV=1
> + ;;
> + esac
> + fi
> +])
> +
> +# Prerequisites of lib/setenv.c.
> +AC_DEFUN([gl_PREREQ_SETENV],
> +[
> + AC_REQUIRE([AC_FUNC_ALLOCA])
> + AC_REQUIRE([gl_ENVIRON])
> + AC_CHECK_HEADERS_ONCE([unistd.h])
> + AC_CHECK_HEADERS([search.h])
> + AC_CHECK_FUNCS([tsearch])
> +])
> +
> +# Prerequisites of lib/unsetenv.c.
> +AC_DEFUN([gl_PREREQ_UNSETENV],
> +[
> + AC_REQUIRE([gl_ENVIRON])
> + AC_CHECK_HEADERS_ONCE([unistd.h])
> +])
> diff --git a/gdb/gnulib/import/setenv.c b/gdb/gnulib/import/setenv.c
> new file mode 100644
> index 0000000..85c32cb
> --- /dev/null
> +++ b/gdb/gnulib/import/setenv.c
> @@ -0,0 +1,390 @@
> +/* Copyright (C) 1992, 1995-2003, 2005-2016 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + This program is free software: you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>. */
> +
> +#if !_LIBC
> +/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
> + optimizes away the name == NULL test below. */
> +# define _GL_ARG_NONNULL(params)
> +
> +# define _GL_USE_STDLIB_ALLOC 1
> +# include <config.h>
> +#endif
> +
> +#include <alloca.h>
> +
> +/* Specification. */
> +#include <stdlib.h>
> +
> +#include <errno.h>
> +#ifndef __set_errno
> +# define __set_errno(ev) ((errno) = (ev))
> +#endif
> +
> +#include <string.h>
> +#if _LIBC || HAVE_UNISTD_H
> +# include <unistd.h>
> +#endif
> +
> +#if !_LIBC
> +# include "malloca.h"
> +#endif
> +
> +#if _LIBC || !HAVE_SETENV
> +
> +#if !_LIBC
> +# define __environ environ
> +#endif
> +
> +#if _LIBC
> +/* This lock protects against simultaneous modifications of 'environ'. */
> +# include <bits/libc-lock.h>
> +__libc_lock_define_initialized (static, envlock)
> +# define LOCK __libc_lock_lock (envlock)
> +# define UNLOCK __libc_lock_unlock (envlock)
> +#else
> +# define LOCK
> +# define UNLOCK
> +#endif
> +
> +/* In the GNU C library we must keep the namespace clean. */
> +#ifdef _LIBC
> +# define setenv __setenv
> +# define clearenv __clearenv
> +# define tfind __tfind
> +# define tsearch __tsearch
> +#endif
> +
> +/* In the GNU C library implementation we try to be more clever and
> + allow arbitrarily many changes of the environment given that the used
> + values are from a small set. Outside glibc this will eat up all
> + memory after a while. */
> +#if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \
> + && defined __GNUC__)
> +# define USE_TSEARCH 1
> +# include <search.h>
> +typedef int (*compar_fn_t) (const void *, const void *);
> +
> +/* This is a pointer to the root of the search tree with the known
> + values. */
> +static void *known_values;
> +
> +# define KNOWN_VALUE(Str) \
> + ({ \
> + void *value = tfind (Str, &known_values, (compar_fn_t) strcmp); \
> + value != NULL ? *(char **) value : NULL; \
> + })
> +# define STORE_VALUE(Str) \
> + tsearch (Str, &known_values, (compar_fn_t) strcmp)
> +
> +#else
> +# undef USE_TSEARCH
> +
> +# define KNOWN_VALUE(Str) NULL
> +# define STORE_VALUE(Str) do { } while (0)
> +
> +#endif
> +
> +
> +/* If this variable is not a null pointer we allocated the current
> + environment. */
> +static char **last_environ;
> +
> +
> +/* This function is used by 'setenv' and 'putenv'. The difference between
> + the two functions is that for the former must create a new string which
> + is then placed in the environment, while the argument of 'putenv'
> + must be used directly. This is all complicated by the fact that we try
> + to reuse values once generated for a 'setenv' call since we can never
> + free the strings. */
> +int
> +__add_to_environ (const char *name, const char *value, const char *combined,
> + int replace)
> +{
> + char **ep;
> + size_t size;
> + const size_t namelen = strlen (name);
> + const size_t vallen = value != NULL ? strlen (value) + 1 : 0;
> +
> + LOCK;
> +
> + /* We have to get the pointer now that we have the lock and not earlier
> + since another thread might have created a new environment. */
> + ep = __environ;
> +
> + size = 0;
> + if (ep != NULL)
> + {
> + for (; *ep != NULL; ++ep)
> + if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=')
> + break;
> + else
> + ++size;
> + }
> +
> + if (ep == NULL || *ep == NULL)
> + {
> + char **new_environ;
> +#ifdef USE_TSEARCH
> + char *new_value;
> +#endif
> +
> + /* We allocated this space; we can extend it. */
> + new_environ =
> + (char **) (last_environ == NULL
> + ? malloc ((size + 2) * sizeof (char *))
> + : realloc (last_environ, (size + 2) * sizeof (char *)));
> + if (new_environ == NULL)
> + {
> + /* It's easier to set errno to ENOMEM than to rely on the
> + 'malloc-posix' and 'realloc-posix' gnulib modules. */
> + __set_errno (ENOMEM);
> + UNLOCK;
> + return -1;
> + }
> +
> + /* If the whole entry is given add it. */
> + if (combined != NULL)
> + /* We must not add the string to the search tree since it belongs
> + to the user. */
> + new_environ[size] = (char *) combined;
> + else
> + {
> + /* See whether the value is already known. */
> +#ifdef USE_TSEARCH
> +# ifdef _LIBC
> + new_value = (char *) alloca (namelen + 1 + vallen);
> + __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
> + value, vallen);
> +# else
> + new_value = (char *) malloca (namelen + 1 + vallen);
> + if (new_value == NULL)
> + {
> + __set_errno (ENOMEM);
> + UNLOCK;
> + return -1;
> + }
> + memcpy (new_value, name, namelen);
> + new_value[namelen] = '=';
> + memcpy (&new_value[namelen + 1], value, vallen);
> +# endif
> +
> + new_environ[size] = KNOWN_VALUE (new_value);
> + if (new_environ[size] == NULL)
> +#endif
> + {
> + new_environ[size] = (char *) malloc (namelen + 1 + vallen);
> + if (new_environ[size] == NULL)
> + {
> +#if defined USE_TSEARCH && !defined _LIBC
> + freea (new_value);
> +#endif
> + __set_errno (ENOMEM);
> + UNLOCK;
> + return -1;
> + }
> +
> +#ifdef USE_TSEARCH
> + memcpy (new_environ[size], new_value, namelen + 1 + vallen);
> +#else
> + memcpy (new_environ[size], name, namelen);
> + new_environ[size][namelen] = '=';
> + memcpy (&new_environ[size][namelen + 1], value, vallen);
> +#endif
> + /* And save the value now. We cannot do this when we remove
> + the string since then we cannot decide whether it is a
> + user string or not. */
> + STORE_VALUE (new_environ[size]);
> + }
> +#if defined USE_TSEARCH && !defined _LIBC
> + freea (new_value);
> +#endif
> + }
> +
> + if (__environ != last_environ)
> + memcpy ((char *) new_environ, (char *) __environ,
> + size * sizeof (char *));
> +
> + new_environ[size + 1] = NULL;
> +
> + last_environ = __environ = new_environ;
> + }
> + else if (replace)
> + {
> + char *np;
> +
> + /* Use the user string if given. */
> + if (combined != NULL)
> + np = (char *) combined;
> + else
> + {
> +#ifdef USE_TSEARCH
> + char *new_value;
> +# ifdef _LIBC
> + new_value = alloca (namelen + 1 + vallen);
> + __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1),
> + value, vallen);
> +# else
> + new_value = malloca (namelen + 1 + vallen);
> + if (new_value == NULL)
> + {
> + __set_errno (ENOMEM);
> + UNLOCK;
> + return -1;
> + }
> + memcpy (new_value, name, namelen);
> + new_value[namelen] = '=';
> + memcpy (&new_value[namelen + 1], value, vallen);
> +# endif
> +
> + np = KNOWN_VALUE (new_value);
> + if (np == NULL)
> +#endif
> + {
> + np = (char *) malloc (namelen + 1 + vallen);
> + if (np == NULL)
> + {
> +#if defined USE_TSEARCH && !defined _LIBC
> + freea (new_value);
> +#endif
> + __set_errno (ENOMEM);
> + UNLOCK;
> + return -1;
> + }
> +
> +#ifdef USE_TSEARCH
> + memcpy (np, new_value, namelen + 1 + vallen);
> +#else
> + memcpy (np, name, namelen);
> + np[namelen] = '=';
> + memcpy (&np[namelen + 1], value, vallen);
> +#endif
> + /* And remember the value. */
> + STORE_VALUE (np);
> + }
> +#if defined USE_TSEARCH && !defined _LIBC
> + freea (new_value);
> +#endif
> + }
> +
> + *ep = np;
> + }
> +
> + UNLOCK;
> +
> + return 0;
> +}
> +
> +int
> +setenv (const char *name, const char *value, int replace)
> +{
> + if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
> + {
> + __set_errno (EINVAL);
> + return -1;
> + }
> +
> + return __add_to_environ (name, value, NULL, replace);
> +}
> +
> +/* The 'clearenv' was planned to be added to POSIX.1 but probably
> + never made it. Nevertheless the POSIX.9 standard (POSIX bindings
> + for Fortran 77) requires this function. */
> +int
> +clearenv (void)
> +{
> + LOCK;
> +
> + if (__environ == last_environ && __environ != NULL)
> + {
> + /* We allocated this environment so we can free it. */
> + free (__environ);
> + last_environ = NULL;
> + }
> +
> + /* Clear the environment pointer removes the whole environment. */
> + __environ = NULL;
> +
> + UNLOCK;
> +
> + return 0;
> +}
> +
> +#ifdef _LIBC
> +static void
> +free_mem (void)
> +{
> + /* Remove all traces. */
> + clearenv ();
> +
> + /* Now remove the search tree. */
> + __tdestroy (known_values, free);
> + known_values = NULL;
> +}
> +text_set_element (__libc_subfreeres, free_mem);
> +
> +
> +# undef setenv
> +# undef clearenv
> +weak_alias (__setenv, setenv)
> +weak_alias (__clearenv, clearenv)
> +#endif
> +
> +#endif /* _LIBC || !HAVE_SETENV */
> +
> +/* The rest of this file is called into use when replacing an existing
> + but buggy setenv. Known bugs include failure to diagnose invalid
> + name, and consuming a leading '=' from value. */
> +#if HAVE_SETENV
> +
> +# undef setenv
> +# if !HAVE_DECL_SETENV
> +extern int setenv (const char *, const char *, int);
> +# endif
> +# define STREQ(a, b) (strcmp (a, b) == 0)
> +
> +int
> +rpl_setenv (const char *name, const char *value, int replace)
> +{
> + int result;
> + if (!name || !*name || strchr (name, '='))
> + {
> + errno = EINVAL;
> + return -1;
> + }
> + /* Call the real setenv even if replace is 0, in case implementation
> + has underlying data to update, such as when environ changes. */
> + result = setenv (name, value, replace);
> + if (result == 0 && replace && *value == '=')
> + {
> + char *tmp = getenv (name);
> + if (!STREQ (tmp, value))
> + {
> + int saved_errno;
> + size_t len = strlen (value);
> + tmp = malloca (len + 2);
> + /* Since leading '=' is eaten, double it up. */
> + *tmp = '=';
> + memcpy (tmp + 1, value, len + 1);
> + result = setenv (name, tmp, replace);
> + saved_errno = errno;
> + freea (tmp);
> + errno = saved_errno;
> + }
> + }
> + return result;
> +}
> +
> +#endif /* HAVE_SETENV */
> diff --git a/gdb/gnulib/import/unsetenv.c b/gdb/gnulib/import/unsetenv.c
> new file mode 100644
> index 0000000..8368744
> --- /dev/null
> +++ b/gdb/gnulib/import/unsetenv.c
> @@ -0,0 +1,127 @@
> +/* Copyright (C) 1992, 1995-2002, 2005-2016 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + This program is free software: you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + GNU General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>. */
> +
> +/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc
> + optimizes away the name == NULL test below. */
> +#define _GL_ARG_NONNULL(params)
> +
> +#include <config.h>
> +
> +/* Specification. */
> +#include <stdlib.h>
> +
> +#include <errno.h>
> +#if !_LIBC
> +# define __set_errno(ev) ((errno) = (ev))
> +#endif
> +
> +#include <string.h>
> +#include <unistd.h>
> +
> +#if !_LIBC
> +# define __environ environ
> +#endif
> +
> +#if _LIBC
> +/* This lock protects against simultaneous modifications of 'environ'. */
> +# include <bits/libc-lock.h>
> +__libc_lock_define_initialized (static, envlock)
> +# define LOCK __libc_lock_lock (envlock)
> +# define UNLOCK __libc_lock_unlock (envlock)
> +#else
> +# define LOCK
> +# define UNLOCK
> +#endif
> +
> +/* In the GNU C library we must keep the namespace clean. */
> +#ifdef _LIBC
> +# define unsetenv __unsetenv
> +#endif
> +
> +#if _LIBC || !HAVE_UNSETENV
> +
> +int
> +unsetenv (const char *name)
> +{
> + size_t len;
> + char **ep;
> +
> + if (name == NULL || *name == '\0' || strchr (name, '=') != NULL)
> + {
> + __set_errno (EINVAL);
> + return -1;
> + }
> +
> + len = strlen (name);
> +
> + LOCK;
> +
> + ep = __environ;
> + while (*ep != NULL)
> + if (!strncmp (*ep, name, len) && (*ep)[len] == '=')
> + {
> + /* Found it. Remove this pointer by moving later ones back. */
> + char **dp = ep;
> +
> + do
> + dp[0] = dp[1];
> + while (*dp++);
> + /* Continue the loop in case NAME appears again. */
> + }
> + else
> + ++ep;
> +
> + UNLOCK;
> +
> + return 0;
> +}
> +
> +#ifdef _LIBC
> +# undef unsetenv
> +weak_alias (__unsetenv, unsetenv)
> +#endif
> +
> +#else /* HAVE_UNSETENV */
> +
> +# undef unsetenv
> +# if !HAVE_DECL_UNSETENV
> +# if VOID_UNSETENV
> +extern void unsetenv (const char *);
> +# else
> +extern int unsetenv (const char *);
> +# endif
> +# endif
> +
> +/* Call the underlying unsetenv, in case there is hidden bookkeeping
> + that needs updating beyond just modifying environ. */
> +int
> +rpl_unsetenv (const char *name)
> +{
> + int result = 0;
> + if (!name || !*name || strchr (name, '='))
> + {
> + errno = EINVAL;
> + return -1;
> + }
> + while (getenv (name))
> +# if !VOID_UNSETENV
> + result =
> +# endif
> + unsetenv (name);
> + return result;
> +}
> +
> +#endif /* HAVE_UNSETENV */
> diff --git a/gdb/gnulib/update-gnulib.sh b/gdb/gnulib/update-gnulib.sh
> index 19d949b..2775dc7 100755
> --- a/gdb/gnulib/update-gnulib.sh
> +++ b/gdb/gnulib/update-gnulib.sh
> @@ -46,12 +46,14 @@ IMPORTED_GNULIB_MODULES="\
> rawmemchr \
> readlink \
> rename \
> + setenv \
> signal-h \
> strchrnul \
> strstr \
> strtok_r \
> sys_stat \
> unistd \
> + unsetenv \
> update-copyright \
> wchar \
> wctype-h \
> --
> 2.8.3

--
Sergio
GPG key ID: 237A 54B1 0287 28BF 00EF 31F4 D0EB 7628 65FC 5E36
Please send encrypted e-mail if possible