This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Import setenv and unsetenv from gnulib


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
http://sergiodj.net/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]