1.1 --- a/librazor/util.c Tue Jul 05 09:40:01 2016 +0100
1.2 +++ b/librazor/util.c Mon Mar 05 20:35:27 2018 +0000
1.3 @@ -364,3 +364,68 @@
1.4 }
1.5
1.6 #endif /* MSWIN_API */
1.7 +
1.8 +/*
1.9 + * Returns an absolute path (ie., not relative to the current directory on the
1.10 + * default, or any other, disk). Note that the absolute path may still have
1.11 + * "." or ".." path segments present (ie., this is not equivalent to realpath).
1.12 + */
1.13 +char *razor_abspath(const char *path)
1.14 +{
1.15 +#ifdef MSWIN_API
1.16 +
1.17 + int n;
1.18 + wchar_t *wpath, *wabspath;
1.19 + char *abspath;
1.20 +
1.21 + wpath = razor_utf8_to_utf16(path, -1);
1.22 +
1.23 + n = GetFullPathNameW(wpath, 0, NULL, NULL);
1.24 + if (!n) {
1.25 + free(wpath);
1.26 + return NULL;
1.27 + }
1.28 +
1.29 + wabspath = malloc(n * sizeof(sizeof(wchar_t)));
1.30 + if (!GetFullPathNameW(wpath, n, wabspath, NULL)) {
1.31 + free(wabspath);
1.32 + free(wpath);
1.33 + return NULL;
1.34 + }
1.35 + free(wpath);
1.36 +
1.37 + abspath = razor_utf16_to_utf8(wabspath, n - 1);
1.38 + free(wabspath);
1.39 +
1.40 + return abspath;
1.41 +
1.42 +#else /* MSWIN_API */
1.43 +
1.44 + int pathlen, len;
1.45 + char *cwd, *abspath;
1.46 +
1.47 + if (*path == '/')
1.48 + abspath = strdup(path);
1.49 + else {
1.50 + pathlen = strlen(path);
1.51 + for (len = 32;; len *= 2) {
1.52 + abspath = malloc(pathlen + 1 + len);
1.53 + if (getcwd(abspath, len))
1.54 + break;
1.55 + if (errno != ERANGE) {
1.56 + free(abspath);
1.57 + return NULL;
1.58 + }
1.59 + free(abspath);
1.60 + }
1.61 + len = strlen(abspath);
1.62 + if (abspath[len - 1] != '/')
1.63 + abspath[len++] = '/';
1.64 + memcpy(abspath + len, path, pathlen + 1);
1.65 + abspath = realloc(abspath, len + pathlen + 1);
1.66 + }
1.67 +
1.68 + return abspath;
1.69 +
1.70 +#endif
1.71 +}