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