X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=path.c;h=7a35a26a1697480f0f43244132d8267deb301651;hb=58eda02257a89df6e05f504bdf87e578d90f3b5e;hp=b7c24a2aacf87ffea6bd6380dbff44e5d317b240;hpb=e919cb302e75141c2565106bed2f0b6cb8047570;p=git.git diff --git a/path.c b/path.c index b7c24a2aa..7a35a26a1 100644 --- a/path.c +++ b/path.c @@ -291,6 +291,42 @@ int adjust_shared_perm(const char *path) return 0; } +static const char *get_pwd_cwd(void) +{ + static char cwd[PATH_MAX + 1]; + char *pwd; + struct stat cwd_stat, pwd_stat; + if (getcwd(cwd, PATH_MAX) == NULL) + return NULL; + pwd = getenv("PWD"); + if (pwd && strcmp(pwd, cwd)) { + stat(cwd, &cwd_stat); + if (!stat(pwd, &pwd_stat) && + pwd_stat.st_dev == cwd_stat.st_dev && + pwd_stat.st_ino == cwd_stat.st_ino) { + strlcpy(cwd, pwd, PATH_MAX); + } + } + return cwd; +} + +const char *make_nonrelative_path(const char *path) +{ + static char buf[PATH_MAX + 1]; + + if (is_absolute_path(path)) { + if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX) + die ("Too long path: %.*s", 60, path); + } else { + const char *cwd = get_pwd_cwd(); + if (!cwd) + die("Cannot determine the current working directory"); + if (snprintf(buf, PATH_MAX, "%s/%s", cwd, path) >= PATH_MAX) + die ("Too long path: %.*s", 60, path); + } + return buf; +} + /* We allow "recursive" symbolic links. Only within reason, though. */ #define MAXDEPTH 5