mirror of
https://github.com/eledio-devices/thirdparty-littlefs.git
synced 2025-11-01 16:14:13 +01:00
WIP consolidated find/parent scanning functions
This commit is contained in:
286
lfs.c
286
lfs.c
@@ -1415,64 +1415,85 @@ static int lfs_dir_getinfo(lfs_t *lfs, lfs_mdir_t *dir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct lfs_dir_find {
|
struct lfs_dir_find {
|
||||||
const char *name;
|
uint32_t mask;
|
||||||
uint16_t len;
|
lfs_tag_t tag;
|
||||||
int16_t id;
|
const void *buffer;
|
||||||
int16_t tempid;
|
lfs_tag_t foundtag;
|
||||||
uint8_t findtype;
|
lfs_tag_t temptag;
|
||||||
uint8_t tempfindtype;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int lfs_dir_findscan(lfs_t *lfs, void *p, lfs_mattr_t attr) {
|
static int lfs_dir_findscan(lfs_t *lfs, void *p, lfs_mattr_t attr) {
|
||||||
struct lfs_dir_find *find = p;
|
struct lfs_dir_find *find = p;
|
||||||
|
|
||||||
if (lfs_tag_subtype(attr.tag) == LFS_TYPE_NAME &&
|
if ((attr.tag & find->mask) == (find->tag & find->mask)) {
|
||||||
lfs_tag_size(attr.tag) == find->len) {
|
|
||||||
int res = lfs_bd_cmp(lfs, attr.u.d.block, attr.u.d.off,
|
int res = lfs_bd_cmp(lfs, attr.u.d.block, attr.u.d.off,
|
||||||
find->name, find->len);
|
find->buffer, lfs_tag_size(attr.tag));
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
// found a match
|
// found a match
|
||||||
find->tempid = lfs_tag_id(attr.tag);
|
find->temptag = attr.tag;
|
||||||
find->tempfindtype = lfs_tag_type(attr.tag);
|
|
||||||
}
|
}
|
||||||
} else if (lfs_tag_type(attr.tag) == LFS_TYPE_DELETE) {
|
} else if (lfs_tag_type(attr.tag) == LFS_TYPE_DELETE) {
|
||||||
if (lfs_tag_id(attr.tag) == find->tempid) {
|
if (lfs_tag_id(attr.tag) == lfs_tag_id(find->temptag)) {
|
||||||
find->tempid = -1;
|
find->temptag = 0xffffffff;
|
||||||
} else if (lfs_tag_id(attr.tag) < find->tempid) {
|
} else if (lfs_tag_id(find->temptag) < 0x3ff &&
|
||||||
find->tempid -= 1;
|
lfs_tag_id(attr.tag) < lfs_tag_id(find->temptag)) {
|
||||||
|
find->temptag -= lfs_mktag(0, 1, 0);
|
||||||
}
|
}
|
||||||
} else if (lfs_tag_type(attr.tag) == LFS_TYPE_CRC) {
|
} else if (lfs_tag_type(attr.tag) == LFS_TYPE_CRC) {
|
||||||
find->id = find->tempid;
|
find->foundtag = find->temptag;
|
||||||
find->findtype = find->tempfindtype;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lfs_dir_find(lfs_t *lfs, lfs_mdir_t *dir, const lfs_block_t *pair,
|
||||||
|
uint32_t mask, lfs_tag_t tag,
|
||||||
|
const void *buffer, lfs_tag_t *foundtag) {
|
||||||
|
struct lfs_dir_find find = {
|
||||||
|
.mask = mask,
|
||||||
|
.tag = tag,
|
||||||
|
.buffer = buffer,
|
||||||
|
.foundtag = 0xffffffff,
|
||||||
|
.temptag = 0xffffffff,
|
||||||
|
};
|
||||||
|
|
||||||
|
int err = lfs_dir_fetchwith(lfs, dir, pair, lfs_dir_findscan, &find);
|
||||||
|
if (err) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (find.foundtag == 0xffffffff) {
|
||||||
|
return LFS_ERR_NOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
*foundtag = find.foundtag;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO drop others, make this only return id, also make get take in only entry to populate (with embedded tag)
|
// TODO drop others, make this only return id, also make get take in only entry to populate (with embedded tag)
|
||||||
static int lfs_dir_find(lfs_t *lfs, lfs_mdir_t *dir,
|
static int lfs_dir_lookup(lfs_t *lfs, lfs_mdir_t *dir,
|
||||||
const char **path, uint16_t *id, uint8_t *type) {
|
const char **path, uint16_t *id, uint8_t *type) {
|
||||||
lfs_mattr_t attr = {
|
lfs_mattr_t attr = {
|
||||||
.u.pair[0] = lfs->root[0],
|
.u.pair[0] = lfs->root[0],
|
||||||
.u.pair[1] = lfs->root[1],
|
.u.pair[1] = lfs->root[1],
|
||||||
};
|
};
|
||||||
|
|
||||||
struct lfs_dir_find find = {
|
const char *name = *path;
|
||||||
.name = *path,
|
lfs_size_t namelen;
|
||||||
};
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
nextname:
|
nextname:
|
||||||
// skip slashes
|
// skip slashes
|
||||||
find.name += strspn(find.name, "/");
|
name += strspn(name, "/");
|
||||||
find.len = strcspn(find.name, "/");
|
namelen = strcspn(name, "/");
|
||||||
|
|
||||||
// special case for root dir
|
// special case for root dir
|
||||||
if (find.name[0] == '\0') {
|
if (name[0] == '\0') {
|
||||||
// Return ISDIR when we hit root
|
// Return ISDIR when we hit root
|
||||||
// TODO change this to -1 or 0x3ff?
|
// TODO change this to -1 or 0x3ff?
|
||||||
*type = LFS_TYPE_DIR;
|
*type = LFS_TYPE_DIR;
|
||||||
@@ -1480,14 +1501,14 @@ static int lfs_dir_find(lfs_t *lfs, lfs_mdir_t *dir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// skip '.' and root '..'
|
// skip '.' and root '..'
|
||||||
if ((find.len == 1 && memcmp(find.name, ".", 1) == 0) ||
|
if ((namelen == 1 && memcmp(name, ".", 1) == 0) ||
|
||||||
(find.len == 2 && memcmp(find.name, "..", 2) == 0)) {
|
(namelen == 2 && memcmp(name, "..", 2) == 0)) {
|
||||||
find.name += find.len;
|
name += namelen;
|
||||||
goto nextname;
|
goto nextname;
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip if matched by '..' in name
|
// skip if matched by '..' in name
|
||||||
const char *suffix = find.name + find.len;
|
const char *suffix = name + namelen;
|
||||||
lfs_size_t sufflen;
|
lfs_size_t sufflen;
|
||||||
int depth = 1;
|
int depth = 1;
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -1500,7 +1521,7 @@ static int lfs_dir_find(lfs_t *lfs, lfs_mdir_t *dir,
|
|||||||
if (sufflen == 2 && memcmp(suffix, "..", 2) == 0) {
|
if (sufflen == 2 && memcmp(suffix, "..", 2) == 0) {
|
||||||
depth -= 1;
|
depth -= 1;
|
||||||
if (depth == 0) {
|
if (depth == 0) {
|
||||||
find.name = suffix + sufflen;
|
name = suffix + sufflen;
|
||||||
goto nextname;
|
goto nextname;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1511,21 +1532,22 @@ static int lfs_dir_find(lfs_t *lfs, lfs_mdir_t *dir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// update what we've found
|
// update what we've found
|
||||||
*path = find.name;
|
*path = name;
|
||||||
|
|
||||||
// find path
|
// find path
|
||||||
while (true) {
|
while (true) {
|
||||||
//printf("checking %d %d for %s\n", attr.u.pair[0], attr.u.pair[1], *path);
|
lfs_tag_t foundtag = -1;
|
||||||
find.id = -1;
|
int err = lfs_dir_find(lfs, dir, attr.u.pair,
|
||||||
find.tempid = -1;
|
0x7c000fff, lfs_mktag(LFS_TYPE_NAME, 0, namelen),
|
||||||
int err = lfs_dir_fetchwith(lfs, dir, attr.u.pair,
|
name, &foundtag);
|
||||||
lfs_dir_findscan, &find);
|
if (err && err != LFS_ERR_NOENT) {
|
||||||
if (err) {
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (find.id >= 0) {
|
if (err != LFS_ERR_NOENT) {
|
||||||
// found it
|
// found it
|
||||||
|
*id = lfs_tag_id(foundtag);
|
||||||
|
*type = lfs_tag_type(foundtag);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1537,17 +1559,15 @@ static int lfs_dir_find(lfs_t *lfs, lfs_mdir_t *dir,
|
|||||||
attr.u.pair[1] = dir->tail[1];
|
attr.u.pair[1] = dir->tail[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
*id = find.id;
|
name += namelen;
|
||||||
*type = find.findtype;
|
name += strspn(name, "/");
|
||||||
find.name += find.len;
|
if (name[0] == '\0') {
|
||||||
find.name += strspn(find.name, "/");
|
|
||||||
if (find.name[0] == '\0') {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// don't continue on if we didn't hit a directory
|
// don't continue on if we didn't hit a directory
|
||||||
// TODO update with what's on master?
|
// TODO update with what's on master?
|
||||||
if (find.findtype != LFS_TYPE_DIR) {
|
if (*type != LFS_TYPE_DIR) {
|
||||||
return LFS_ERR_NOTDIR;
|
return LFS_ERR_NOTDIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1555,7 +1575,7 @@ static int lfs_dir_find(lfs_t *lfs, lfs_mdir_t *dir,
|
|||||||
// TODO would this mean more code?
|
// TODO would this mean more code?
|
||||||
// grab the entry data
|
// grab the entry data
|
||||||
int err = lfs_dir_getentry(lfs, dir, 0x7c3ff000,
|
int err = lfs_dir_getentry(lfs, dir, 0x7c3ff000,
|
||||||
lfs_mktag(LFS_TYPE_STRUCT, find.id, 0), &attr);
|
lfs_mktag(LFS_TYPE_STRUCT, *id, 0), &attr);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -1573,7 +1593,7 @@ int lfs_mkdir(lfs_t *lfs, const char *path) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lfs_mdir_t cwd;
|
lfs_mdir_t cwd;
|
||||||
int err = lfs_dir_find(lfs, &cwd, &path, &(uint16_t){0}, &(uint8_t){0});
|
int err = lfs_dir_lookup(lfs, &cwd, &path, &(uint16_t){0}, &(uint8_t){0});
|
||||||
if (err != LFS_ERR_NOENT || strchr(path, '/') != NULL) {
|
if (err != LFS_ERR_NOENT || strchr(path, '/') != NULL) {
|
||||||
if (!err || err == LFS_ERR_ISDIR) {
|
if (!err || err == LFS_ERR_ISDIR) {
|
||||||
return LFS_ERR_EXIST;
|
return LFS_ERR_EXIST;
|
||||||
@@ -1626,7 +1646,7 @@ int lfs_mkdir(lfs_t *lfs, const char *path) {
|
|||||||
int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) {
|
int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) {
|
||||||
uint16_t id;
|
uint16_t id;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
int err = lfs_dir_find(lfs, &dir->m, &path, &id, &type);
|
int err = lfs_dir_lookup(lfs, &dir->m, &path, &id, &type);
|
||||||
if (err && err != LFS_ERR_ISDIR) {
|
if (err && err != LFS_ERR_ISDIR) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -1979,7 +1999,7 @@ int lfs_file_open(lfs_t *lfs, lfs_file_t *file,
|
|||||||
lfs_mdir_t cwd;
|
lfs_mdir_t cwd;
|
||||||
uint16_t id;
|
uint16_t id;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
int err = lfs_dir_find(lfs, &cwd, &path, &id, &type);
|
int err = lfs_dir_lookup(lfs, &cwd, &path, &id, &type);
|
||||||
if (err && (err != LFS_ERR_NOENT || strchr(path, '/') != NULL) &&
|
if (err && (err != LFS_ERR_NOENT || strchr(path, '/') != NULL) &&
|
||||||
err != LFS_ERR_ISDIR) {
|
err != LFS_ERR_ISDIR) {
|
||||||
return err;
|
return err;
|
||||||
@@ -2655,7 +2675,7 @@ int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info) {
|
|||||||
lfs_mdir_t cwd;
|
lfs_mdir_t cwd;
|
||||||
uint16_t id;
|
uint16_t id;
|
||||||
// TODO pass to getinfo?
|
// TODO pass to getinfo?
|
||||||
int err = lfs_dir_find(lfs, &cwd, &path, &id, &(uint8_t){0});
|
int err = lfs_dir_lookup(lfs, &cwd, &path, &id, &(uint8_t){0});
|
||||||
if (err && err != LFS_ERR_ISDIR) {
|
if (err && err != LFS_ERR_ISDIR) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -2687,7 +2707,7 @@ int lfs_remove(lfs_t *lfs, const char *path) {
|
|||||||
|
|
||||||
uint16_t id;
|
uint16_t id;
|
||||||
uint8_t type;
|
uint8_t type;
|
||||||
err = lfs_dir_find(lfs, &cwd, &path, &id, &type);
|
err = lfs_dir_lookup(lfs, &cwd, &path, &id, &type);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -2749,7 +2769,7 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
|
|||||||
lfs_mdir_t oldcwd;
|
lfs_mdir_t oldcwd;
|
||||||
uint16_t oldid;
|
uint16_t oldid;
|
||||||
uint8_t oldtype;
|
uint8_t oldtype;
|
||||||
int err = lfs_dir_find(lfs, &oldcwd, &oldpath, &oldid, &oldtype);
|
int err = lfs_dir_lookup(lfs, &oldcwd, &oldpath, &oldid, &oldtype);
|
||||||
if (err) {
|
if (err) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -2758,7 +2778,7 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
|
|||||||
lfs_mdir_t newcwd;
|
lfs_mdir_t newcwd;
|
||||||
uint16_t newid;
|
uint16_t newid;
|
||||||
uint8_t prevtype;
|
uint8_t prevtype;
|
||||||
err = lfs_dir_find(lfs, &newcwd, &newpath, &newid, &prevtype);
|
err = lfs_dir_lookup(lfs, &newcwd, &newpath, &newid, &prevtype);
|
||||||
if (err && err != LFS_ERR_NOENT) {
|
if (err && err != LFS_ERR_NOENT) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -2883,7 +2903,7 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
|
|||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// lfs_mattr_t entry;
|
// lfs_mattr_t entry;
|
||||||
// err = lfs_dir_find(lfs, &cwd, &entry, &path);
|
// err = lfs_dir_lookup(lfs, &cwd, &entry, &path);
|
||||||
// if (err) {
|
// if (err) {
|
||||||
// return err;
|
// return err;
|
||||||
// }
|
// }
|
||||||
@@ -2900,7 +2920,7 @@ int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) {
|
|||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// lfs_mattr_t entry;
|
// lfs_mattr_t entry;
|
||||||
// err = lfs_dir_find(lfs, &cwd, &entry, &path);
|
// err = lfs_dir_lookup(lfs, &cwd, &entry, &path);
|
||||||
// if (err) {
|
// if (err) {
|
||||||
// return err;
|
// return err;
|
||||||
// }
|
// }
|
||||||
@@ -3331,168 +3351,42 @@ static int lfs_pred(lfs_t *lfs, const lfs_block_t pair[2], lfs_mdir_t *pdir) {
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
static int lfs_pred(lfs_t *lfs, const lfs_block_t dir[2], lfs_mdir_t *pdir) {
|
|
||||||
if (lfs_pairisnull(lfs->root)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// iterate directories
|
|
||||||
int err = lfs_dir_fetch(lfs, pdir, (const lfs_block_t[2]){0, 1});
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!lfs_pairisnull(pdir->d.tail)) {
|
|
||||||
if (lfs_paircmp(pdir->d.tail, dir) == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = lfs_dir_fetch(lfs, pdir, pdir->d.tail);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
// TODO combine parentscan and findscan?
|
|
||||||
struct lfs_dir_parentscan {
|
|
||||||
lfs_block_t pair[2];
|
|
||||||
int16_t id;
|
|
||||||
int16_t tempid;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int lfs_parentscan(lfs_t *lfs, void *p, lfs_mattr_t attr) {
|
|
||||||
struct lfs_dir_parentscan *parentscan = p;
|
|
||||||
|
|
||||||
if (lfs_tag_type(attr.tag) == LFS_STRUCT_DIR) {
|
|
||||||
int err = lfs_bd_read(lfs, attr.u.d.block, attr.u.d.off,
|
|
||||||
&attr.u, sizeof(attr.u));
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lfs_paircmp(attr.u.pair, parentscan->pair) == 0) {
|
|
||||||
// found a match
|
|
||||||
parentscan->tempid = lfs_tag_id(attr.tag);
|
|
||||||
}
|
|
||||||
} else if (lfs_tag_type(attr.tag) == LFS_TYPE_DELETE) {
|
|
||||||
if (lfs_tag_id(attr.tag) == parentscan->tempid) {
|
|
||||||
parentscan->tempid = -1;
|
|
||||||
} else if (lfs_tag_id(attr.tag) < parentscan->tempid) {
|
|
||||||
parentscan->tempid -= 1;
|
|
||||||
}
|
|
||||||
} else if (lfs_tag_type(attr.tag) == LFS_TYPE_CRC) {
|
|
||||||
parentscan->id = parentscan->tempid;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lfs_parent(lfs_t *lfs, const lfs_block_t pair[2],
|
static int lfs_parent(lfs_t *lfs, const lfs_block_t pair[2],
|
||||||
lfs_mdir_t *parent, lfs_mattr_t *attr) {
|
lfs_mdir_t *parent, lfs_mattr_t *attr) {
|
||||||
|
// search for both orderings so we can reuse the find function
|
||||||
|
lfs_block_t child[2] = {pair[0], pair[1]};
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
// iterate over all directory directory entries
|
// iterate over all directory directory entries
|
||||||
parent->tail[0] = 0;
|
parent->tail[0] = 0;
|
||||||
parent->tail[1] = 1;
|
parent->tail[1] = 1;
|
||||||
while (!lfs_pairisnull(parent->tail)) {
|
while (!lfs_pairisnull(parent->tail)) {
|
||||||
struct lfs_dir_parentscan parentscan = {
|
lfs_tag_t foundtag = -1;
|
||||||
.pair[0] = pair[0],
|
int err = lfs_dir_find(lfs, parent, parent->tail,
|
||||||
.pair[1] = pair[1],
|
0x7fc00fff, lfs_mktag(LFS_STRUCT_DIR, 0, sizeof(child)),
|
||||||
.id = -1,
|
child, &foundtag);
|
||||||
.tempid = -1,
|
|
||||||
};
|
|
||||||
|
|
||||||
int err = lfs_dir_fetchwith(lfs, parent, parent->tail,
|
|
||||||
lfs_parentscan, &parentscan);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parentscan.id != -1) {
|
|
||||||
int err = lfs_dir_getentry(lfs, parent, 0x7ffff000,
|
|
||||||
lfs_mktag(LFS_STRUCT_DIR, parentscan.id, 0), attr);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
//static int lfs_parent(lfs_t *lfs, const lfs_block_t pair[2],
|
|
||||||
// lfs_mdir_t *parent, lfs_mattr_t *attr) {
|
|
||||||
// // iterate over all directory directory entries
|
|
||||||
// parent->tail[0] = 0;
|
|
||||||
// parent->tail[1] = 1;
|
|
||||||
// while (!lfs_pairisnull(parent->tail)) {
|
|
||||||
// int err = lfs_dir_fetch(lfs, parent, parent->tail);
|
|
||||||
// if (err) {
|
|
||||||
// return err;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // TODO make this O(n) by using fetchwith to match the pointers
|
|
||||||
// for (uint16_t id = 0; id < parent->count; id++) {
|
|
||||||
// int err = lfs_dir_getentry(lfs, parent, 0x43dff000,
|
|
||||||
// lfs_mktag(LFS_STRUCT_DIR, id, 0), attr);
|
|
||||||
// if (err) {
|
|
||||||
// if (err == LFS_ERR_NOENT) {
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
// return err;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (lfs_paircmp(attr->u.pair, pair) == 0) {
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return false;
|
|
||||||
//}
|
|
||||||
/*
|
|
||||||
static int lfs_parent(lfs_t *lfs, const lfs_block_t dir[2],
|
|
||||||
lfs_mdir_t *parent, lfs_mattr_t *attr) {
|
|
||||||
if (lfs_pairisnull(lfs->root)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
parent->d.tail[0] = 0;
|
|
||||||
parent->d.tail[1] = 1;
|
|
||||||
|
|
||||||
// iterate over all directory directory entries
|
|
||||||
while (!lfs_pairisnull(parent->d.tail)) {
|
|
||||||
int err = lfs_dir_fetch(lfs, parent, parent->d.tail);
|
|
||||||
if (err) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
err = lfs_dir_next(lfs, parent, attr);
|
|
||||||
if (err && err != LFS_ERR_NOENT) {
|
if (err && err != LFS_ERR_NOENT) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err == LFS_ERR_NOENT) {
|
if (err != LFS_ERR_NOENT) {
|
||||||
break;
|
// found our parent
|
||||||
|
int err = lfs_dir_getentry(lfs, parent,
|
||||||
|
0x7ffff000, foundtag, attr);
|
||||||
|
if (err) {
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((0x70 & attr->d.type) == LFS_STRUCT_DIR) &&
|
|
||||||
lfs_paircmp(attr->d.u.dir, dir) == 0) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lfs_pairswap(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
// TODO rename to lfs_dir_relocate?
|
// TODO rename to lfs_dir_relocate?
|
||||||
static int lfs_relocate(lfs_t *lfs,
|
static int lfs_relocate(lfs_t *lfs,
|
||||||
@@ -3725,7 +3619,7 @@ int lfs_deorphan(lfs_t *lfs) {
|
|||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// lfs_mattr_t entry;
|
// lfs_mattr_t entry;
|
||||||
// err = lfs_dir_find(lfs, &cwd, &entry, &path);
|
// err = lfs_dir_lookup(lfs, &cwd, &entry, &path);
|
||||||
// if (err) {
|
// if (err) {
|
||||||
// return err;
|
// return err;
|
||||||
// }
|
// }
|
||||||
|
|||||||
Reference in New Issue
Block a user