diff options
author | Kamran Riaz Khan <krkhan@inspirated.com> | 2011-12-04 21:33:20 +0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2011-12-22 10:17:48 -0500 |
commit | a1c1fc72d17e0327093a63f20e56292cbac0cf39 (patch) | |
tree | 0b4915e8deed9c3fc68da1c77259158f53ebae3b /src/common | |
parent | 878a684386cd4f7570bbc221fdfccdf005611c34 (diff) | |
download | tor-a1c1fc72d17e0327093a63f20e56292cbac0cf39.tar.gz tor-a1c1fc72d17e0327093a63f20e56292cbac0cf39.zip |
Prepend cwd for relative config file paths.
Modifies filenames which do not start with '/' or '.' on non-Windows
platforms; uses _fullpath on Windows.
Diffstat (limited to 'src/common')
-rw-r--r-- | src/common/compat.c | 36 | ||||
-rw-r--r-- | src/common/compat.h | 1 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/common/compat.c b/src/common/compat.c index 33e2864ada..066d66cf47 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -1634,6 +1634,42 @@ get_parent_directory(char *fname) return -1; } +/** Expand possibly relative path <b>fname</b> to an absolute path. + * Return a newly allocated string, possibly equal to <b>fname</b>. */ +char * +make_path_absolute(char *fname) +{ +#ifdef WINDOWS + char *absfname_malloced = _fullpath(NULL, fname, 1); + + /* We don't want to assume that tor_free can free a string allocated + * with malloc. On failure, return fname (it's better than nothing). */ + char *absfname = tor_strdup(absfname_malloced ? absfname_malloced : fname); + if (absfname_malloced) free(absfname_malloced); + + return absfname; +#else + char path[PATH_MAX+1]; + char *absfname = NULL; + + tor_assert(fname); + + if(fname[0] == '/') { + absfname = tor_strdup(fname); + } else { + if (getcwd(path, PATH_MAX) != NULL) { + tor_asprintf(&absfname, "%s/%s", path, fname); + } else { + /* If getcwd failed, the best we can do here is keep using the + * relative path. (Perhaps / isn't readable by this UID/GID.) */ + absfname = tor_strdup(fname); + } + } + + return absfname; +#endif +} + /** Set *addr to the IP address (in dotted-quad notation) stored in c. * Return 1 on success, 0 if c is badly formatted. (Like inet_aton(c,addr), * but works on Windows and Solaris.) diff --git a/src/common/compat.h b/src/common/compat.h index a228a46cf8..1394717882 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -571,6 +571,7 @@ char *get_user_homedir(const char *username); #endif int get_parent_directory(char *fname); +char *make_path_absolute(char *fname); int spawn_func(void (*func)(void *), void *data); void spawn_exit(void) ATTR_NORETURN; |