diff --git a/src/module/os.c b/src/module/os.c index ea887196..d80bca65 100644 --- a/src/module/os.c +++ b/src/module/os.c @@ -81,9 +81,18 @@ void processCwd(WrenVM* vm) { wrenEnsureSlots(vm, 1); - char buffer[WREN_PATH_MAX * 4]; - size_t length = sizeof(buffer); - if (uv_cwd(buffer, &length) != 0) + char _buffer[WREN_PATH_MAX * 2 + 1]; + char* buffer = _buffer; + size_t length = sizeof(_buffer); + int result = uv_cwd(buffer, &length); + + if (result == UV_ENOBUFS) + { + buffer = (char*)malloc(length); + result = uv_cwd(buffer, &length); + } + + if (result != 0) { wrenSetSlotString(vm, 0, "Cannot get current working directory."); wrenAbortFiber(vm, 0); @@ -91,4 +100,6 @@ void processCwd(WrenVM* vm) } wrenSetSlotString(vm, 0, buffer); + + if (buffer != _buffer) free(buffer); } diff --git a/src/module/os.h b/src/module/os.h index b9988f80..af0b7f04 100644 --- a/src/module/os.h +++ b/src/module/os.h @@ -1,9 +1,14 @@ #ifndef process_h #define process_h +#include "limits.h" #include "wren.h" -#define WREN_PATH_MAX 4096 +#ifdef PATH_MAX +# define WREN_PATH_MAX PATH_MAX +#else +# define WREN_PATH_MAX 4096 +#endif // Stores the command line arguments passed to the CLI. void osSetArguments(int argc, const char* argv[]); diff --git a/test/os/process/cwd.wren b/test/os/process/cwd.wren index 4f604afb..86d53237 100644 --- a/test/os/process/cwd.wren +++ b/test/os/process/cwd.wren @@ -3,6 +3,5 @@ import "os" for Process System.print(Process.cwd is String) // expect: true System.print(!Process.cwd.isEmpty) // expect: true -System.print(Process.cwd.startsWith("/")) // expect: true System.print(File.realPath(Process.cwd) == Process.cwd) // expect: true System.print(Directory.exists(Process.cwd)) // expect: true