From 2cd4ae5ee6b385360644ded41d73e070ea81f116 Mon Sep 17 00:00:00 2001 From: Arkadiusz Hiler Date: Fri, 10 Aug 2018 15:56:44 +0300 Subject: 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 Signed-off-by: Arkadiusz Hiler Reviewed-by: Petri Latvala --- runner/runner_tests.c | 22 ++++++---------------- runner/settings.c | 47 ++++++++++++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 35 deletions(-) (limited to 'runner') diff --git a/runner/runner_tests.c b/runner/runner_tests.c index 7c662acc..89b4377a 100644 --- a/runner/runner_tests.c +++ b/runner/runner_tests.c @@ -231,28 +231,18 @@ igt_main } igt_subtest("absolute-path-converter") { - struct { - char *path; - bool null; - } data[] = { { "simple-name", false }, - { "foo/bar", true }, - { ".", false }, - }; + char paths[][15] = { "simple-name", "foo/bar", "." }; size_t i; - for (i = 0; i < ARRAY_SIZE(data); i++) { + for (i = 0; i < ARRAY_SIZE(paths); i++) { free(path); - path = absolute_path(data[i].path); - if (data[i].null) { - igt_assert(path == NULL); - continue; - } + path = absolute_path(paths[i]); igt_assert(path[0] == '/'); - igt_debug("Got path %s for %s\n", path, data[i].path); + igt_debug("Got path %s for %s\n", path, paths[i]); igt_assert(strstr(path, cwd) == path); - if (strcmp(data[i].path, ".")) { - igt_assert(strstr(path, data[i].path) != NULL); + if (strcmp(paths[i], ".")) { + igt_assert(strstr(path, paths[i]) != NULL); } } } 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"; -- cgit v1.2.3