diff options
author | Arkadiusz Hiler <arkadiusz.hiler@intel.com> | 2018-08-10 15:56:44 +0300 |
---|---|---|
committer | Arkadiusz Hiler <arkadiusz.hiler@intel.com> | 2018-08-13 13:59:24 +0300 |
commit | 2cd4ae5ee6b385360644ded41d73e070ea81f116 (patch) | |
tree | fa1204c122c5c9a7f271bd26a8efc8973b3c602b /runner/settings.c | |
parent | fce9638b2e60afce872b3056c19a729b1b3708be (diff) |
runner: Fix path handling
absolute_path() tends to return NULL if more than the last element of
the path is nonexistent. That behavior is confusing the callers, which
use NULL as a convention for something not being set at all.
Let's fix that by sprinkling a little bit of recursion onto
absolute_path() and wrapping POSIX in some sanity.
Cc: Petri Latvala <petri.latvala@intel.com>
Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
Reviewed-by: Petri Latvala <petri.latvala@intel.com>
Diffstat (limited to 'runner/settings.c')
-rw-r--r-- | runner/settings.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/runner/settings.c b/runner/settings.c index 31754a12..060459b0 100644 --- a/runner/settings.c +++ b/runner/settings.c @@ -334,35 +334,44 @@ bool validate_settings(struct settings *settings) return true; } +static char *_dirname(const char *path) +{ + char *tmppath = strdup(path); + char *tmpname = dirname(tmppath); + tmpname = strdup(tmpname); + free(tmppath); + return tmpname; +} + +static char *_basename(const char *path) +{ + char *tmppath = strdup(path); + char *tmpname = basename(tmppath); + tmpname = strdup(tmpname); + free(tmppath); + return tmpname; +} + char *absolute_path(char *path) { char *result = NULL; - char *tmppath, *tmpname; + char *base, *dir; + char *ret; result = realpath(path, NULL); if (result != NULL) return result; - tmppath = strdup(path); - tmpname = dirname(tmppath); - free(result); - result = realpath(tmpname, NULL); - free(tmppath); - - if (result != NULL) { - char *ret; - - tmppath = strdup(path); - tmpname = basename(tmppath); + dir = _dirname(path); + ret = absolute_path(dir); + free(dir); - asprintf(&ret, "%s/%s", result, tmpname); - free(result); - free(tmppath); - return ret; - } + base = _basename(path); + asprintf(&result, "%s/%s", ret, base); + free(base); + free(ret); - free(result); - return NULL; + return result; } static char settings_filename[] = "metadata.txt"; |