From 4cd21deebca0e75b77d62d8d748aa66453532d9b Mon Sep 17 00:00:00 2001 From: stijn Date: Sat, 3 May 2014 10:26:04 +0200 Subject: mingw: Add implementation of realpath() The mingw port used _fullpath() until now, but the behaviour is not exactly the same as realpath()'s on unix; major difference being that it doesn't return an error for non-existing files, which would bypass main's error checking and bail out without any error message. Also realpath() will return forward slashes only since main() relies on that. --- windows/realpath.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 windows/realpath.c (limited to 'windows/realpath.c') diff --git a/windows/realpath.c b/windows/realpath.c new file mode 100644 index 000000000..550298a7d --- /dev/null +++ b/windows/realpath.c @@ -0,0 +1,42 @@ +#include +#include +#include + +#ifndef R_OK + #define R_OK 4 +#endif + +// Make sure a path only has forward slashes. +char *to_unix_path(char *p) { + if (p != NULL) { + char *pp = p; + while (*pp != 0) { + if (*pp == '\\') + *pp = '/'; + ++pp; + } + } + return p; +} + +// Implement realpath() using _fullpath and make it use the same error codes as realpath() on unix. +// Also have it return a path with forward slashes only as some code relies on this, +// but _fullpath() returns backward slashes no matter what. +char *realpath(const char *path, char *resolved_path) { + char *ret = NULL; + if (path == NULL) { + errno = EINVAL; + } else if (access(path, R_OK) == 0) { + ret = resolved_path; + if (ret == NULL) + ret = malloc(_MAX_PATH); + if (ret == NULL) { + errno = ENOMEM; + } else { + ret = _fullpath(ret, path, _MAX_PATH); + if (ret == NULL) + errno = EIO; + } + } + return to_unix_path(ret); +} -- cgit v1.2.3