dtc: Make -I dtb mode use fill_fullpaths()
At present -I dts and -I fs modes both use the fill_fullpaths() helper function to fill in the fullpath and basenamelen fields of struct node, which are useful in later parts of the code. -I dtb mode, however, fills these in itself. This patch simplifies flattree.c by making -I dtb mode use fill_fullpaths() like the others. Signed-off-by: David Gibson <david@gibson.dropbear.id.au>main
parent
5ac97df149
commit
b2de518b80
3
dtc.c
3
dtc.c
|
@ -55,7 +55,7 @@ char *join_path(const char *path, const char *name)
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fill_fullpaths(struct node *tree, const char *prefix)
|
static void fill_fullpaths(struct node *tree, const char *prefix)
|
||||||
{
|
{
|
||||||
struct node *child;
|
struct node *child;
|
||||||
const char *unit;
|
const char *unit;
|
||||||
|
@ -208,6 +208,7 @@ int main(int argc, char *argv[])
|
||||||
if (! bi || ! bi->dt || bi->error)
|
if (! bi || ! bi->dt || bi->error)
|
||||||
die("Couldn't read input tree\n");
|
die("Couldn't read input tree\n");
|
||||||
|
|
||||||
|
fill_fullpaths(bi->dt, "");
|
||||||
process_checks(force, bi);
|
process_checks(force, bi);
|
||||||
|
|
||||||
if (streq(outname, "-")) {
|
if (streq(outname, "-")) {
|
||||||
|
|
1
dtc.h
1
dtc.h
|
@ -264,6 +264,5 @@ struct boot_info *dt_from_fs(const char *dirname);
|
||||||
/* misc */
|
/* misc */
|
||||||
|
|
||||||
char *join_path(const char *path, const char *name);
|
char *join_path(const char *path, const char *name);
|
||||||
void fill_fullpaths(struct node *tree, const char *prefix);
|
|
||||||
|
|
||||||
#endif /* _DTC_H */
|
#endif /* _DTC_H */
|
||||||
|
|
55
flattree.c
55
flattree.c
|
@ -704,59 +704,37 @@ static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)
|
||||||
|
|
||||||
static char *nodename_from_path(const char *ppath, const char *cpath)
|
static char *nodename_from_path(const char *ppath, const char *cpath)
|
||||||
{
|
{
|
||||||
const char *lslash;
|
|
||||||
int plen;
|
int plen;
|
||||||
|
|
||||||
lslash = strrchr(cpath, '/');
|
plen = strlen(ppath);
|
||||||
if (! lslash)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
plen = lslash - cpath;
|
if (!strneq(ppath, cpath, plen))
|
||||||
|
die("Path \"%s\" is not valid as a child of \"%s\"\n",
|
||||||
|
cpath, ppath);
|
||||||
|
|
||||||
if (streq(cpath, "/") && streq(ppath, ""))
|
/* root node is a special case */
|
||||||
return "";
|
if (!streq(ppath, "/"))
|
||||||
|
plen++;
|
||||||
|
|
||||||
if ((plen == 0) && streq(ppath, "/"))
|
return strdup(cpath + plen);
|
||||||
return strdup(lslash+1);
|
|
||||||
|
|
||||||
if (! strneq(ppath, cpath, plen))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return strdup(lslash+1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int find_basenamelen(const char *name)
|
|
||||||
{
|
|
||||||
const char *atpos = strchr(name, '@');
|
|
||||||
|
|
||||||
if (atpos)
|
|
||||||
return atpos - name;
|
|
||||||
else
|
|
||||||
return strlen(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct node *unflatten_tree(struct inbuf *dtbuf,
|
static struct node *unflatten_tree(struct inbuf *dtbuf,
|
||||||
struct inbuf *strbuf,
|
struct inbuf *strbuf,
|
||||||
const char *parent_path, int flags)
|
const char *parent_flatname, int flags)
|
||||||
{
|
{
|
||||||
struct node *node;
|
struct node *node;
|
||||||
|
char *flatname;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
node = build_node(NULL, NULL);
|
node = build_node(NULL, NULL);
|
||||||
|
|
||||||
if (flags & FTF_FULLPATH) {
|
flatname = flat_read_string(dtbuf);
|
||||||
node->fullpath = flat_read_string(dtbuf);
|
|
||||||
node->name = nodename_from_path(parent_path, node->fullpath);
|
|
||||||
|
|
||||||
if (! node->name)
|
if (flags & FTF_FULLPATH)
|
||||||
die("Path \"%s\" is not valid as a child of \"%s\"\n",
|
node->name = nodename_from_path(parent_flatname, flatname);
|
||||||
node->fullpath, parent_path);
|
else
|
||||||
} else {
|
node->name = flatname;
|
||||||
node->name = flat_read_string(dtbuf);
|
|
||||||
node->fullpath = join_path(parent_path, node->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
node->basenamelen = find_basenamelen(node->name);
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
@ -773,8 +751,7 @@ static struct node *unflatten_tree(struct inbuf *dtbuf,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FDT_BEGIN_NODE:
|
case FDT_BEGIN_NODE:
|
||||||
child = unflatten_tree(dtbuf,strbuf, node->fullpath,
|
child = unflatten_tree(dtbuf,strbuf, flatname, flags);
|
||||||
flags);
|
|
||||||
add_child(node, child);
|
add_child(node, child);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
2
fstree.c
2
fstree.c
|
@ -87,8 +87,6 @@ struct boot_info *dt_from_fs(const char *dirname)
|
||||||
tree = read_fstree(dirname);
|
tree = read_fstree(dirname);
|
||||||
tree = name_node(tree, "", NULL);
|
tree = name_node(tree, "", NULL);
|
||||||
|
|
||||||
fill_fullpaths(tree, "");
|
|
||||||
|
|
||||||
return build_boot_info(NULL, tree);
|
return build_boot_info(NULL, tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,6 @@ struct boot_info *dt_from_source(const char *fname)
|
||||||
if (yyparse() != 0)
|
if (yyparse() != 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
fill_fullpaths(the_boot_info->dt, "");
|
|
||||||
|
|
||||||
the_boot_info->error = treesource_error;
|
the_boot_info->error = treesource_error;
|
||||||
return the_boot_info;
|
return the_boot_info;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue