mirror of
https://github.com/dgibson/dtc.git
synced 2025-12-06 21:25:05 -05:00
libfdt: Add fdt_get_path() function
This patch adds an fdt_get_path() function to libfdt, which returns the full path of a given node in a caller supplied buffer. Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
9d26eabdc6
commit
037db263e0
5 changed files with 161 additions and 1 deletions
|
|
@ -283,3 +283,69 @@ const void *fdt_getprop(const void *fdt, int nodeoffset,
|
|||
|
||||
return prop->data;
|
||||
}
|
||||
|
||||
int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen)
|
||||
{
|
||||
uint32_t tag;
|
||||
int p = 0, overflow = 0;
|
||||
int offset, nextoffset, namelen;
|
||||
const char *name;
|
||||
|
||||
CHECK_HEADER(fdt);
|
||||
|
||||
tag = _fdt_next_tag(fdt, 0, &nextoffset);
|
||||
if (tag != FDT_BEGIN_NODE)
|
||||
return -FDT_ERR_BADSTRUCTURE;
|
||||
|
||||
if (buflen < 2)
|
||||
return -FDT_ERR_NOSPACE;
|
||||
buf[0] = '/';
|
||||
p = 1;
|
||||
|
||||
while (offset < nodeoffset) {
|
||||
offset = nextoffset;
|
||||
tag = _fdt_next_tag(fdt, offset, &nextoffset);
|
||||
switch (tag) {
|
||||
case FDT_END:
|
||||
return -FDT_ERR_BADOFFSET;
|
||||
|
||||
case FDT_BEGIN_NODE:
|
||||
name = fdt_get_name(fdt, offset, &namelen);
|
||||
if (!name)
|
||||
return namelen;
|
||||
if (overflow || ((p + namelen + 1) > buflen)) {
|
||||
overflow++;
|
||||
break;
|
||||
}
|
||||
memcpy(buf + p, name, namelen);
|
||||
p += namelen;
|
||||
buf[p++] = '/';
|
||||
break;
|
||||
|
||||
case FDT_END_NODE:
|
||||
if (overflow) {
|
||||
overflow--;
|
||||
break;
|
||||
}
|
||||
do {
|
||||
p--;
|
||||
} while (buf[p-1] != '/');
|
||||
break;
|
||||
|
||||
case FDT_PROP:
|
||||
case FDT_NOP:
|
||||
break;
|
||||
|
||||
default:
|
||||
return -FDT_ERR_BADSTRUCTURE;
|
||||
}
|
||||
}
|
||||
|
||||
if (overflow)
|
||||
return -FDT_ERR_NOSPACE;
|
||||
|
||||
if (p > 1) /* special case so that root path is "/", not "" */
|
||||
p--;
|
||||
buf[p] = '\0';
|
||||
return p;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -136,6 +136,8 @@ static inline void *fdt_getprop_w(void *fdt, int nodeoffset,
|
|||
return (void *)fdt_getprop(fdt, nodeoffset, name, lenp);
|
||||
}
|
||||
|
||||
int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen);
|
||||
|
||||
/* Write-in-place functions */
|
||||
int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
|
||||
const void *val, int len);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue