xref: /netbsd-src/external/gpl2/dtc/dist/tests/check_path.c (revision cc7d2833ecf67da5a5ddc470841931eb9f6723e4)
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