]> git.ozlabs.org Git - ccan/blob - tools/ccanlint/compulsory_tests/check_depends_exist.c
e2437083e018d2dc52d70e64e09971b406b06e1b
[ccan] / tools / ccanlint / compulsory_tests / check_depends_exist.c
1 #include <tools/ccanlint/ccanlint.h>
2 #include <tools/tools.h>
3 #include <ccan/talloc/talloc.h>
4 #include <ccan/str/str.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <unistd.h>
9 #include <limits.h>
10 #include <errno.h>
11 #include <stdlib.h>
12 #include <stdio.h>
13 #include <err.h>
14 #include <string.h>
15 #include <ctype.h>
16
17 static void add_dep(struct manifest *m, const char *dep, struct score *score)
18 {
19         struct stat st;
20         struct ccan_file *f;
21
22         f = new_ccan_file(m, ccan_dir, talloc_strdup(m, dep));
23         if (stat(f->fullname, &st) != 0) {
24                 score->error = "Depends don't exist";
25                 score_file_error(score, f, 0, "could not stat");
26         } else
27                 list_add_tail(&m->dep_dirs, &f->list);
28 }
29
30 static void check_depends_exist(struct manifest *m,
31                                 bool keep,
32                                 unsigned int *timeleft, struct score *score)
33 {
34         unsigned int i;
35         char **deps;
36         char *updir = talloc_strdup(m, m->dir);
37
38         *strrchr(updir, '/') = '\0';
39
40         if (safe_mode)
41                 deps = get_safe_ccan_deps(m, m->dir, true,
42                                           &m->info_file->compiled);
43         else
44                 deps = get_deps(m, m->dir, true, &m->info_file->compiled);
45
46         for (i = 0; deps[i]; i++) {
47                 if (!strstarts(deps[i], "ccan/"))
48                         continue;
49
50                 add_dep(m, deps[i], score);
51         }
52         if (!score->error) {
53                 score->pass = true;
54                 score->score = score->total;
55         }
56 }
57
58 struct ccanlint depends_exist = {
59         .key = "depends-exist",
60         .name = "Module's CCAN dependencies are present",
61         .check = check_depends_exist,
62 };
63
64 REGISTER_TEST(depends_exist, NULL);