[PATCH] getcwd: fix mingw bugs

2011-04-27 Thread Eric Blake
On mingw, getcwd(NULL,1) succeeds, even though glibc documents that
with a non-zero size, the allocation will not exceed that many bytes.

On mingw, getcwd has the wrong signature.  However, we don't have
to check for this if anything else triggers the replacement.

Also, fix a type bug that crept into the original getcwd-lgpl commit.

* m4/getcwd.m4 (gl_FUNC_GETCWD_NULL): Detect one mingw bug.
* doc/posix-functions/getcwd.texi (getcwd): Document the problems.
* lib/getcwd-lgpl.c (rpl_getcwd): Fix return type.

Signed-off-by: Eric Blake ebl...@redhat.com
---



 ChangeLog   |7 +++
 doc/posix-functions/getcwd.texi |7 ++-
 lib/getcwd-lgpl.c   |2 +-
 m4/getcwd.m4|   10 ++
 4 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index f20299f..8dae3ab 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-04-27  Eric Blake  ebl...@redhat.com
+
+   getcwd: fix mingw bugs
+   * m4/getcwd.m4 (gl_FUNC_GETCWD_NULL): Detect one mingw bug.
+   * doc/posix-functions/getcwd.texi (getcwd): Document the problems.
+   * lib/getcwd-lgpl.c (rpl_getcwd): Fix return type.
+
 2011-04-27  Bruno Haible  br...@clisp.org

mkstemps: Ensure declaration on MacOS X 10.5.
diff --git a/doc/posix-functions/getcwd.texi b/doc/posix-functions/getcwd.texi
index a8dba96..1f6dd18 100644
--- a/doc/posix-functions/getcwd.texi
+++ b/doc/posix-functions/getcwd.texi
@@ -11,7 +11,12 @@ getcwd
 @itemize
 @item
 On glibc platforms, @code{getcwd (NULL, n)} allocates memory for the result.
-On other platforms, this call is not allowed.
+On some other platforms, this call is not allowed.  Conversely, mingw fails
+to honor non-zero @code{n}.
+@item
+On some platforms, the prototype for @code{getcwd} uses @code{int}
+instead of @code{size_t} for the size argument:
+mingw.
 @end itemize

 Portability problems fixed by Gnulib module @code{getcwd}:
diff --git a/lib/getcwd-lgpl.c b/lib/getcwd-lgpl.c
index a5596f8..53c5562 100644
--- a/lib/getcwd-lgpl.c
+++ b/lib/getcwd-lgpl.c
@@ -53,7 +53,7 @@ rpl_getcwd (char *buf, size_t size)
   if (!buf)
 {
   errno = ENOMEM;
-  return -1;
+  return NULL;
 }
   result = getcwd (buf, size);
   if (!result)
diff --git a/m4/getcwd.m4 b/m4/getcwd.m4
index 55f9372..eb2c9d9 100644
--- a/m4/getcwd.m4
+++ b/m4/getcwd.m4
@@ -6,7 +6,7 @@
 # with or without modifications, as long as this notice is preserved.

 # Written by Paul Eggert.
-# serial 5
+# serial 6

 AC_DEFUN([gl_FUNC_GETCWD_NULL],
   [
@@ -20,7 +20,8 @@ AC_DEFUN([gl_FUNC_GETCWD_NULL],
 #endif
 ]], [[
 #if (defined _WIN32 || defined __WIN32__)  ! defined __CYGWIN__
-/* mingw cwd does not start with '/', but getcwd does allocate.  */
+/* mingw cwd does not start with '/', but getcwd does allocate.
+   However, mingw fails to honor non-zero size.  */
 #else
if (chdir (/) != 0)
  return 1;
@@ -36,6 +37,9 @@ AC_DEFUN([gl_FUNC_GETCWD_NULL],
return 0;
  }
 #endif
+ /* If size is non-zero, allocation must fail if size is too small */
+ if (getcwd (NULL, 1))
+   return 5;
  ]])],
 [gl_cv_func_getcwd_null=yes],
 [gl_cv_func_getcwd_null=no],
@@ -45,8 +49,6 @@ AC_DEFUN([gl_FUNC_GETCWD_NULL],
  *-gnu*)   gl_cv_func_getcwd_null=guessing yes;;
# Guess yes on Cygwin.
  cygwin*)  gl_cv_func_getcwd_null=guessing yes;;
-   # Guess yes on mingw.
- mingw*)   gl_cv_func_getcwd_null=guessing yes;;
# If we don't know, assume the worst.
  *)gl_cv_func_getcwd_null=guessing no;;
esac
-- 
1.7.4.4




getcwd on mingw

2010-04-03 Thread Bruno Haible
On mingw, I'm seeing this error in the C++ namespace tests:

../gllib/unistd.h:794: error: invalid conversion from `char*(*)(char*, int)' to 
`char*(*)(char*, size_t)'

This should fix it:


2010-04-03  Bruno Haible  br...@clisp.org

unistd: Fix C++ test error on mingw.
* lib/unistd.in.h (getcwd): Use _GL_CXXALIAS_SYS_CAST.

--- lib/unistd.in.h.origSat Apr  3 12:28:38 2010
+++ lib/unistd.in.h Sat Apr  3 12:28:19 2010
@@ -525,7 +525,9 @@
 _GL_FUNCDECL_RPL (getcwd, char *, (char *buf, size_t size));
 _GL_CXXALIAS_RPL (getcwd, char *, (char *buf, size_t size));
 # else
-_GL_CXXALIAS_SYS (getcwd, char *, (char *buf, size_t size));
+/* Need to cast, because on mingw, the second parameter is
+   int size.  */
+_GL_CXXALIAS_SYS_CAST (getcwd, char *, (char *buf, size_t size));
 # endif
 _GL_CXXALIASWARN (getcwd);
 #elif defined GNULIB_POSIXCHECK




