| 540 | } |
| 541 | |
| 542 | int fdt_get_path(const void *fdt, int nodeoffset, char *buf, int buflen) |
| 543 | { |
| 544 | int pdepth = 0, p = 0; |
| 545 | int offset, depth, namelen; |
| 546 | const char *name; |
| 547 | |
| 548 | FDT_RO_PROBE(fdt); |
| 549 | |
| 550 | if (buflen < 2) |
| 551 | return -FDT_ERR_NOSPACE; |
| 552 | |
| 553 | for (offset = 0, depth = 0; |
| 554 | (offset >= 0) && (offset <= nodeoffset); |
| 555 | offset = fdt_next_node(fdt, offset, &depth)) { |
| 556 | while (pdepth > depth) { |
| 557 | do { |
| 558 | p--; |
| 559 | } while (buf[p-1] != '/'); |
| 560 | pdepth--; |
| 561 | } |
| 562 | |
| 563 | if (pdepth >= depth) { |
| 564 | name = fdt_get_name(fdt, offset, &namelen); |
| 565 | if (!name) |
| 566 | return namelen; |
| 567 | if ((p + namelen + 1) <= buflen) { |
| 568 | memcpy(buf + p, name, namelen); |
| 569 | p += namelen; |
| 570 | buf[p++] = '/'; |
| 571 | pdepth++; |
| 572 | } |
| 573 | } |
| 574 | |
| 575 | if (offset == nodeoffset) { |
| 576 | if (pdepth < (depth + 1)) |
| 577 | return -FDT_ERR_NOSPACE; |
| 578 | |
| 579 | if (p > 1) /* special case so that root path is "/", not "" */ |
| 580 | p--; |
| 581 | buf[p] = '\0'; |
| 582 | return 0; |
| 583 | } |
| 584 | } |
| 585 | |
| 586 | if ((offset == -FDT_ERR_NOTFOUND) || (offset >= 0)) |
| 587 | return -FDT_ERR_BADOFFSET; |
| 588 | else if (offset == -FDT_ERR_BADOFFSET) |
| 589 | return -FDT_ERR_BADSTRUCTURE; |
| 590 | |
| 591 | return offset; /* error from fdt_next_node() */ |
| 592 | } |
| 593 | |
| 594 | int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset, |
| 595 | int supernodedepth, int *nodedepth) |
no test coverage detected