/* SPDX-License-Identifier: GPL-3.0-or-later */ #include "fstree.h" #include #include tree_node_t *fstree_node_from_path(fstree_t *fs, const char *path) { tree_node_t *n = fs->root; const char *end; size_t len; while (path != NULL && *path != '\0') { if (!S_ISDIR(n->mode)) { errno = ENOTDIR; return NULL; } end = strchrnul(path, '/'); len = end - path; for (n = n->data.dir->children; n != NULL; n = n->next) { if (strncmp(path, n->name, len) != 0) continue; if (n->name[len] != '\0') continue; break; } if (n == NULL) { errno = ENOENT; return NULL; } path = *end ? (end + 1) : end; } return n; }