#include #include #include #include #include #include #include #include #include "dir.h" #include "path.h" #include "tree.h" int mufs_mkpath(struct mufs *fs, const char *path, unsigned type) { struct mufs_stat stat; struct mufs_dirent dirent; struct mufs_tree *tree; size_t len; char *s; char *name; if (!path || *path == '\0') return -1; if (!(s = mufs_abspath(path))) return -1; /* TODO: already exists. */ if (resolve_path(fs, s, NULL)) { free(s); return 0; } name = strrchr(s, '/'); *name++ = '\0'; if (*s == '\0') s = "/"; if (*name == '\0') return -1; if (!(tree = resolve_path(fs, s, &stat)) || stat.type != MUFS_DIR) return -1; len = min(strlen(name), sizeof(dirent.path) - 1); memcpy(dirent.path, name, len); dirent.path[len] = '\0'; dirent.type = type; dirent.tree.fs = fs; dirent.tree.file_size = 0; dirent.tree.root = 0; dirent.tree.depth = 0; if (!is_aligned(tree->file_size, fs->dev->log2_block_size) && write_dirent(tree, tree->file_size, &dirent) > 0) return 0; if (write_dirent(tree, align_up(tree->file_size, fs->dev->log2_block_size), &dirent) > 0) return 0; return -1; } int mufs_stat(struct mufs *fs, const char *path, struct mufs_stat *stat) { if (!resolve_path(fs, path, stat)) return -1; return 0; }