1/*	$NetBSD: fstree.c,v 1.1.1.3 2019/12/22 12:34:04 skrll Exp $	*/
2
3// SPDX-License-Identifier: GPL-2.0-or-later
4/*
5 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation.  2005.
6 */
7
8#include "dtc.h"
9
10#include <dirent.h>
11#include <sys/stat.h>
12
13static struct node *read_fstree(const char *dirname)
14{
15	DIR *d;
16	struct dirent *de;
17	struct stat st;
18	struct node *tree;
19
20	d = opendir(dirname);
21	if (!d)
22		die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno));
23
24	tree = build_node(NULL, NULL, NULL);
25
26	while ((de = readdir(d)) != NULL) {
27		char *tmpname;
28
29		if (streq(de->d_name, ".")
30		    || streq(de->d_name, ".."))
31			continue;
32
33		tmpname = join_path(dirname, de->d_name);
34
35		if (lstat(tmpname, &st) < 0)
36			die("stat(%s): %s\n", tmpname, strerror(errno));
37
38		if (S_ISREG(st.st_mode)) {
39			struct property *prop;
40			FILE *pfile;
41
42			pfile = fopen(tmpname, "rb");
43			if (! pfile) {
44				fprintf(stderr,
45					"WARNING: Cannot open %s: %s\n",
46					tmpname, strerror(errno));
47			} else {
48				prop = build_property(xstrdup(de->d_name),
49						      data_copy_file(pfile,
50								     st.st_size),
51						      NULL);
52				add_property(tree, prop);
53				fclose(pfile);
54			}
55		} else if (S_ISDIR(st.st_mode)) {
56			struct node *newchild;
57
58			newchild = read_fstree(tmpname);
59			newchild = name_node(newchild, xstrdup(de->d_name));
60			add_child(tree, newchild);
61		}
62
63		free(tmpname);
64	}
65
66	closedir(d);
67	return tree;
68}
69
70struct dt_info *dt_from_fs(const char *dirname)
71{
72	struct node *tree;
73
74	tree = read_fstree(dirname);
75	tree = name_node(tree, "");
76
77	return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree));
78}
79