librazor/util.c
changeset 500 f98d77376544
parent 477 6ba4c0f3c9d1
     1.1 --- a/librazor/util.c	Tue Jul 05 09:40:01 2016 +0100
     1.2 +++ b/librazor/util.c	Fri Jun 08 18:02:33 2018 +0100
     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 +}