diff --git a/src/modules/files/configure.in b/src/modules/files/configure.in
index 138f65ad1ee29eaa71a2daa8d92d31f067b66504..0a088d195a1426bf22e12e1b635921203a455dac 100644
--- a/src/modules/files/configure.in
+++ b/src/modules/files/configure.in
@@ -10,7 +10,7 @@ AC_HAVE_HEADERS(arpa/inet.h sys/socketvar.h netinet/in.h \
 AC_HEADER_DIRENT
 AC_CHECK_LIB(socket, socket)
 
-AC_HAVE_FUNCS(socketpair)
+AC_HAVE_FUNCS(socketpair getwd)
 
 AC_MSG_CHECKING(size of socket buffers)
 AC_CACHE_VAL(lpc_cv_socket_buffer_max,
@@ -58,6 +58,54 @@ lpc_cv_socket_buffer_max=0
 AC_DEFINE_UNQUOTED(SOCKET_BUFFER_MAX,$lpc_cv_socket_buffer_max)
 AC_MSG_RESULT($lpc_cv_socket_buffer_max)
 
+
+AC_MSG_CHECKING(for working getcwd)
+AC_CACHE_VAL(lpc_cv_func_working_getcwd,
+[
+AC_TRY_RUN([
+#include <unistd.h>
+#include <signal.h>
+
+int sig_child(int arg)
+{
+#ifdef HAVE_WAITPID
+  waitpid(-1,0,WNOHANG);
+#else
+#ifdef HAVE_WAIT3
+  wait3(-1,0,WNOHANG);
+#else
+
+  /* Leave'em hanging */
+
+#endif /* HAVE_WAIT3 */
+#endif /* HAVE_WAITPID */
+
+#ifdef SIGNAL_ONESHOT
+  my_signal(SIGCHLD, sig_child);
+#endif
+}
+
+int sig_alarm() { exit(1); }
+
+int main()
+{
+  char *tmp;
+  signal(SIGCHLD,sig_child);
+  signal(SIGALRM,sig_alarm);
+  alarm(4);
+  tmp=getcwd(0,10000);
+  if(tmp && strlen(tmp) <10000) exit(0);
+  exit(1);
+}
+],lpc_cv_func_working_getcwd=yes,lpc_cv_func_working_getcwd=no)])
+
+if test "$lpc_cv_func_working_getcwd" = yes; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(HAVE_WORKING_GETCWD)
+else
+  AC_MSG_RESULT(no)
+fi
+
 AC_OUTPUT(Makefile,echo FOO >stamp-h )
 
 
diff --git a/src/modules/files/efuns.c b/src/modules/files/efuns.c
index ba75f2805f652954b23859a068ef83ef0125f530..b0a07205d0bee0be3e53ecc5383ccf4935bb1b9a 100644
--- a/src/modules/files/efuns.c
+++ b/src/modules/files/efuns.c
@@ -197,20 +197,29 @@ void f_cd(INT32 args)
 void f_getcwd(INT32 args)
 {
   char *e;
-  pop_n_elems(args);
-
-#ifdef HAVE_GETCWD
-  e=(char *)getcwd(0,1000); 
+#if defined(HAVE_WORKING_GETCWD) || !defined(HAVE_GETWD)
+  char *tmp;
+  INT32 size;
+
+  size=1000;
+  do {
+    tmp=(char *)xalloc(size);
+    e=(char *)getcwd(tmp,1000); 
+    if (e || errno!=ERANGE) break;
+    free((char *)tmp);
+    size*=2;
+  } while (size < 10000);
 #else
 
 #ifndef MAXPATHLEN
 #define MAXPATHLEN 32768
 #endif
-
   e=(char *)getwd((char *)malloc(MAXPATHLEN+1));
-  if(!e)
-    fatal("Couldn't fetch current path.\n");
 #endif
+  if(!e)
+    error("Failed to fetch current path.\n");
+
+  pop_n_elems(args);
   push_string(make_shared_string(e));
   free(e);
 }
diff --git a/src/modules/files/file.c b/src/modules/files/file.c
index 3cb08d658723c05a69813f176d7ba2eaf898b45d..a697f5833e9b9fdda846f8010994f8fefd816b59 100644
--- a/src/modules/files/file.c
+++ b/src/modules/files/file.c
@@ -95,6 +95,7 @@ static int close_fd(int fd)
 	fatal("Closing a non-active file descriptor.\n");
        
       case EINTR:
+	break;
       }
     }
 
diff --git a/src/modules/files/file_machine.h.in b/src/modules/files/file_machine.h.in
index d091c641f26f9bdc076c76f6c783255ce79f98c9..8564e516d2e9c6360b1322292888fde5d0acda74 100644
--- a/src/modules/files/file_machine.h.in
+++ b/src/modules/files/file_machine.h.in
@@ -34,5 +34,11 @@
 /* Do we have socketpair() ? */
 #undef HAVE_SOCKETPAIR
 
+/* Define if you have getwd.  */
+#undef HAVE_GETWD
+
+/* Define if you have a working getcwd */
+#undef HAVE_WORKING_GETCWD
+
 #endif