aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-12-22 10:27:26 -0500
committerNick Mathewson <nickm@torproject.org>2011-12-22 10:27:26 -0500
commit8b4e7f9ac8e70a1d646fe7689d48847188eb89a2 (patch)
treea547623558b66ca942580acfe4ee10c2b0932600
parent878a684386cd4f7570bbc221fdfccdf005611c34 (diff)
parente0651bb1087b39618ca3f00c4feb9ae995195fc7 (diff)
downloadtor-8b4e7f9ac8e70a1d646fe7689d48847188eb89a2.tar.gz
tor-8b4e7f9ac8e70a1d646fe7689d48847188eb89a2.zip
Merge branch 'bug1101_squashed'
-rw-r--r--changes/bug11013
-rw-r--r--src/common/compat.c36
-rw-r--r--src/common/compat.h1
-rw-r--r--src/or/config.c8
4 files changed, 48 insertions, 0 deletions
diff --git a/changes/bug1101 b/changes/bug1101
new file mode 100644
index 0000000000..784ae083f1
--- /dev/null
+++ b/changes/bug1101
@@ -0,0 +1,3 @@
+ o Minor features:
+ - Use absolute path names when reporting the torrc filename, so
+ that a controller can more easily find it. Resolves bug 1101.
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;
diff --git a/src/or/config.c b/src/or/config.c
index 521f760051..254e9fffd0 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -4356,6 +4356,14 @@ find_torrc_filename(int argc, char **argv,
tor_free(fname);
}
fname = expand_filename(argv[i+1]);
+
+ {
+ char *absfname;
+ absfname = make_path_absolute(fname);
+ tor_free(fname);
+ fname = absfname;
+ }
+
*using_default_torrc = 0;
++i;
} else if (ignore_opt && !strcmp(argv[i],ignore_opt)) {