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