summaryrefslogtreecommitdiff
path: root/runner/settings.c
diff options
context:
space:
mode:
authorArkadiusz Hiler <arkadiusz.hiler@intel.com>2018-08-10 15:56:44 +0300
committerArkadiusz Hiler <arkadiusz.hiler@intel.com>2018-08-13 13:59:24 +0300
commit2cd4ae5ee6b385360644ded41d73e070ea81f116 (patch)
treefa1204c122c5c9a7f271bd26a8efc8973b3c602b /runner/settings.c
parentfce9638b2e60afce872b3056c19a729b1b3708be (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.c47
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";