xref: /netbsd-src/external/gpl2/dtc/dist/tests/fs_tree1.c (revision cc7d2833ecf67da5a5ddc470841931eb9f6723e4)
1 /*	$NetBSD: fs_tree1.c,v 1.1.1.1 2019/12/22 12:34:07 skrll Exp $	*/
2 
3 // SPDX-License-Identifier: LGPL-2.1-or-later
4 /*
5  * libfdt - Flat Device Tree manipulation
6  *	Testcase/tool constructing an fs tree for further test
7  * Copyright (C) 2018 David Gibson, Red Hat Inc.
8  */
9 
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <limits.h>
14 #include <stdint.h>
15 #include <sys/stat.h>
16 #include <errno.h>
17 #include <unistd.h>
18 #include <fcntl.h>
19 
20 #include <libfdt.h>
21 
22 #include "tests.h"
23 #include "testdata.h"
24 
start_dir(const char * name)25 static void start_dir(const char *name)
26 {
27 	int rc;
28 
29 	rc = mkdir(name, 0777);
30 	if (rc != 0)
31 		FAIL("mkdir(\"%s\"): %s", name, strerror(errno));
32 
33 	rc = chdir(name);
34 	if (rc != 0)
35 		FAIL("chdir(\"%s\"): %s", name, strerror(errno));
36 }
37 
end_dir(void)38 static void end_dir(void)
39 {
40 	int rc;
41 
42 	rc = chdir("..");
43 	if (rc != 0)
44 		FAIL("chdir(..): %s", strerror(errno));
45 }
46 
mkfile(const char * name,void * data,size_t len)47 static void mkfile(const char *name, void *data, size_t len)
48 {
49 	int fd;
50 	int rc;
51 
52 	fd = open(name, O_WRONLY|O_CREAT, 0666);
53 	if (fd < 0)
54 		FAIL("open(\"%s\"): %s", name, strerror(errno));
55 
56 	rc = write(fd, data, len);
57 	if (rc < 0)
58 		FAIL("write(\"%s\"): %s", name, strerror(errno));
59 	if (rc != len)
60 		FAIL("write(\"%s\"): short write", name);
61 
62 	rc = close(fd);
63 	if (rc != 0)
64 		FAIL("close(\"%s\"): %s", name, strerror(errno));
65 }
66 
67 #define mkfile_str(name, s)			  \
68 	do {					  \
69 		char str[] = s;			  \
70 		mkfile((name), str, sizeof(str)); \
71 	} while (0)
72 
mkfile_u32(const char * name,uint32_t val)73 static void mkfile_u32(const char *name, uint32_t val)
74 {
75 	val = cpu_to_fdt32(val);
76 	mkfile(name, &val, sizeof(val));
77 }
78 
mkfile_u64(const char * name,uint64_t val)79 static void mkfile_u64(const char *name, uint64_t val)
80 {
81 	val = cpu_to_fdt64(val);
82 	mkfile(name, &val, sizeof(val));
83 }
84 
main(int argc,char * argv[])85 int main(int argc, char *argv[])
86 {
87 	const char *base;
88 
89 	test_init(argc, argv);
90 	if (argc != 2)
91 		CONFIG("Usage: %s <path>", argv[0]);
92 
93 	base = argv[1];
94 
95 	start_dir(base);
96 	mkfile_str("compatible", "test_tree1");
97 	mkfile_u32("prop-int", TEST_VALUE_1);
98 	mkfile_u64("prop-int64", 0xdeadbeef01abcdefULL);
99 	mkfile_str("prop-str", "hello world");
100 	mkfile_u32("#address-cells", 1);
101 	mkfile_u32("#size-cells", 0);
102 
103 	{
104 		start_dir("subnode@1");
105 
106 		mkfile_str("compatible", "subnode1");
107 		mkfile_u32("reg", 1);
108 		mkfile_u32("prop-int", TEST_VALUE_1);
109 
110 		{
111 			start_dir("subsubnode");
112 
113 			mkfile_str("compatible", "subsubnode1\0subsubnode");
114 			mkfile_str("placeholder", "this is a placeholder string\0string2");
115 			mkfile_u32("prop-int", TEST_VALUE_1);
116 
117 			end_dir();
118 		}
119 
120 		{
121 			start_dir("ss1");
122 			end_dir();
123 		}
124 
125 		end_dir();
126 	}
127 
128 	{
129 		start_dir("subnode@2");
130 
131 		mkfile_u32("reg", 2);
132 		mkfile_u32("linux,phandle", 0x2000);
133 		mkfile_u32("prop-int", TEST_VALUE_2);
134 		mkfile_u32("#address-cells", 1);
135 		mkfile_u32("#size-cells", 0);
136 
137 		{
138 			start_dir("subsubnode@0");
139 
140 			mkfile_u32("reg", 0);
141 			mkfile_u32("phandle", 0x2001);
142 			mkfile_str("compatible", "subsubnode2\0subsubnode");
143 			mkfile_u32("prop-int", TEST_VALUE_2);
144 
145 			end_dir();
146 		}
147 
148 		{
149 			start_dir("ss2");
150 			end_dir();
151 		}
152 
153 		end_dir();
154 	}
155 
156 	PASS();
157 }
158