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