diff options
author | Nick Mathewson <nickm@torproject.org> | 2011-12-22 10:27:26 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2011-12-22 10:27:26 -0500 |
commit | 8b4e7f9ac8e70a1d646fe7689d48847188eb89a2 (patch) | |
tree | a547623558b66ca942580acfe4ee10c2b0932600 | |
parent | 878a684386cd4f7570bbc221fdfccdf005611c34 (diff) | |
parent | e0651bb1087b39618ca3f00c4feb9ae995195fc7 (diff) | |
download | tor-8b4e7f9ac8e70a1d646fe7689d48847188eb89a2.tar.gz tor-8b4e7f9ac8e70a1d646fe7689d48847188eb89a2.zip |
Merge branch 'bug1101_squashed'
-rw-r--r-- | changes/bug1101 | 3 | ||||
-rw-r--r-- | src/common/compat.c | 36 | ||||
-rw-r--r-- | src/common/compat.h | 1 | ||||
-rw-r--r-- | src/or/config.c | 8 |
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)) { |