1*cc7d2833Sskrll /* $NetBSD: check_path.c,v 1.1.1.2 2019/12/22 12:34:07 skrll Exp $ */
2d89652e2Sskrll
3*cc7d2833Sskrll // SPDX-License-Identifier: LGPL-2.1-or-later
4d89652e2Sskrll /*
5d89652e2Sskrll * libfdt - Flat Device Tree manipulation
6d89652e2Sskrll * Testcase for node existence
7d89652e2Sskrll * Copyright (C) 2016 Konsulko Inc.
8d89652e2Sskrll */
9d89652e2Sskrll
10d89652e2Sskrll #include <stdio.h>
11d89652e2Sskrll
12d89652e2Sskrll #include <libfdt.h>
13d89652e2Sskrll
14d89652e2Sskrll #include "tests.h"
15d89652e2Sskrll
16d89652e2Sskrll #define CHECK(code) \
17d89652e2Sskrll { \
18d89652e2Sskrll int err = (code); \
19d89652e2Sskrll if (err) \
20d89652e2Sskrll FAIL(#code ": %s", fdt_strerror(err)); \
21d89652e2Sskrll }
22d89652e2Sskrll
23d89652e2Sskrll /* 4k ought to be enough for anybody */
24d89652e2Sskrll #define FDT_COPY_SIZE (4 * 1024)
25d89652e2Sskrll
open_dt(char * path)26d89652e2Sskrll static void *open_dt(char *path)
27d89652e2Sskrll {
28d89652e2Sskrll void *dt, *copy;
29d89652e2Sskrll
30d89652e2Sskrll dt = load_blob(path);
31d89652e2Sskrll copy = xmalloc(FDT_COPY_SIZE);
32d89652e2Sskrll
33d89652e2Sskrll /*
34d89652e2Sskrll * Resize our DTs to 4k so that we have room to operate on
35d89652e2Sskrll */
36d89652e2Sskrll CHECK(fdt_open_into(dt, copy, FDT_COPY_SIZE));
37d89652e2Sskrll
38d89652e2Sskrll return copy;
39d89652e2Sskrll }
40d89652e2Sskrll
main(int argc,char * argv[])41d89652e2Sskrll int main(int argc, char *argv[])
42d89652e2Sskrll {
43d89652e2Sskrll void *fdt_base;
44d89652e2Sskrll int fail_config, exists, check_exists;
45d89652e2Sskrll
46d89652e2Sskrll test_init(argc, argv);
47d89652e2Sskrll fail_config = 0;
48d89652e2Sskrll
49d89652e2Sskrll if (argc != 4)
50d89652e2Sskrll fail_config = 1;
51d89652e2Sskrll
52d89652e2Sskrll if (!fail_config) {
53d89652e2Sskrll if (!strcmp(argv[2], "exists"))
54d89652e2Sskrll check_exists = 1;
55d89652e2Sskrll else if (!strcmp(argv[2], "not-exists"))
56d89652e2Sskrll check_exists = 0;
57d89652e2Sskrll else
58d89652e2Sskrll fail_config = 1;
59d89652e2Sskrll }
60d89652e2Sskrll
61d89652e2Sskrll if (fail_config)
62d89652e2Sskrll CONFIG("Usage: %s <base dtb> <[exists|not-exists]> <node-path>", argv[0]);
63d89652e2Sskrll
64d89652e2Sskrll fdt_base = open_dt(argv[1]);
65d89652e2Sskrll
66d89652e2Sskrll exists = fdt_path_offset(fdt_base, argv[3]) >= 0;
67d89652e2Sskrll
68d89652e2Sskrll if (exists == check_exists)
69d89652e2Sskrll PASS();
70d89652e2Sskrll else
71d89652e2Sskrll FAIL();
72d89652e2Sskrll }
73