From 0e566f65fa31eaa5208d4a17413c7a4aad7eade5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?An=C3=ADbal=20Lim=C3=B3n?= Date: Thu, 7 Dec 2017 17:42:45 -0600 Subject: [PATCH 3/7] Add support to avoid load/run twice a run_ptest script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In some ptest packages exists symlink in the ptest directory causing to load/run twice the same ptest, For example in perl5: /usr/lib/perl -> /usr/lib/perl5 Signed-off-by: Aníbal Limón --- ptest_list.c | 40 ++++++++++++++++++++++++++++++++++++++++ ptest_list.h | 3 +++ tests/data/python3 | 1 + tests/utils.c | 1 + utils.c | 6 ++++++ 5 files changed, 51 insertions(+) create mode 120000 tests/data/python3 diff --git a/ptest_list.c b/ptest_list.c index 2e1aa305752d..3e393d5fabe2 100644 --- a/ptest_list.c +++ b/ptest_list.c @@ -110,6 +110,46 @@ ptest_list_search(struct ptest_list *head, char *ptest) return q; } + +struct ptest_list * +ptest_list_search_by_file(struct ptest_list *head, char *run_ptest, struct stat st_buf) +{ + struct ptest_list *q = NULL; + struct ptest_list *p; + struct stat st_buf_p; + + VALIDATE_PTR_RNULL(head); + VALIDATE_PTR_RNULL(run_ptest); + + for (p = head; p != NULL; p = p->next) { + if (p->ptest == NULL) + continue; + + if (stat(p->run_ptest, &st_buf_p) == -1) + continue; + + if (strcmp(p->run_ptest, run_ptest) == 0) { + q = p; + break; + } + + /* * + * In some ptest packages exists symlink in the ptest directory + * causing to load/run twice the same ptest, + * + * For example in perl5: + * /usr/lib/perl -> /usr/lib/perl5 + * */ + if (st_buf.st_dev == st_buf_p.st_dev && + st_buf.st_ino == st_buf_p.st_ino) { + q = p; + break; + } + } + + return q; +} + struct ptest_list * ptest_list_add(struct ptest_list *head, char *ptest, char *run_ptest) { diff --git a/ptest_list.h b/ptest_list.h index 8b394853c25b..03d75390a51d 100644 --- a/ptest_list.h +++ b/ptest_list.h @@ -28,6 +28,8 @@ #define PTEST_LIST_ITERATE_START(head, p) for (p = head->next; p != NULL; p = p->next) { #define PTEST_LIST_ITERATE_END } +#include + struct ptest_list { char *ptest; char *run_ptest; @@ -42,6 +44,7 @@ extern int ptest_list_free_all(struct ptest_list *); extern int ptest_list_length(struct ptest_list *); extern struct ptest_list *ptest_list_search(struct ptest_list *, char *); +extern struct ptest_list *ptest_list_search_by_file(struct ptest_list *, char *, struct stat); extern struct ptest_list *ptest_list_add(struct ptest_list *, char *, char *); extern struct ptest_list *ptest_list_remove(struct ptest_list *, char *, int); diff --git a/tests/data/python3 b/tests/data/python3 new file mode 120000 index 000000000000..d8654aa0e2f2 --- /dev/null +++ b/tests/data/python3 @@ -0,0 +1 @@ +python \ No newline at end of file diff --git a/tests/utils.c b/tests/utils.c index ecf3e8af9a81..cf093793c4f2 100644 --- a/tests/utils.c +++ b/tests/utils.c @@ -48,6 +48,7 @@ static int ptests_found_length = 6; static char *ptests_not_found[] = { "busybox", "perl", + "python3", NULL, }; diff --git a/utils.c b/utils.c index 933ecedf57e8..ed2eff7900c1 100644 --- a/utils.c +++ b/utils.c @@ -143,6 +143,12 @@ get_available_ptests(const char *dir) continue; } + if (ptest_list_search_by_file(head, run_ptest, st_buf)) { + free(run_ptest); + free(d_name); + continue; + } + struct ptest_list *p = ptest_list_add(head, d_name, run_ptest); CHECK_ALLOCATION(p, sizeof(struct ptest_list *), 0); -- 2.11.0