New module 'environ'.
authorBruno Haible <bruno@clisp.org>
Sun, 24 Feb 2008 15:40:15 +0000 (16:40 +0100)
committerBruno Haible <bruno@clisp.org>
Sun, 24 Feb 2008 15:40:15 +0000 (16:40 +0100)
16 files changed:
ChangeLog
doc/posix-functions/environ.texi
lib/execute.c
lib/pipe.c
lib/setenv.c
lib/unistd.in.h
lib/unsetenv.c
m4/environ.m4 [new file with mode: 0644]
m4/setenv.m4
m4/unistd_h.m4
modules/environ [new file with mode: 0644]
modules/execute
modules/pipe
modules/setenv
modules/unistd
modules/unsetenv

index 926aea5..36e7e06 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,32 @@
 2008-02-24  Bruno Haible  <bruno@clisp.org>
 
+       New module 'environ'.
+       * modules/environ: New file.
+       * lib/unistd.in.h (environ): New declaration.
+       * m4/environ.m4: New file.
+       (gt_CHECK_VAR_DECL): Moved here from m4/setenv.m4. Undefine gt_cv_var
+       after use.
+       * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Initialize GNULIB_ENVIRON and
+       HAVE_DECL_ENVIRON.
+       * modules/unistd (Makefile.am): Substitute also GNULIB_ENVIRON and
+       HAVE_DECL_ENVIRON.
+       * doc/posix-functions/environ.texi: Mention module 'environ'. Remove
+       wrong claim that 'environ' is missing on some systems.
+       * modules/execute (Depends-on): Add environ.
+       * lib/execute.c (environ): Remove fallback declaration.
+       * modules/pipe (Depends-on): Add environ.
+       * lib/pipe.c (environ): Remove fallback declaration.
+       * modules/setenv (Depends-on): Add environ.
+       * lib/setenv.c (environ): Remove fallback declaration.
+       * modules/unsetenv (Depends-on): Add environ.
+       * lib/unsetenv.c (environ): Remove fallback declaration.
+       * m4/setenv.m4 (gt_CHECK_VAR_DECL): Remove macro. Moved to
+       m4/environ.m4.
+       (gl_PREREQ_SETENV): Require gl_ENVIRON instead of testing for environ.
+       (gl_PREREQ_UNSETENV): Likewise.
+
+2008-02-24  Bruno Haible  <bruno@clisp.org>
+
        * doc/posix-functions/environ.texi: Document the MacOS X problem.
 
 2008-02-20  Bob Proulx  <bob@proulx.com>
