mufs: locate directory entry properly in mufs_rmpath()

tags/0.1.0
S.J.R. van Schaik 8 years ago
parent 14a93ab881
commit ab599e7c8b
  1. 29
      source/fs/mufs/path.c

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

Loading…
Cancel
Save