diff --git a/src/acconfig.h b/src/acconfig.h
index dc831577b2c4b98e6745392ed2a693316f13f0d3..2bd41b04e63a0bca172c176f173f4a902422eb3b 100644
--- a/src/acconfig.h
+++ b/src/acconfig.h
@@ -153,6 +153,9 @@
  * __chkstk. */
 #undef HAVE_BROKEN_CHKSTK
 
+/* Define if you have a working getcwd */
+#undef HAVE_WORKING_GETCWD
+
 /* Define for solaris */
 #undef SOLARIS
 
diff --git a/src/configure.in b/src/configure.in
index 947181e7654ea89d4baed94cc48fe306e518e541..12db11f809f5691f6a2283ccddf67565fd99b3cc 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -4473,6 +4473,8 @@ AC_CHECK_FUNCS( \
  getrlimit \
  getrusage \
  gettimeofday \
+ getwd \
+ get_current_dir_name \
  inet_ntop \
  gmtime_r \
  gmtime_s \
@@ -4699,6 +4701,89 @@ int accept(int, struct sockaddr *, Psocklen_t);
 AC_MSG_RESULT($pike_cv_accept_size_t *)
 AC_DEFINE_UNQUOTED(ACCEPT_SIZE_T, $pike_cv_accept_size_t)
 
+AC_MSG_CHECKING(for working getcwd)
+AC_CACHE_VAL(pike_cv_func_working_getcwd,
+[
+AC_TRY_RUN([
+#ifndef _LARGEFILE_SOURCE
+#  define _FILE_OFFSET_BITS 64
+#  define _LARGEFILE_SOURCE
+#  define _LARGEFILE64_SOURCE 1
+#endif
+/* HPUX needs these too... */
+#ifndef __STDC_EXT__
+#  define __STDC_EXT__
+#endif /* !__STDC_EXT__ */
+
+#ifndef POSIX_SOURCE
+#define POSIX_SOURCE
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_DIRECT_H
+#include <direct.h>
+#endif /* HAVE_DIRECT_H */
+#ifdef HAVE_SYS_WAIT_H
+#include <sys/wait.h>
+#endif
+#include <signal.h>
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef __NT__
+int sig_child(int arg)
+{
+#ifdef HAVE_WAITPID
+  waitpid(-1,0,WNOHANG);
+#else
+#ifdef HAVE_WAIT3
+  wait3(0,WNOHANG,0);
+#else
+#ifdef HAVE_WAIT4
+  wait3(-1,0,WNOHANG,0);
+#else
+
+  /* Leave them hanging */
+
+#endif /* HAVE_WAIT4 */
+#endif /* HAVE_WAIT3 */
+#endif /* HAVE_WAITPID */
+
+#ifdef SIGNAL_ONESHOT
+  signal(SIGCHLD, sig_child);
+#endif
+}
+
+int sig_alarm() { exit(1); }
+#endif /* !__NT__ */
+
+int main()
+{
+  char *tmp;
+#ifndef __NT__
+  signal(SIGCHLD,sig_child);
+  signal(SIGALRM,sig_alarm);
+  alarm(4);
+#endif /* !__NT__ */
+  tmp=getcwd(0,10000);
+  if(tmp && tmp[0] && (strlen(tmp) < 10000)) {
+    free(tmp);
+    exit(0);
+  }
+  exit(1);
+}
+],pike_cv_func_working_getcwd=yes,pike_cv_func_working_getcwd=no,
+  pike_cv_func_working_getcwd=yes)])
+
+if test "$pike_cv_func_working_getcwd" = yes; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(HAVE_WORKING_GETCWD)
+else
+  AC_MSG_RESULT(no)
+fi
+
 AC_MSG_CHECKING(if mkdir takes 1 or 2 arguments)
 AC_CACHE_VAL(pike_cv_func_mkdir_args,[
 AC_TRY_COMPILE([
diff --git a/src/modules/_Stdio/acconfig.h b/src/modules/_Stdio/acconfig.h
index a71d2cccb84a9e0449abf961161f6fbce00b4252..a05804cb8f98e187233791bc022b093e14714813 100644
--- a/src/modules/_Stdio/acconfig.h
+++ b/src/modules/_Stdio/acconfig.h
@@ -86,9 +86,6 @@
 /* Define if you have strerror.  */
 #undef HAVE_STRERROR
 
-/* Define if you have a working getcwd */
-#undef HAVE_WORKING_GETCWD
-
 /* Do we have socketpair() ? */
 #undef HAVE_SOCKETPAIR
 
diff --git a/src/modules/_Stdio/configure.in b/src/modules/_Stdio/configure.in
index 8f3aada3fe3de995f7a4f051240a1e801b5834dd..ffcf9b547e430b41f3e1899fb130b028226162da 100644
--- a/src/modules/_Stdio/configure.in
+++ b/src/modules/_Stdio/configure.in
@@ -63,7 +63,7 @@ AC_CHECK_LIB(nsl, gethostbyname)
 AC_CHECK_LIB(net, __get_socket_descriptor)
 dnl AC_CHECK_LIB(zfs, libzfs_init)
 
-AC_HAVE_FUNCS(getwd readdir_r statvfs statfs ustat lseek64 lstat fsync \
+AC_HAVE_FUNCS(readdir_r statvfs statfs ustat lseek64 lstat fsync \
  grantpt unlockpt ptsname posix_openpt socketpair writev sendfile munmap \
  madvise poll setsockopt getprotobyname truncate64 ftruncate64 inet_ntoa \
  inet_ntop execve listxattr flistxattr getxattr fgetxattr setxattr fsetxattr \
@@ -1272,80 +1272,6 @@ fi
 AC_DEFINE_UNQUOTED(SOCKET_BUFFER_MAX,$pike_cv_socket_buffer_max)
 AC_MSG_RESULT($pike_cv_socket_buffer_max)
 
-AC_MSG_CHECKING(for working getcwd)
-AC_CACHE_VAL(pike_cv_func_working_getcwd,
-[
-AC_TRY_RUN([
-#ifndef _LARGEFILE_SOURCE
-#  define _FILE_OFFSET_BITS 64
-#  define _LARGEFILE_SOURCE
-#  define _LARGEFILE64_SOURCE 1
-#endif
-/* HPUX needs these too... */
-#ifndef __STDC_EXT__
-#  define __STDC_EXT__
-#endif /* !__STDC_EXT__ */
-
-#ifndef POSIX_SOURCE
-#define POSIX_SOURCE
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifdef HAVE_DIRECT_H
-#include <direct.h>
-#endif /* HAVE_DIRECT_H */
-#include <signal.h>
-
-#ifndef __NT__
-int sig_child(int arg)
-{
-#ifdef HAVE_WAITPID
-  waitpid(-1,0,WNOHANG);
-#else
-#ifdef HAVE_WAIT3
-  wait3(0,WNOHANG,0);
-#else
-#ifdef HAVE_WAIT4
-  wait3(-1,0,WNOHANG,0);
-#else
-
-  /* Leave them hanging */
-
-#endif /* HAVE_WAIT4 */
-#endif /* HAVE_WAIT3 */
-#endif /* HAVE_WAITPID */
-
-#ifdef SIGNAL_ONESHOT
-  my_signal(SIGCHLD, sig_child);
-#endif
-}
-
-int sig_alarm() { exit(1); }
-#endif /* !__NT__ */
-
-int main()
-{
-  char *tmp;
-#ifndef __NT__
-  signal(SIGCHLD,sig_child);
-  signal(SIGALRM,sig_alarm);
-  alarm(4);
-#endif /* !__NT__ */
-  tmp=getcwd(0,10000);
-  if(tmp && strlen(tmp) <10000) exit(0);
-  exit(1);
-}
-],pike_cv_func_working_getcwd=yes,pike_cv_func_working_getcwd=no,
-  pike_cv_func_working_getcwd=yes)])
-
-if test "$pike_cv_func_working_getcwd" = yes; then
-  AC_MSG_RESULT(yes)
-  AC_DEFINE(HAVE_WORKING_GETCWD)
-else
-  AC_MSG_RESULT(no)
-fi
-
 AC_MSG_CHECKING(for pty master device)
 AC_CACHE_VAL(pike_cv_pty_master_pathname, [
   pike_cv_pty_master_pathname=no