getcwd on mingw

2009-09-09 Thread Eric Blake
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

getcwd does not need replacement on mingw, even though it fails runtime
tests in getcwd.m4, and even though cross-compilation was pessimistic.
This fixes things, and adds a simple unit test to prove that getcwd is
behaving reasonably.

- --
Don't work too hard, make some time for fun as well!

Eric Blake e...@byu.net
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAkqobcsACgkQ84KuGfSFAYAv2QCgzG824yQId4/U2Py/Tf1H4aj9
okwAoLI0e3dKh1cFQ50FM+rH52pSCC8g
=wymK
-END PGP SIGNATURE-
From e2b8816f0465fa211eb5b49ecbeb78e9c3cc46b8 Mon Sep 17 00:00:00 2001
From: Eric Blake e...@byu.net
Date: Wed, 9 Sep 2009 20:52:26 -0600
Subject: [PATCH] getcwd: port to mingw

* m4/getcwd.m4 (gl_FUNC_GETCWD): Mingw directories are very
different from the POSIX assumptions made throughout the getcwd
module; fortunately, the mingw getcwd does not need replacement.
(gl_FUNC_GETCWD_NULL): Skip test on mingw.
* modules/getcwd-tests: New test.
* tests/test-getcwd.c: Likewise.

Signed-off-by: Eric Blake e...@byu.net
---
 ChangeLog|8 +
 m4/getcwd.m4 |   44 ++
 modules/getcwd-tests |   10 ++
 tests/test-getcwd.c  |   83 ++
 4 files changed, 131 insertions(+), 14 deletions(-)
 create mode 100644 modules/getcwd-tests
 create mode 100644 tests/test-getcwd.c

diff --git a/ChangeLog b/ChangeLog
index 957a1f6..b5b4494 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2009-09-09  Eric Blake  e...@byu.net

+   getcwd: port to mingw
+   * m4/getcwd.m4 (gl_FUNC_GETCWD): Mingw directories are very
+   different from the POSIX assumptions made throughout the getcwd
+   module; fortunately, the mingw getcwd does not need replacement.
+   (gl_FUNC_GETCWD_NULL): Skip test on mingw.
+   * modules/getcwd-tests: New test.
+   * tests/test-getcwd.c: Likewise.
+
link: fix platform bugs
* m4/link.m4 (gl_FUNC_LINK): Detect Solaris and Cygwin bugs.
* lib/link.c (link): Work around them.  Fix related mingw bug.
diff --git a/m4/getcwd.m4 b/m4/getcwd.m4
index 6ebe2fc..4b8c4c6 100644
--- a/m4/getcwd.m4
+++ b/m4/getcwd.m4
@@ -1,53 +1,69 @@
 # getcwd.m4 - check for working getcwd that is compatible with glibc

-# Copyright (C) 2001, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, 
Inc.
+# Copyright (C) 2001, 2003, 2004, 2005, 2006, 2007, 2009 Free Software
+# Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.

 # Written by Paul Eggert.
+# serial 2

 AC_DEFUN([gl_FUNC_GETCWD_NULL],
   [
AC_CACHE_CHECK([whether getcwd (NULL, 0) allocates memory for result],
  [gl_cv_func_getcwd_null],
- [AC_TRY_RUN(
-[
-#   include stdlib.h
+ [AC_RUN_IFELSE([AC_LANG_PROGRAM([[
 #   include unistd.h
 #   ifndef getcwd
 char *getcwd ();
 #   endif
-int
-main ()
-{
+]], [[
+#if (defined _WIN32 || defined __WIN32__)  ! defined __CYGWIN__
+/* mingw cwd does not start with '/', but getcwd does allocate.  */
+#else
   if (chdir (/) != 0)
-exit (1);
+return 1;
   else
 {
   char *f = getcwd (NULL, 0);
-  exit (! (f  f[0] == '/'  !f[1]));
+  return ! (f  f[0] == '/'  !f[1]);
 }
-}],
+#endif
+]])],
[gl_cv_func_getcwd_null=yes],
[gl_cv_func_getcwd_null=no],
-   [gl_cv_func_getcwd_null=no])])
+   [[
+   case $host_os in
+   # Guess yes on glibc systems.
+ *-gnu*)   gl_cv_func_getcwd_null=guessing yes;;
+   # Guess yes on Cygwin.
+ cygwin*)  gl_cv_func_getcwd_null=guessing yes;;
+   # Guess yes on mingw.
+ mingw*)   gl_cv_func_getcwd_null=guessing yes;;
+   # If we don't know, assume the worst.
+ *)gl_cv_func_getcwd_null=guessing no;;
+   esac
+   ]])])
 ])

 AC_DEFUN([gl_FUNC_GETCWD],
 [
   AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
   AC_REQUIRE([gl_FUNC_GETCWD_NULL])
+  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles

   gl_abort_bug=no
-  case $gl_cv_func_getcwd_null in
-  yes)
+  case $gl_cv_func_getcwd_null,$host_os in
+  *,mingw*)
+gl_cv_func_getcwd_path_max=yes;;
+  yes,*)
 gl_FUNC_GETCWD_PATH_MAX
 gl_FUNC_GETCWD_ABORT_BUG([gl_abort_bug=yes]);;
   esac

   case $gl_cv_func_getcwd_null,$gl_cv_func_getcwd_path_max,$gl_abort_bug in
-  yes,yes,no) ;;
+  *yes,yes,no) ;;
   *)
 REPLACE_GETCWD=1
 AC_LIBOBJ([getcwd])
diff --git