summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorKamran Riaz Khan <krkhan@inspirated.com>2011-12-04 21:33:20 +0500
committerNick Mathewson <nickm@torproject.org>2011-12-22 10:17:48 -0500
commita1c1fc72d17e0327093a63f20e56292cbac0cf39 (patch)
tree0b4915e8deed9c3fc68da1c77259158f53ebae3b /src/common
parent878a684386cd4f7570bbc221fdfccdf005611c34 (diff)
downloadtor-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.c36
-rw-r--r--src/common/compat.h1
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;