1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "cache.h"
2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic const char *get_pwd_cwd(void)
4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	static char cwd[PATH_MAX + 1];
6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	char *pwd;
7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	struct stat cwd_stat, pwd_stat;
8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	if (getcwd(cwd, PATH_MAX) == NULL)
9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		return NULL;
10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	pwd = getenv("PWD");
11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	if (pwd && strcmp(pwd, cwd)) {
12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		stat(cwd, &cwd_stat);
13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		if (!stat(pwd, &pwd_stat) &&
14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		    pwd_stat.st_dev == cwd_stat.st_dev &&
15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		    pwd_stat.st_ino == cwd_stat.st_ino) {
16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			strlcpy(cwd, pwd, PATH_MAX);
17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		}
18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	}
19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return cwd;
20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengconst char *make_nonrelative_path(const char *path)
23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{
24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	static char buf[PATH_MAX + 1];
25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	if (is_absolute_path(path)) {
27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			die("Too long path: %.*s", 60, path);
29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	} else {
30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		const char *cwd = get_pwd_cwd();
31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		if (!cwd)
32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			die("Cannot determine the current working directory");
33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		if (snprintf(buf, PATH_MAX, "%s/%s", cwd, path) >= PATH_MAX)
34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			die("Too long path: %.*s", 60, path);
35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	}
36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	return buf;
37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}
38