|
|
|
@ -95,9 +95,12 @@ int mufs_rmpath(struct mufs *fs, const char *path) |
|
|
|
|
struct flash_dev *dev = fs->dev; |
|
|
|
|
char data[1 << dev->log2_block_size]; |
|
|
|
|
struct mufs_dentry *entry, *next; |
|
|
|
|
struct mufs_dirent ent; |
|
|
|
|
struct mufs_tree *tree; |
|
|
|
|
struct mufs_dir *dir; |
|
|
|
|
char *s, *name; |
|
|
|
|
uint32_t va, offset, len; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
if (!(s = mufs_abspath(path))) |
|
|
|
|
return -1; |
|
|
|
@ -105,13 +108,24 @@ int mufs_rmpath(struct mufs *fs, const char *path) |
|
|
|
|
name = strrchr(s, '/'); |
|
|
|
|
*name++ = '\0'; |
|
|
|
|
|
|
|
|
|
if (!(tree = resolve_path(fs, s, NULL))) { |
|
|
|
|
free(s); |
|
|
|
|
return -1; |
|
|
|
|
if (!(tree = resolve_path(fs, s, NULL))) |
|
|
|
|
goto err_free_s; |
|
|
|
|
|
|
|
|
|
if (!(dir = mufs_opendir(fs, s))) |
|
|
|
|
goto err_free_s; |
|
|
|
|
|
|
|
|
|
for (va = dir->va; (ret = mufs_readdir(dir, &ent)) == 0; va = dir->va) { |
|
|
|
|
if (strcmp(ent.path, name) == 0) |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
offset = tree->va & ((UINT32_C(1) << dev->log2_block_size) - 1); |
|
|
|
|
va = align(tree->va, dev->log2_block_size); |
|
|
|
|
mufs_closedir(dir); |
|
|
|
|
|
|
|
|
|
if (ret < 0) |
|
|
|
|
goto err_free_s; |
|
|
|
|
|
|
|
|
|
offset = va & ((UINT32_C(1) << dev->log2_block_size) - 1); |
|
|
|
|
va = align(va, dev->log2_block_size); |
|
|
|
|
|
|
|
|
|
if (mufs_tree_read(tree, data, va, 1 << dev->log2_block_size) == 0) |
|
|
|
|
return -1; |
|
|
|
@ -130,7 +144,12 @@ int mufs_rmpath(struct mufs *fs, const char *path) |
|
|
|
|
if (mufs_tree_write(tree, data, va, 1 << dev->log2_block_size) == 0) |
|
|
|
|
return -1; |
|
|
|
|
|
|
|
|
|
free(s); |
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
err_free_s: |
|
|
|
|
free(s); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int mufs_stat(struct mufs *fs, const char *path, struct mufs_stat *stat) |
|
|
|
|