index ba027d9..e4100fb 100644 (file)
@@ -4,17 +4,14 @@
 
 POSIX specification: @url{http://www.opengroup.org/susv3xsh/environ.html}
 
-Gnulib module: ---
+Gnulib module: environ
 
 Portability problems fixed by Gnulib:
 @itemize
-@end itemize
-
-Portability problems not fixed by Gnulib:
-@itemize
 @item
-This variable is missing on some platforms:
-MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, OSF/1 5.1, Cygwin.
+POSIX does not require this variable to be declared, and it is indeed not
+declared on some platforms:
+MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, IRIX 6.5, Solaris 10.
 @item
 On MacOS X 10, this variable is not declared.  Up to MacOS X 10.4, one can use
 @smallexample
@@ -27,6 +24,10 @@ shared libraries on MacOS X 10.5.  Here is a workaround: Instead, one can use
 #define environ (*_NSGetEnviron())
 @end smallexample
 This works at least on MacOS X 10.3 and newer.
+@end itemize
+
+Portability problems not fixed by Gnulib:
+@itemize
 @item
 The address of this variable is not a compile-time constant on some platforms:
 mingw.
index 30ce000..cfac196 100644 (file)
@@ -1,5 +1,5 @@
 /* Creation of autonomous subprocesses.
-   Copyright (C) 2001-2004, 2006-2007 Free Software Foundation, Inc.
+   Copyright (C) 2001-2004, 2006-2008 Free Software Foundation, Inc.
    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 
    This program is free software: you can redistribute it and/or modify
 
 #endif
 
-#if ! HAVE_ENVIRON_DECL
-extern char **environ;
-#endif
-
 #ifndef STDIN_FILENO
 # define STDIN_FILENO 0
 #endif
index f10cc95..e62d137 100644 (file)
@@ -1,5 +1,5 @@
 /* Creation of subprocesses, communicating via pipes.
-   Copyright (C) 2001-2004, 2006-2007 Free Software Foundation, Inc.
+   Copyright (C) 2001-2004, 2006-2008 Free Software Foundation, Inc.
    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 
    This program is free software: you can redistribute it and/or modify
 
 #endif
 
-#if ! HAVE_ENVIRON_DECL
-extern char **environ;
-#endif
-
 #ifndef STDIN_FILENO
 # define STDIN_FILENO 0
 #endif
index ea1d116..83b52b8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992,1995-1999,2000-2003,2005-2007 Free Software Foundation, Inc.
+/* Copyright (C) 1992,1995-1999,2000-2003,2005-2008 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
@@ -40,9 +40,6 @@
 
 #if !_LIBC
 # define __environ     environ
-# ifndef HAVE_ENVIRON_DECL
-extern char **environ;
-# endif
 #endif
 
 #if _LIBC
index 5400c86..346b8b4 100644 (file)
@@ -1,5 +1,5 @@
 /* Substitute for and wrapper around <unistd.h>.
-   Copyright (C) 2004-2007 Free Software Foundation, Inc.
+   Copyright (C) 2004-2008 Free Software Foundation, Inc.
 
    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
@@ -86,6 +86,26 @@ extern int dup2 (int oldfd, int newfd);
 #endif
 
 
+#if @GNULIB_ENVIRON@
+# if !@HAVE_DECL_ENVIRON@
+/* Set of environment variables and values.  An array of strings of the form
+   "VARIABLE=VALUE", terminated with a NULL.  */
+#  if defined __APPLE__ && defined __MACH__
+#   include <crt_externs.h>
+#   define environ (*_NSGetEnviron ())
+#  else
+extern char **environ;
+#  endif
+# endif
+#elif defined GNULIB_POSIXCHECK
+# undef environ
+# define environ \
+    (GL_LINK_WARNING ("environ is unportable - " \
+                      "use gnulib module environ for portability"), \
+     environ)
+#endif
+
+
 #if @GNULIB_FCHDIR@
 # if @REPLACE_FCHDIR@
 
index c783997..73ea878 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992,1995-1999,2000-2002,2005-2007 Free Software Foundation, Inc.
+/* Copyright (C) 1992,1995-1999,2000-2002,2005-2008 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
@@ -29,9 +29,6 @@
 
 #if !_LIBC
 # define __environ     environ
-# ifndef HAVE_ENVIRON_DECL
-extern char **environ;
-# endif
 #endif
 
 #if _LIBC
diff --git a/m4/environ.m4 b/m4/environ.m4
new file mode 100644 (file)
index 0000000..fac0c05
--- /dev/null
@@ -0,0 +1,36 @@
+# environ.m4 serial 1
+dnl Copyright (C) 2001-2004, 2006-2008 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_ENVIRON],
+[
+  AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
+  dnl Persuade glibc <unistd.h> to declare environ.
+  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])
+  gt_CHECK_VAR_DECL([#include <unistd.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_TRY_COMPILE([$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_]translit($2, [a-z], [A-Z])[_DECL], 1,
+              [Define if you have the declaration of $2.])
+  fi
+  undefine([gt_cv_var])
+])
index bbb5548..7af13d7 100644 (file)
@@ -1,5 +1,5 @@
-# setenv.m4 serial 9
-dnl Copyright (C) 2001-2004, 2006-2007 Free Software Foundation, Inc.
+# setenv.m4 serial 10
+dnl Copyright (C) 2001-2004, 2006-2008 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.
@@ -53,38 +53,19 @@ int unsetenv();
   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_TRY_COMPILE([$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_]translit($2, [a-z], [A-Z])[_DECL], 1,
-              [Define if you have the declaration of $2.])
-  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)
-  gt_CHECK_VAR_DECL([#include <unistd.h>], environ)
 ])
 
 # Prerequisites of lib/unsetenv.c.
 AC_DEFUN([gl_PREREQ_UNSETENV],
 [
+  AC_REQUIRE([gl_ENVIRON])
   AC_CHECK_HEADERS_ONCE(unistd.h)
-  gt_CHECK_VAR_DECL([#include <unistd.h>], environ)
 ])
index 4b8857c..e8ccab1 100644 (file)
@@ -1,5 +1,5 @@
-# unistd_h.m4 serial 10
-dnl Copyright (C) 2006-2007 Free Software Foundation, Inc.
+# unistd_h.m4 serial 11
+dnl Copyright (C) 2006-2008 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.
@@ -34,6 +34,7 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS],
 [
   GNULIB_CHOWN=0;         AC_SUBST([GNULIB_CHOWN])
   GNULIB_DUP2=0;          AC_SUBST([GNULIB_DUP2])
+  GNULIB_ENVIRON=0;       AC_SUBST([GNULIB_ENVIRON])
   GNULIB_FCHDIR=0;        AC_SUBST([GNULIB_FCHDIR])
   GNULIB_FTRUNCATE=0;     AC_SUBST([GNULIB_FTRUNCATE])
   GNULIB_GETCWD=0;        AC_SUBST([GNULIB_GETCWD])
@@ -49,6 +50,7 @@ AC_DEFUN([gl_UNISTD_H_DEFAULTS],
   HAVE_GETPAGESIZE=1;     AC_SUBST([HAVE_GETPAGESIZE])
   HAVE_READLINK=1;        AC_SUBST([HAVE_READLINK])
   HAVE_SLEEP=1;           AC_SUBST([HAVE_SLEEP])
+  HAVE_DECL_ENVIRON=1;    AC_SUBST([HAVE_DECL_ENVIRON])
   HAVE_DECL_GETLOGIN_R=1; AC_SUBST([HAVE_DECL_GETLOGIN_R])
   HAVE_OS_H=0;            AC_SUBST([HAVE_OS_H])
   HAVE_SYS_PARAM_H=0;     AC_SUBST([HAVE_SYS_PARAM_H])
diff --git a/modules/environ b/modules/environ
new file mode 100644 (file)
index 0000000..3057619
--- /dev/null
@@ -0,0 +1,24 @@
+Description:
+environ variable: storage of environment variables.
+
+Files:
+m4/environ.m4
+
+Depends-on:
+unistd
+
+configure.ac:
+gl_ENVIRON
+gl_UNISTD_MODULE_INDICATOR([environ])
+
+Makefile.am:
+
+Include:
+#include <unistd.h>
+
+License:
+LGPLv2+
+
+Maintainer:
+Bruno Haible
+
index 00f1861..d5f6ce6 100644 (file)
@@ -16,6 +16,7 @@ gettext-h
 stdbool
 strpbrk
 unistd
+environ
 
 configure.ac:
 gl_EXECUTE
index 0aab325..aef9389 100644 (file)
@@ -16,6 +16,7 @@ gettext-h
 stdbool
 strpbrk
 unistd
+environ
 
 configure.ac:
 gl_PIPE
index 1c93bfb..0458c38 100644 (file)
@@ -10,6 +10,7 @@ stdlib
 malloca
 alloca-opt
 unistd
+environ
 
 configure.ac:
 gl_FUNC_SETENV
index 4d16cf3..88fc993 100644 (file)
@@ -25,6 +25,7 @@ unistd.h: unistd.in.h
              -e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
              -e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \
              -e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \
+             -e 's|@''GNULIB_ENVIRON''@|$(GNULIB_ENVIRON)|g' \
              -e 's|@''GNULIB_FCHDIR''@|$(GNULIB_FCHDIR)|g' \
              -e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \
              -e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \
@@ -39,6 +40,7 @@ unistd.h: unistd.in.h
              -e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
              -e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
              -e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
+             -e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
              -e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
              -e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \
              -e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
index 261c8e4..6dff883 100644 (file)
@@ -8,6 +8,7 @@ m4/setenv.m4
 Depends-on:
 stdlib
 unistd
+environ
 
 configure.ac:
 gl_FUNC_UNSETENV