[igt-dev] [PATCH i-g-t] runner: Fix path handling
Petri Latvala
petri.latvala at intel.com
Mon Aug 13 10:20:21 UTC 2018
On Fri, Aug 10, 2018 at 04:44:46PM +0300, Arkadiusz Hiler wrote:
> 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 at intel.com>
> Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler at intel.com>
Reviewed-by: Petri Latvala <petri.latvala at intel.com>
... dunno what I was thinking, having weird semantics and even unit
tests that make sure the semantics are weird.
> ---
> runner/runner_tests.c | 22 ++++++--------------
> runner/settings.c | 47 ++++++++++++++++++++++++++-----------------
> 2 files changed, 34 insertions(+), 35 deletions(-)
>
> 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);
> + dir = _dirname(path);
> + ret = absolute_path(dir);
> + free(dir);
>
> - if (result != NULL) {
> - char *ret;
> + base = _basename(path);
> + asprintf(&result, "%s/%s", ret, base);
> + free(base);
> + free(ret);
>
> - tmppath = strdup(path);
> - tmpname = basename(tmppath);
> -
> - asprintf(&ret, "%s/%s", result, tmpname);
> - free(result);
> - free(tmppath);
> - return ret;
> - }
> -
> - free(result);
> - return NULL;
> + return result;
> }
>
> static char settings_filename[] = "metadata.txt";
> --
> 2.17.1
>
More information about the igt-dev
mailing list