changeset 9721:1d443a80afc4

New module 'environ'.
author Bruno Haible <bruno@clisp.org>
date Sun, 24 Feb 2008 16:40:15 +0100
parents 46b3aff8518a
children bf2be774be35
files 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 m4/setenv.m4 m4/unistd_h.m4 modules/environ modules/execute modules/pipe modules/setenv modules/unistd modules/unsetenv
diffstat 16 files changed, 134 insertions(+), 51 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+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.
--- a/doc/posix-functions/environ.texi
+++ b/doc/posix-functions/environ.texi
@@ -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 @@
 #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.
--- a/lib/execute.c
+++ b/lib/execute.c
@@ -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
@@ -54,10 +54,6 @@
 
 #endif
 
-#if ! HAVE_ENVIRON_DECL
-extern char **environ;
-#endif
-
 #ifndef STDIN_FILENO
 # define STDIN_FILENO 0
 #endif
--- a/lib/pipe.c
+++ b/lib/pipe.c
@@ -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
@@ -53,10 +53,6 @@
 
 #endif
 
-#if ! HAVE_ENVIRON_DECL
-extern char **environ;
-#endif
-
 #ifndef STDIN_FILENO
 # define STDIN_FILENO 0
 #endif
--- a/lib/setenv.c
+++ b/lib/setenv.c
@@ -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
--- a/lib/unistd.in.h
+++ b/lib/unistd.in.h
@@ -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 @@
 #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@
 
--- a/lib/unsetenv.c
+++ b/lib/unsetenv.c
@@ -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
new file mode 100644
--- /dev/null
+++ b/m4/environ.m4
@@ -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])
+])
--- a/m4/setenv.m4
+++ b/m4/setenv.m4
@@ -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 @@
   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)
 ])
--- a/m4/unistd_h.m4
+++ b/m4/unistd_h.m4
@@ -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 @@
 [
   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 @@
   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])
new file mode 100644
--- /dev/null
+++ b/modules/environ
@@ -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
+
--- a/modules/execute
+++ b/modules/execute
@@ -16,6 +16,7 @@
 stdbool
 strpbrk
 unistd
+environ
 
 configure.ac:
 gl_EXECUTE
--- a/modules/pipe
+++ b/modules/pipe
@@ -16,6 +16,7 @@
 stdbool
 strpbrk
 unistd
+environ
 
 configure.ac:
 gl_PIPE
--- a/modules/setenv
+++ b/modules/setenv
@@ -10,6 +10,7 @@
 malloca
 alloca-opt
 unistd
+environ
 
 configure.ac:
 gl_FUNC_SETENV
--- a/modules/unistd
+++ b/modules/unistd
@@ -25,6 +25,7 @@
 	      -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 @@
 	      -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' \
--- a/modules/unsetenv
+++ b/modules/unsetenv
@@ -8,6 +8,7 @@
 Depends-on:
 stdlib
 unistd
+environ
 
 configure.ac:
 gl_FUNC_UNSETENV