From: Eric Blake Date: Thu, 10 Sep 2009 02:52:26 +0000 (-0600) Subject: getcwd: port to mingw X-Git-Tag: v0.1~5505 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=e2b8816f0465fa211eb5b49ecbeb78e9c3cc46b8;p=gnulib.git 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 --- diff --git a/ChangeLog b/ChangeLog index 957a1f6c9..b5b4494ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2009-09-09 Eric Blake + 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 6ebe2fce4..4b8c4c6ce 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 + [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ # include # 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 a/modules/getcwd-tests b/modules/getcwd-tests new file mode 100644 index 000000000..d7eee2b42 --- /dev/null +++ b/modules/getcwd-tests @@ -0,0 +1,10 @@ +Files: +tests/test-getcwd.c + +Depends-on: + +configure.ac: + +Makefile.am: +TESTS += test-getcwd +check_PROGRAMS += test-getcwd diff --git a/tests/test-getcwd.c b/tests/test-getcwd.c new file mode 100644 index 000000000..2733e4f6c --- /dev/null +++ b/tests/test-getcwd.c @@ -0,0 +1,83 @@ +/* Test of getcwd() function. + Copyright (C) 2009 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 + the Free Software Foundation; either version 2 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 . */ + +#include + +#include + +#include +#include +#include + +#define ASSERT(expr) \ + do \ + { \ + if (!(expr)) \ + { \ + fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ + fflush (stderr); \ + abort (); \ + } \ + } \ + while (0) + +int +main (int argc, char **argv) +{ + char *pwd1; + char *pwd2; + /* If the user provides an argument, attempt to chdir there first. */ + if (1 < argc) + { + if (chdir (argv[1]) == 0) + printf ("changed to directory %s\n", argv[1]); + } + + pwd1 = getcwd (NULL, 0); + ASSERT (pwd1 && *pwd1); + if (1 < argc) + printf ("cwd=%s\n", pwd1); + + /* Make sure the result is usable. */ + ASSERT (chdir (pwd1) == 0); + ASSERT (chdir ("././.") == 0); + + /* Make sure that result is normalized. */ + pwd2 = getcwd (NULL, 0); + ASSERT (pwd2); + ASSERT (strcmp (pwd1, pwd2) == 0); + free (pwd2); + { + size_t len = strlen (pwd1); + size_t i = len - 10; + if (i < 0) + i = 0; + pwd2 = malloc (len + 2); + for ( ; i < len; i++) + ASSERT (getcwd (pwd2, i) == NULL); + pwd2 = getcwd (pwd2, len + 1); + ASSERT (pwd2); + pwd2[len] = '/'; + pwd2[len + 1] = '\0'; + } + ASSERT (strstr (pwd2, "/./") == NULL); + ASSERT (strstr (pwd2, "/../") == NULL); + + free (pwd1); + free (pwd2); + + return 0; +}