105436638acc7c010349a69c3395f1a57c642dc62Ying Wang# setenv.m4 serial 26
205436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl Copyright (C) 2001-2004, 2006-2012 Free Software Foundation, Inc.
305436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl This file is free software; the Free Software Foundation
405436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl gives unlimited permission to copy and/or distribute it,
505436638acc7c010349a69c3395f1a57c642dc62Ying Wangdnl with or without modifications, as long as this notice is preserved.
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
705436638acc7c010349a69c3395f1a57c642dc62Ying WangAC_DEFUN([gl_FUNC_SETENV],
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang[
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([gl_FUNC_SETENV_SEPARATE])
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if test $ac_cv_func_setenv = no; then
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    HAVE_SETENV=0
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    AC_CACHE_CHECK([whether setenv validates arguments],
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [gl_cv_func_setenv_works],
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #include <stdlib.h>
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #include <errno.h>
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #include <string.h>
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang      ]], [[
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       int result = 0;
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       {
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang         if (setenv ("", "", 0) != -1)
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang           result |= 1;
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang         else if (errno != EINVAL)
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang           result |= 2;
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       }
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       {
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang         if (setenv ("a", "=", 1) != 0)
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang           result |= 4;
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang         else if (strcmp (getenv ("a"), "=") != 0)
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang           result |= 8;
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       }
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       return result;
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      ]])],
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [gl_cv_func_setenv_works=yes], [gl_cv_func_setenv_works=no],
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [case "$host_os" in
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 # Guess yes on glibc systems.
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang         *-gnu*) gl_cv_func_setenv_works="guessing yes" ;;
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 # If we don't know, assume the worst.
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang         *)      gl_cv_func_setenv_works="guessing no" ;;
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       esac
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang      ])])
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    case "$gl_cv_func_setenv_works" in
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      *yes) ;;
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      *)
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        REPLACE_SETENV=1
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        ;;
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    esac
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fi
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang])
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Like gl_FUNC_SETENV, except prepare for separate compilation
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# (no REPLACE_SETENV, no AC_LIBOBJ).
5505436638acc7c010349a69c3395f1a57c642dc62Ying WangAC_DEFUN([gl_FUNC_SETENV_SEPARATE],
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang[
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_DECLS_ONCE([setenv])
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if test $ac_cv_have_decl_setenv = no; then
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    HAVE_DECL_SETENV=0
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fi
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_FUNCS_ONCE([setenv])
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  gl_PREREQ_SETENV
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang])
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6605436638acc7c010349a69c3395f1a57c642dc62Ying WangAC_DEFUN([gl_FUNC_UNSETENV],
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([gl_STDLIB_H_DEFAULTS])
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_DECLS_ONCE([unsetenv])
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if test $ac_cv_have_decl_unsetenv = no; then
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    HAVE_DECL_UNSETENV=0
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fi
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_FUNCS([unsetenv])
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if test $ac_cv_func_unsetenv = no; then
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    HAVE_UNSETENV=0
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  else
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang    HAVE_UNSETENV=1
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang    dnl Some BSDs return void, failing to do error checking.
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    AC_CACHE_CHECK([for unsetenv() return type], [gt_cv_func_unsetenv_ret],
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [AC_COMPILE_IFELSE(
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang         [AC_LANG_PROGRAM(
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            [[
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#undef _BSD
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define _BSD 1 /* unhide unsetenv declaration in OSF/1 5.1 <stdlib.h> */
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <stdlib.h>
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang"C"
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wangint unsetenv (const char *name);
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang            ]],
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang            [[]])],
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang         [gt_cv_func_unsetenv_ret='int'],
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang         [gt_cv_func_unsetenv_ret='void'])])
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    if test $gt_cv_func_unsetenv_ret = 'void'; then
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      AC_DEFINE([VOID_UNSETENV], [1], [Define to 1 if unsetenv returns void
9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       instead of int.])
9905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      REPLACE_UNSETENV=1
10005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    fi
10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang
10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    dnl Solaris 10 unsetenv does not remove all copies of a name.
10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang    dnl Haiku alpha 2 unsetenv gets confused by assignment to environ.
10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    dnl OpenBSD 4.7 unsetenv("") does not fail.
10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    AC_CACHE_CHECK([whether unsetenv obeys POSIX],
10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [gl_cv_func_unsetenv_works],
10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #include <stdlib.h>
10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       #include <errno.h>
11005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       extern char **environ;
11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      ]], [[
11205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       char entry1[] = "a=1";
11305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       char entry2[] = "b=2";
11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       char *env[] = { entry1, entry2, NULL };
11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       if (putenv ((char *) "a=1")) return 1;
11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       if (putenv (entry2)) return 2;
11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang       entry2[0] = 'a';
11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang       unsetenv ("a");
11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang       if (getenv ("a")) return 3;
12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang       if (!unsetenv ("") || errno != EINVAL) return 4;
12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang       entry2[0] = 'b';
12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang       environ = env;
12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang       if (!getenv ("a")) return 5;
12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       entry2[0] = 'a';
12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang       unsetenv ("a");
12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang       if (getenv ("a")) return 6;
12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      ]])],
12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [gl_cv_func_unsetenv_works=yes], [gl_cv_func_unsetenv_works=no],
12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      [case "$host_os" in
13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 # Guess yes on glibc systems.
13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang         *-gnu*) gl_cv_func_unsetenv_works="guessing yes" ;;
13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                 # If we don't know, assume the worst.
13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang         *)      gl_cv_func_unsetenv_works="guessing no" ;;
13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang       esac
13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      ])])
13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang    case "$gl_cv_func_unsetenv_works" in
13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      *yes) ;;
13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang      *)
13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang        REPLACE_UNSETENV=1
14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang        ;;
14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang    esac
14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  fi
14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang])
14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Prerequisites of lib/setenv.c.
14605436638acc7c010349a69c3395f1a57c642dc62Ying WangAC_DEFUN([gl_PREREQ_SETENV],
14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[
14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([AC_FUNC_ALLOCA])
14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([gl_ENVIRON])
15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_HEADERS_ONCE([unistd.h])
15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_HEADERS([search.h])
15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_FUNCS([tsearch])
15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang])
15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang# Prerequisites of lib/unsetenv.c.
15605436638acc7c010349a69c3395f1a57c642dc62Ying WangAC_DEFUN([gl_PREREQ_UNSETENV],
15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang[
15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_REQUIRE([gl_ENVIRON])
15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  AC_CHECK_HEADERS_ONCE([unistd.h])
16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang])
161