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 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 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 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 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 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 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