diff --git a/extmod/vfs.c b/extmod/vfs.c index c968345b86..3ab8261dd2 100644 --- a/extmod/vfs.c +++ b/extmod/vfs.c @@ -43,33 +43,38 @@ // Returns MP_VFS_ROOT for root dir (and then path_out is undefined) and // MP_VFS_NONE for path not found. mp_vfs_mount_t *mp_vfs_lookup_path(const char *path, const char **path_out) { - if (path[0] == '/' && path[1] == 0) { - return MP_VFS_ROOT; - } else if (MP_STATE_VM(vfs_cur) == MP_VFS_ROOT) { - // in root dir - if (path[0] == 0) { - return MP_VFS_ROOT; + if (*path == '/' || MP_STATE_VM(vfs_cur) == MP_VFS_ROOT) { + // an absolute path, or the current volume is root, so search root dir + bool is_abs = 0; + if (*path == '/') { + ++path; + is_abs = 1; } - } else if (*path != '/') { - // a relative path within a mounted device - *path_out = path; - return MP_STATE_VM(vfs_cur); - } - - for (mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table); vfs != NULL; vfs = vfs->next) { - if (strncmp(path, vfs->str, vfs->len) == 0) { - if (path[vfs->len] == '/') { - *path_out = path + vfs->len; - return vfs; - } else if (path[vfs->len] == '\0') { - *path_out = "/"; - return vfs; + for (mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table); vfs != NULL; vfs = vfs->next) { + size_t len = vfs->len - 1; + if (strncmp(path, vfs->str + 1, len) == 0) { + if (path[len] == '/') { + *path_out = path + len; + return vfs; + } else if (path[len] == '\0') { + *path_out = "/"; + return vfs; + } } } + if (*path == '\0') { + // path was "" or "/" so return virtual root + return MP_VFS_ROOT; + } + if (is_abs) { + // path began with / and was not found + return MP_VFS_NONE; + } } - // mount point not found - return MP_VFS_NONE; + // a relative path within a mounted device + *path_out = path; + return MP_STATE_VM(vfs_cur); } // Version of mp_vfs_lookup_path that takes and returns uPy string objects.