From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 118957 invoked by alias); 3 Jul 2017 19:35:34 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 118935 invoked by uid 89); 3 Jul 2017 19:35:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RP_MATCHES_RCVD,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 03 Jul 2017 19:35:27 +0000 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C830F7F3ED; Mon, 3 Jul 2017 19:35:25 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com C830F7F3ED Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=sergiodj@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com C830F7F3ED Received: from localhost (unused-10-15-17-193.yyz.redhat.com [10.15.17.193]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6BD516F999; Mon, 3 Jul 2017 19:35:25 +0000 (UTC) From: Sergio Durigan Junior To: Anton Kolesov Cc: gdb-patches@sourceware.org, Francois Bedard , Yao Qi Subject: Re: [PATCH] Import setenv and unsetenv from gnulib References: <87shid8rt3.fsf@redhat.com> <20170703162737.8386-1-Anton.Kolesov@synopsys.com> Date: Mon, 03 Jul 2017 19:35:00 -0000 In-Reply-To: <20170703162737.8386-1-Anton.Kolesov@synopsys.com> (Anton Kolesov's message of "Mon, 3 Jul 2017 19:27:37 +0300") Message-ID: <87k23p8gar.fsf@redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2017-07/txt/msg00014.txt.bz2 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 > > * 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 , 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 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 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 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 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 > + #endif > + /* mingw, BeOS, Haiku declare environ in , not in . */ > + #include > + > + 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 uses 'inline' correctly" >&5 > $as_echo_n "checking whether 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 > + #include > + #include > + > +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 */ > +#include > +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 > + #include > + 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 to declare environ. > + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) > + > + AC_CHECK_HEADERS_ONCE([unistd.h]) > + gt_CHECK_VAR_DECL( > + [#if HAVE_UNISTD_H > + #include > + #endif > + /* mingw, BeOS, Haiku declare environ in , not in . */ > + #include > + ], > + [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 > + #include > + #include > + ]], [[ > + 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 */ > +#include > +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 > + #include > + 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 . */ > + > +#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 > +#endif > + > +#include > + > +/* Specification. */ > +#include > + > +#include > +#ifndef __set_errno > +# define __set_errno(ev) ((errno) = (ev)) > +#endif > + > +#include > +#if _LIBC || HAVE_UNISTD_H > +# include > +#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 > +__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 > +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 . */ > + > +/* Don't use __attribute__ __nonnull__ in this compilation unit. Otherwise gcc > + optimizes away the name == NULL test below. */ > +#define _GL_ARG_NONNULL(params) > + > +#include > + > +/* Specification. */ > +#include > + > +#include > +#if !_LIBC > +# define __set_errno(ev) ((errno) = (ev)) > +#endif > + > +#include > +#include > + > +#if !_LIBC > +# define __environ environ > +#endif > + > +#if _LIBC > +/* This lock protects against simultaneous modifications of 'environ'. */ > +# include > +__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/